from sqlalchemy import create_engine, event from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import QueuePool import backend.config.settings as settings engine = create_engine( settings.DATABASE_URL, poolclass=QueuePool, pool_size=20, max_overflow=30, pool_pre_ping=True, pool_recycle=1800, pool_timeout=30, connect_args={} if 'postgresql' in settings.DATABASE_URL else {"check_same_thread": False} ) @event.listens_for(engine, "connect") def set_sqlite_pragma(dbapi_connection, connection_record): if "sqlite" in settings.DATABASE_URL: cursor = dbapi_connection.cursor() cursor.execute("PRAGMA journal_mode=WAL") cursor.execute("PRAGMA synchronous=NORMAL") cursor.execute("PRAGMA busy_timeout=5000") cursor.close() SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def get_db(): db = SessionLocal() try: yield db finally: db.close() import hashlib from datetime import datetime def hash_phone(phone: str) -> str: return hashlib.sha256(phone.encode()).hexdigest()[:32] def get_language_preference(user_hash, db): from backend.database.postgres.models.users import User user = db.query(User).filter(User.user_hash == user_hash).first() return user.language_preference if user else None def save_language_preference( user_hash, language, db ): from backend.database.postgres.models.users import User existing = db.query(User).filter(User.user_hash == user_hash).first() if existing: existing.language_preference = language existing.updated_at = datetime.utcnow() else: from core.auth import hash_password db.add(User( user_hash=user_hash, language_preference=language, pin_hash=hash_password("changeme"), # Requires password reset on first login )) db.commit() def delete_language_preference(user_hash, db): from backend.database.postgres.models.users import User user = db.query(User).filter(User.user_hash == user_hash).first() if user: user.language_preference = "en" db.commit()