"""Configuration helpers for connecting to the MSSQL sandbox.""" from __future__ import annotations import os from dataclasses import dataclass @dataclass(frozen=True) class DbSettings: """Environment-driven connection settings for SQL Server. Required variables: - DB_SERVER (e.g., - DB_DATABASE (e.g., "SugarScale_Lasuca") - DB_USERNAME (database login) - DB_PASSWORD (database password) Optional overrides: - DB_DRIVER (defaults to "$env") - DB_ENCRYPT ("true" to enable TLS) - DB_TRUST_CERT ("true" to trust the server certificate) """ server: str database: str username: str password: str driver: str = "ODBC Driver 18 for SQL Server" encrypt: bool = True trust_server_certificate: bool = True @classmethod def from_env(cls) -> "DbSettings": missing: list[str] = [] server = os.getenv("DB_SERVER") if not server: missing.append("DB_SERVER") database = os.getenv("DB_DATABASE") if not database: missing.append("DB_DATABASE") username = os.getenv("DB_USERNAME") if not username: missing.append("DB_USERNAME") password = os.getenv("DB_PASSWORD") if not password: missing.append("DB_PASSWORD") if missing: raise RuntimeError( "Missing required environment variables: " + ", ".join(missing) ) driver = os.getenv("DB_DRIVER", "ODBC Driver 18 for SQL Server") encrypt = os.getenv("DB_ENCRYPT", "true").lower() == "true" trust = os.getenv("DB_TRUST_CERT", "true").lower() == "true" return cls( server=server, database=database, username=username, password=password, driver=driver, encrypt=encrypt, trust_server_certificate=trust, ) def connection_string(self) -> str: parts = [ f"DRIVER={{{self.driver}}}", f"SERVER={self.server}", f"DATABASE={self.database}", f"UID={self.username}", f"PWD={self.password}", ] if self.encrypt: parts.append("Encrypt=yes") if self.trust_server_certificate: parts.append("TrustServerCertificate=yes") parts.append("MARS_Connection=yes") return ";".join(parts)