""" database.py This module sets up the SQLAlchemy database connection for the Expressive TTS Arena project. It initializes the PostgreSQL engine, creates a session factory for handling database transactions, and defines a declarative base class for ORM models. If no DATABASE_URL environment variable is set, then create a dummy database to fail gracefully """ # Standard Library Imports from typing import Callable, Optional # Third-Party Library Imports from sqlalchemy import Engine, create_engine from sqlalchemy.orm import declarative_base, sessionmaker # Local Application Imports from src.config import Config class DummySession: is_dummy = True # Flag to indicate this is a dummy session. def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): pass def add(self, _instance, _warn=True): # No-op: simply ignore adding the instance. pass def commit(self): # Raise an exception to simulate failure when attempting a write. raise RuntimeError("DummySession does not support commit operations.") def refresh(self, _instance): # Raise an exception to simulate failure when attempting to refresh. raise RuntimeError("DummySession does not support refresh operations.") def rollback(self): # No-op: there's nothing to roll back. pass def close(self): # No-op: nothing to close. pass Base = declarative_base() engine: Optional[Engine] = None DBSessionMaker = sessionmaker | Callable[[], DummySession] def init_db(config: Config) -> DBSessionMaker: # ruff doesn't like setting global variables, but this is practical here global engine # noqa if config.app_env == "prod": # In production, a valid DATABASE_URL is required. if not config.database_url: raise ValueError("DATABASE_URL must be set in production!") engine = create_engine(config.database_url) return sessionmaker(bind=engine) # In development, if a DATABASE_URL is provided, use it. if config.database_url: engine = create_engine(config.database_url) return sessionmaker(bind=engine) # No DATABASE_URL is provided; use a DummySession that does nothing. engine = None def dummy_session_factory(): return DummySession() return dummy_session_factory