Fix blocking I/O on event loop, cache graphviz, optimize DB sync
Move all save_json/load_json/sync_to_db/DB calls off the event loop with asyncio.to_thread to prevent UI freezes. Cache graphviz SVG by DOT source hash (bounded LRU of 20). Replace DELETE-all/re-INSERT in sync_to_db with UPSERT + targeted DELETE. Add DB indexes, COUNT query, and reduce graph poll interval to 0.5s. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -47,6 +47,9 @@ CREATE TABLE IF NOT EXISTS history_trees (
|
||||
tree_data TEXT NOT NULL DEFAULT '{}',
|
||||
updated_at REAL NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_data_files_project_id ON data_files(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_sequences_data_file_id ON sequences(data_file_id);
|
||||
"""
|
||||
|
||||
|
||||
@@ -146,6 +149,14 @@ class ProjectDB:
|
||||
).fetchall()
|
||||
return [dict(r) for r in rows]
|
||||
|
||||
def count_data_files(self, project_id: int) -> int:
|
||||
"""Return the number of data files for a project."""
|
||||
row = self.conn.execute(
|
||||
"SELECT COUNT(*) AS cnt FROM data_files WHERE project_id = ?",
|
||||
(project_id,),
|
||||
).fetchone()
|
||||
return row["cnt"]
|
||||
|
||||
def get_data_file(self, project_id: int, name: str) -> dict | None:
|
||||
row = self.conn.execute(
|
||||
"SELECT id, project_id, name, data_type, top_level, created_at, updated_at "
|
||||
|
||||
Reference in New Issue
Block a user