refactor(db)!: finalize pooled WNDB v2 migration
This commit is contained in:
@@ -5,9 +5,9 @@ from contextvars import ContextVar, Token
|
||||
from dataclasses import dataclass
|
||||
from typing import Iterator
|
||||
|
||||
from psycopg.conninfo import make_conninfo
|
||||
from psycopg.conninfo import conninfo_to_dict, make_conninfo
|
||||
|
||||
from app.core.config import get_pgconn_string, get_timescaledb_pgconn_string
|
||||
from app.core.config import get_pgconn_string, get_timescaledb_pgconn_string, settings
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -16,6 +16,17 @@ class ActiveProjectRouting:
|
||||
business_dsn: str
|
||||
timescale_dsn: str | None = None
|
||||
|
||||
@property
|
||||
def business_database_name(self) -> str:
|
||||
"""Return the physical BizDB name selected by metadata routing."""
|
||||
database_name = conninfo_to_dict(self.business_dsn).get("dbname")
|
||||
if not database_name:
|
||||
raise RuntimeError(
|
||||
f"Business database routing for project {self.project_code!r} "
|
||||
"does not contain a database name"
|
||||
)
|
||||
return database_name
|
||||
|
||||
|
||||
_active_project_routing: ContextVar[ActiveProjectRouting | None] = ContextVar(
|
||||
"active_project_routing",
|
||||
@@ -42,6 +53,23 @@ def _dsn_for_database(dsn: str, database_name: str) -> str:
|
||||
return make_conninfo(dsn, dbname=database_name)
|
||||
|
||||
|
||||
def get_project_database_name(name: str) -> str:
|
||||
"""Resolve a logical project code to its routed physical BizDB name."""
|
||||
routing = get_active_project_routing()
|
||||
if routing is not None and name == routing.project_code:
|
||||
return routing.business_database_name
|
||||
return name
|
||||
|
||||
|
||||
def get_project_template_database_name(name: str | None = None) -> str:
|
||||
"""Return the configured immutable template for the WNDB schema version.
|
||||
|
||||
The template belongs to the database schema version, not to an individual
|
||||
logical project or its temporary physical database name.
|
||||
"""
|
||||
return settings.WNDB_TEMPLATE_DB_NAME
|
||||
|
||||
|
||||
def get_project_pgconn_string(db_name: str | None = None) -> str:
|
||||
routing = get_active_project_routing()
|
||||
if routing is None:
|
||||
|
||||
Reference in New Issue
Block a user