src/db/schema.sql · index.ts · queries.ts · sqlite-adapter.ts · wal-valve.tsCodeGraph 用 Node 內建的 node:sqlite(DatabaseSync)——真正的 SQLite,WAL + FTS5,穿一層 thin better-sqlite3 形狀的 adapter。bundle runtime 永遠帶 Node ≥22.5,所以 node:sqlite 一定可用:沒有原生 build step、沒有 wasm fallback。codegraph status 會回報 live backend(node-sqlite,也是唯一 backend)。資料放 .codegraph/codegraph.db。
nodes 表欄位範例:id(PK)、kind、name、qualified_name、file_path、language、start_line/end_line/start_column/end_column、docstring、signature、visibility、is_exported/is_async/is_static/is_abstract、decorators(JSON)、type_parameters(JSON)、return_type、updated_at。
edges:source → target、kind、metadata(JSON)。另有 schema_versions 追蹤 migration。
initialize 建 schema + 建 FTS 表 + 插 schema_versions;open 開既有庫並跑 migration。WAL 模式設定(journal_mode=WAL)在這裡——這就是「並行讀取永不阻塞在 writer」的來源。`isReplacedOnDisk()` 是 reopenIfReplaced(src/index.ts)偵測「.codegraph 被刪重建」用的。
所有底層 SQL(找節點、找邊、unresolved refs、metadata、FTS 查詢…)集中在此,用 prepared statements 快取。setProjectNameTokens(把專案名從搜尋 ranking 降權,因為它不是 symbol)也在這裡——對應 src/index.ts 的 wireLayers。
indexAll/sync 大寫入時,把 autocheckpoint interval 設 0(關掉同步內建 checkpoint),改用 valve 在 worker thread 做 PASSIVE checkpoint——writer 永遠不卡。foldNow() 在「大量寫入後、主執行緒要讀之前」強制折疊(收尾)。這解決了 #1231 的病理:WAL 在 default 1000-page interval 下重寫熱頁,HDD 上 bulk index 從 19 分鐘變 45 秒。
FTS5 表讓 codegraph query / searchNodes 能依名稱/片段瞬間搜尋。indexAll 用 beginBulkNodeLoad()/endBulkNodeLoad():大量插入期間先丟掉 per-row FTS trigger,最後從 nodes 表重建一次——把插入成本從每行都同步改成一次重建。crash 在窗口內的下次 open 時自癒。
Index Statistics:
Files: 570
Nodes: 12,733
Edges: 44,903
DB Size: 53.30 MB
Backend: node:sqlite — built-in (full WAL)
Journal: wal