agnes-the-ai-analyst/src/repositories/table_registry.py
ZdenekSrotyr 79b0b66f2e feat: add DuckDB state layer with all repository classes
- src/db.py: schema with 14 tables matching design spec
- 7 repository classes: SyncState, Users, Knowledge, Audit,
  Telegram, PendingCode, Script, TableRegistry, Profiles
- 37 tests covering all CRUD operations
2026-03-27 15:06:55 +01:00

47 lines
1.9 KiB
Python

"""Repository for table registry."""
from datetime import datetime, timezone
from typing import Any, Optional, List, Dict
import duckdb
class TableRegistryRepository:
def __init__(self, conn: duckdb.DuckDBPyConnection):
self.conn = conn
def register(
self, id: str, name: str, folder: Optional[str] = None,
sync_strategy: Optional[str] = None, primary_key: Optional[str] = None,
description: Optional[str] = None, registered_by: Optional[str] = None,
) -> None:
now = datetime.now(timezone.utc)
self.conn.execute(
"""INSERT INTO table_registry (id, name, folder, sync_strategy,
primary_key, description, registered_by, registered_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (id) DO UPDATE SET
name = excluded.name, folder = excluded.folder,
sync_strategy = excluded.sync_strategy, primary_key = excluded.primary_key,
description = excluded.description, registered_at = excluded.registered_at""",
[id, name, folder, sync_strategy, primary_key, description, registered_by, now],
)
def unregister(self, table_id: str) -> None:
self.conn.execute("DELETE FROM table_registry WHERE id = ?", [table_id])
def get(self, table_id: str) -> Optional[Dict[str, Any]]:
result = self.conn.execute(
"SELECT * FROM table_registry WHERE id = ?", [table_id]
).fetchone()
if not result:
return None
columns = [desc[0] for desc in self.conn.description]
return dict(zip(columns, result))
def list_all(self) -> List[Dict[str, Any]]:
results = self.conn.execute("SELECT * FROM table_registry ORDER BY name").fetchall()
if not results:
return []
columns = [desc[0] for desc in self.conn.description]
return [dict(zip(columns, row)) for row in results]