from __future__ import annotations __all__ = [ "DatabaseError", "ensure_select_only", "_ensure_select_only", ] class DatabaseError(RuntimeError): """Raised for database connectivity/query errors.""" def ensure_select_only(query: str) -> None: """Ensure a SQL query is read-only. Args: query: SQL string. Raises: DatabaseError: If the query does not appear to be a read-only SELECT. Notes: This is a conservative guard. It intentionally allows only statements starting with SELECT or WITH (CTE) after stripping leading whitespace. """ q = query.strip().lower() if not (q.startswith("select") or q.startswith("with")): raise DatabaseError("Only SELECT queries are allowed") # Backwards-compatible alias (older call sites use the underscore name). _ensure_select_only = ensure_select_only