"""Engine factory — auto-detect engine from DATABASE_URL.""" from urllib.parse import urlparse from mcp_database_universal.engines.base import BaseEngine def get_engine(url: str, read_only: bool = True) -> BaseEngine: parsed = urlparse(url) scheme = parsed.scheme.lower() if scheme == "sqlite": from mcp_database_universal.engines.sqlite import SQLiteEngine path = parsed.netloc + parsed.path if path == ":memory:" or path == "/:memory:": path = ":memory:" elif path.startswith("/") and len(path) > 1: path = path[1:] return SQLiteEngine(path=path, read_only=read_only) if scheme in ("postgresql", "postgres"): from mcp_database_universal.engines.postgres import PostgresEngine return PostgresEngine( host=parsed.hostname or "localhost", port=parsed.port or 5432, database=(parsed.path.lstrip("/") or "postgres"), user=parsed.username or "", password=parsed.password or "", read_only=read_only, ) if scheme == "mysql": from mcp_database_universal.engines.mysql import MySQLEngine return MySQLEngine( host=parsed.hostname or "localhost", port=parsed.port or 3306, database=(parsed.path.lstrip("/") or "mysql"), user=parsed.username or "", password=parsed.password or "", read_only=read_only, ) if scheme in ("mssql", "sqlserver"): from mcp_database_universal.engines.mssql import MSSQLEngine return MSSQLEngine( host=parsed.hostname or "localhost", port=parsed.port or 1433, database=(parsed.path.lstrip("/") or "master"), user=parsed.username or "", password=parsed.password or "", read_only=read_only, ) raise ValueError(f"Unsupported DATABASE_URL scheme: {scheme}")