""" Database configuration for scheduled downloads. Uses SQLite with SQLAlchemy ORM for persistent storage. """ from sqlalchemy import create_engine, event from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from pathlib import Path import logging logger = logging.getLogger(__name__) # Database file location - uses /app/data in Docker container # This directory should be mounted as a volume for persistence DATA_DIR = Path(__file__).parent.parent / "data" DB_PATH = DATA_DIR / "scheduled_tasks.db" # Ensure data directory exists (will be mounted volume in Docker) DATA_DIR.mkdir(parents=True, exist_ok=True) # Create engine with proper settings for SQLite in Docker engine = create_engine( f"sqlite:///{DB_PATH}", echo=False, connect_args={ "check_same_thread": False, # Allow multi-threaded access "timeout": 30 # Longer timeout for container I/O }, pool_pre_ping=True, # Verify connections before using ) # Enable foreign keys for SQLite @event.listens_for(engine, "connect") def set_sqlite_pragma(dbapi_conn, connection_record): cursor = dbapi_conn.cursor() cursor.execute("PRAGMA foreign_keys=ON") cursor.close() # Create session factory SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # Base class for models Base = declarative_base() def init_database(): """Initialize database - called on container startup""" try: Base.metadata.create_all(bind=engine) logger.info(f"Database initialized at {DB_PATH}") except Exception as e: logger.error(f"Failed to initialize database: {e}") raise def get_db(): """ Dependency for FastAPI to get database session. Usage: @app.get("/endpoint") def endpoint(db: Session = Depends(get_db)): ... """ db = SessionLocal() try: yield db finally: db.close()