""" Database Configuration fuer Test Registry. PostgreSQL-Anbindung fuer persistente Test-Speicherung. Ersetzt die bisherige JSON-basierte Speicherung. """ import os from contextlib import contextmanager from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, Session, declarative_base # Eigene Base fuer Test Registry - unabhaengig von anderen Modulen # Dies vermeidet Import-Probleme in CI/CD Umgebungen Base = declarative_base() # Database URL from environment (nutzt gleiche DB wie Backend) _raw_url = os.getenv( "DATABASE_URL", "postgresql://breakpilot:breakpilot123@postgres:5432/breakpilot_db" ) # SQLAlchemy 2.0 erfordert "postgresql://" statt "postgres://" DATABASE_URL = _raw_url.replace("postgres://", "postgresql://", 1) if _raw_url.startswith("postgres://") else _raw_url # Engine configuration mit Connection Pool engine = create_engine( DATABASE_URL, pool_pre_ping=True, # Prueft Connections vor Nutzung pool_size=5, # Standard Pool-Groesse max_overflow=10, # Zusaetzliche Connections bei Bedarf pool_recycle=3600, # Recycle nach 1 Stunde echo=os.getenv("SQL_ECHO", "false").lower() == "true" ) # Session factory SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def get_db(): """ Database dependency for FastAPI endpoints. Yields a database session and ensures cleanup. """ db = SessionLocal() try: yield db finally: db.close() @contextmanager def get_db_session(): """ Context manager for database sessions. Use this for background tasks and non-FastAPI code. Example: with get_db_session() as db: db.query(TestRun).all() """ db = SessionLocal() try: yield db db.commit() except Exception: db.rollback() raise finally: db.close() def init_db(): """ Erstellt alle Tabellen. In Produktion sollte Alembic verwendet werden. """ from . import db_models # Import models to register them Base.metadata.create_all(bind=engine) def check_db_connection() -> bool: """ Prueft ob die Datenbankverbindung funktioniert. Nuetzlich fuer Health-Checks. """ try: from sqlalchemy import text with get_db_session() as db: db.execute(text("SELECT 1")) return True except Exception: return False