- Add app/db/ abstraction layer: Backend enum, DbConn wrapper, dialect helper (q() for ? vs %s paramstyle), get_conn(), tenant_id() - Auto-detect backend from DATABASE_URL; SQLite remains default when unset — no config change for local deployments - Add tenant_id column to all three logical DBs (main, context, incidents); idempotent ALTER TABLE migration runs before schema scripts on existing DBs - All INSERTs inject tenant_id; SELECTs use (tenant_id = ? OR tenant_id = '') for backward compat with pre-namespacing rows - Add docker-compose.yml with named volume turnstone_pgdata (survives rebuilds) and optional external Postgres support via DATABASE_URL override - Add scripts/migrate_sqlite_to_postgres.py — one-shot idempotent migration for existing SQLite data; ON CONFLICT DO NOTHING for safe re-runs - Fix SSH glean path in pipeline.py to use ensure_schema + get_conn (was still using raw sqlite3.connect + old _SCHEMA without tenant_id) - Fix FTS5 JOIN ambiguity: qualify repeat_count as f.repeat_count in search - Update all tests to use ensure_*_schema fixtures; add row_factory where needed - 394/394 tests passing Closes: #42 Closes: #50
20 lines
463 B
Python
20 lines
463 B
Python
"""Backend detection — SQLITE (default) or POSTGRES based on DATABASE_URL."""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from enum import Enum
|
|
|
|
|
|
class Backend(Enum):
|
|
SQLITE = "sqlite"
|
|
POSTGRES = "postgres"
|
|
|
|
|
|
def _detect() -> Backend:
|
|
url = os.environ.get("DATABASE_URL", "")
|
|
if url.startswith(("postgresql://", "postgres://", "postgresql+psycopg://")):
|
|
return Backend.POSTGRES
|
|
return Backend.SQLITE
|
|
|
|
|
|
BACKEND: Backend = _detect()
|