#pragma once #include #include struct GraphData; namespace ge { // Persistencia de posiciones de nodos en `graph_explorer.db` (SQLite junto al // exe). Una unica tabla: // // layouts(graph_hash TEXT, node_id TEXT, x REAL, y REAL, // pinned INTEGER, updated_at INTEGER, // PRIMARY KEY(graph_hash, node_id)) // // `graph_hash` se calcula a partir del path absoluto del input (operations.db // o similar). Mismo input → mismas posiciones recuperables. `node_id` es // el `user_data` del nodo formateado en hex (lo que `graph_load_from_operations` // rellena con el FNV1a del id de la BD origen). // Devuelve un hash estable del path canonico. 0 si path es null/vacio. uint64_t compute_graph_hash(const char* path); // Asegura que la BD existe y la tabla esta creada. Devuelve true en exito. bool layout_store_open(const char* db_path); void layout_store_close(); // Guarda las posiciones (y NF_PINNED) de todos los nodos del grafo bajo la // clave `graph_hash`. UPSERT por (graph_hash, node_id). Devuelve el numero // de filas escritas (>= 0). En error, devuelve -1. int layout_store_save(uint64_t graph_hash, const GraphData& graph); // Aplica las posiciones guardadas al grafo. Recorre los nodos y, para cada // uno cuyo `user_data` exista en la tabla con el hash dado, sobrescribe // `x`, `y`, y los flags `NF_PINNED`. Nodos sin entrada se quedan tal cual. // Devuelve el numero de nodos actualizados. int layout_store_load(uint64_t graph_hash, GraphData& graph); } // namespace ge