feat(entity_ops): EntityRecord + JSON helpers + load/update/list_tags
Issue 0008 — capa de datos para el Inspector editable:
- struct MetadataField {key, value_str, is_string} — pares de la
columna metadata. is_string distingue '"foo"' de literal (number,
bool). EntityRecord agrupa los campos editables (id, name, type_ref,
description, status, tags[], metadata[]).
- entity_load_full: SELECT name/type/desc/status/tags/metadata, parsea
JSON plano con un parser propio (evita arrastrar libs). Soporta
escapes basicos (\n \t \" \\\\ etc.; \uXXXX → '?').
- entity_update: un solo UPDATE con tags+metadata serializados a JSON.
Toca updated_at.
- entity_list_distinct_tags: usa json_each (SQLITE_ENABLE_JSON1) para
enumerar tags distintas — autocomplete del Inspector.
- Parser JSON plano: parse_string_array, parse_flat_object. Solo
objetos planos (sin nested objects/arrays excepto consumirlos como
literal). Suficiente para el caso del Inspector.
- Writer JSON: build_string_array, build_flat_object con escape
apropiado. Si is_string=false pero el valor no es literal valido,
se re-emite como string para no producir JSON invalido.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,8 @@
|
||||
#include <cstddef>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
// Operaciones CRUD sobre operations.db (entities + relations) y deteccion
|
||||
// heuristica de tipo a partir de texto libre. Pensado para que la toolbar y
|
||||
@@ -58,6 +60,45 @@ bool entity_get_notes(const char* db_path, const char* id, std::string* out);
|
||||
// Sobrescribe `notes` con el contenido proporcionado. Toca `updated_at`.
|
||||
bool entity_set_notes(const char* db_path, const char* id, const char* notes);
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Inspector editable (issue 0008)
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Un campo de la columna `metadata` JSON. `is_string=true` se emite como
|
||||
// "..." en JSON; false se emite como literal (number/bool/null). El parser
|
||||
// rellena esto al leer; el caller puede sobreescribirlo basado en el schema
|
||||
// del tipo antes de guardar.
|
||||
struct MetadataField {
|
||||
std::string key;
|
||||
std::string value_str;
|
||||
bool is_string = true;
|
||||
};
|
||||
|
||||
// Snapshot completo de los campos editables de una entidad. No incluye
|
||||
// `notes` (panel separado) ni `created_at` (no editable).
|
||||
struct EntityRecord {
|
||||
std::string id;
|
||||
std::string name;
|
||||
std::string type_ref;
|
||||
std::string description;
|
||||
std::string status; // active|stale|corrupted|archived
|
||||
std::vector<std::string> tags;
|
||||
std::vector<MetadataField> metadata; // orden preservado del JSON original
|
||||
};
|
||||
|
||||
// Carga el snapshot editable de la entidad. Devuelve false si no existe o
|
||||
// SQLite falla. Tags y metadata se parsean desde JSON.
|
||||
bool entity_load_full(const char* db_path, const char* id, EntityRecord* out);
|
||||
|
||||
// Persiste el snapshot. Toca `updated_at`. Tags y metadata se serializan a
|
||||
// JSON. Devuelve false si SQLite falla.
|
||||
bool entity_update(const char* db_path, const EntityRecord& rec);
|
||||
|
||||
// Lista las tags distintas en uso en toda la BD (para autocomplete del
|
||||
// chip-input del Inspector). Sin orden particular.
|
||||
bool entity_list_distinct_tags(const char* db_path,
|
||||
std::vector<std::string>* out);
|
||||
|
||||
// Mapa user_data (FNV1a hash) -> sql id. Se reconstruye despues de cada
|
||||
// carga del grafo (graph_sources usa FNV1a sobre id como user_data).
|
||||
struct EntityIndex {
|
||||
|
||||
Reference in New Issue
Block a user