from __future__ import annotations import os import sqlite3 from contextlib import contextmanager from pathlib import Path from typing import Iterator DEFAULT_DB_PATH = Path.home() / ".local" / "share" / "jarca" / "ledger.sqlite3" def resolve_db_path(db_path: str | None = None) -> Path: raw = db_path or os.getenv("JARCA_LEDGER_DB_PATH") or str(DEFAULT_DB_PATH) return Path(raw).expanduser().resolve() def connect(db_path: str | None = None) -> sqlite3.Connection: path = resolve_db_path(db_path) path.parent.mkdir(parents=True, exist_ok=True) conn = sqlite3.connect(path) conn.row_factory = sqlite3.Row conn.execute("PRAGMA foreign_keys=ON") return conn @contextmanager def db(db_path: str | None = None) -> Iterator[sqlite3.Connection]: from .migrations import init_db init_db(db_path) conn = connect(db_path) try: yield conn conn.commit() except Exception: conn.rollback() raise finally: conn.close()