| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- """Formal PostgreSQL session helpers for the creation-knowledge state store."""
- from __future__ import annotations
- from contextlib import contextmanager
- from typing import Any, Iterator
- import psycopg2
- import psycopg2.extras
- from core.config import CreationDbConfig
- psycopg2.extras.register_uuid()
- def connect(config: CreationDbConfig) -> Any:
- """Open a PostgreSQL connection scoped to the formal state schema."""
- return psycopg2.connect(
- host=config.host,
- port=config.port,
- user=config.user,
- password=config.password,
- dbname=config.database,
- connect_timeout=config.timeout,
- application_name=config.application_name,
- options=f"-c search_path={config.schema},public",
- )
- @contextmanager
- def transaction(config: CreationDbConfig) -> Iterator[Any]:
- """Yield a connection and commit or roll back around the caller's work."""
- conn = connect(config)
- try:
- yield conn
- conn.commit()
- except Exception:
- conn.rollback()
- raise
- finally:
- conn.close()
- def fetch_all(
- config: CreationDbConfig,
- sql: str,
- params: tuple[Any, ...] = (),
- ) -> list[dict[str, Any]]:
- """Small read helper for diagnostics and repository smoke checks."""
- conn = connect(config)
- try:
- with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cur:
- cur.execute(sql, params)
- return [dict(row) for row in cur.fetchall()]
- finally:
- conn.close()
|