lllin000_PaperForge/paperforge/memory/db.py
Research Assistant 2b552be9e6 feat: runtime contract hardening + skill/command truth alignment (Package A+B)
Atomic snapshots, canonical index mutation serialization, sync post-clean truth,
plugin path config-awareness, embed stop signal honesty, full snapshot bootstrap,
pf_ prefix unification, workflow command/lifecycle/path corrections,
mechanical/cognitive route separation with unknown-command guard.
2026-05-16 22:38:43 +08:00

35 lines
1.1 KiB
Python

from __future__ import annotations
import sqlite3
from pathlib import Path
from paperforge.config import paperforge_paths
def get_memory_db_path(vault: Path) -> Path:
"""Return the absolute path to paperforge.db."""
paths = paperforge_paths(vault)
index_path = paths.get("index")
if not index_path:
raise FileNotFoundError("index path not configured")
return index_path.parent / "paperforge.db"
def get_connection(db_path: Path, read_only: bool = False) -> sqlite3.Connection:
"""Open a SQLite connection to paperforge.db with WAL mode.
Args:
db_path: Path to paperforge.db.
read_only: If True, open in read-only mode (for queries).
"""
if read_only:
uri = "file:" + db_path.as_posix() + "?mode=ro"
conn = sqlite3.connect(uri, uri=True)
else:
db_path.parent.mkdir(parents=True, exist_ok=True)
conn = sqlite3.connect(str(db_path))
conn.row_factory = sqlite3.Row
if not read_only:
conn.execute("PRAGMA journal_mode=WAL;")
conn.execute("PRAGMA foreign_keys=ON;")
return conn