presenton/servers/fastapi/utils/db_utils.py
sudipnext c7860127f2 feat: add support for optional embedded Ollama and enhance database migration handling
- Updated docker-compose.yml to allow disabling embedded Ollama via environment variable.
- Refactored Dockerfile and Dockerfile.dev for improved dependency management and installation process.
- Enhanced FastAPI migration scripts to handle orphaned Alembic revisions and added new database migration logic.
- Improved error handling in background tasks and Codex authentication endpoints.
- Added support for font file uploads with better validation and extraction of font names.
- Introduced new image search functionality with support for Pexels and Pixabay APIs.
2026-04-15 15:39:35 +05:45

68 lines
2.3 KiB
Python

import os
from utils.get_env import get_app_data_directory_env, get_database_url_env
from urllib.parse import urlsplit, urlunsplit, parse_qsl
import ssl
def _ensure_sqlite_parent_dir(database_url: str) -> None:
if not database_url.startswith("sqlite://"):
return
split_result = urlsplit(database_url)
db_path = split_result.path
if not db_path:
return
# sqlite URLs on Windows can start with /C:/..., normalize that for os.path.
if os.name == "nt" and len(db_path) >= 3 and db_path[0] == "/" and db_path[2] == ":":
db_path = db_path[1:]
parent = os.path.dirname(db_path)
if parent:
os.makedirs(parent, exist_ok=True)
def get_database_url_and_connect_args() -> tuple[str, dict]:
database_url = get_database_url_env() or "sqlite:///" + os.path.join(
get_app_data_directory_env() or "/tmp/presenton", "fastapi.db"
)
_ensure_sqlite_parent_dir(database_url)
if database_url.startswith("sqlite://"):
database_url = database_url.replace("sqlite://", "sqlite+aiosqlite://", 1)
elif database_url.startswith("postgresql://"):
database_url = database_url.replace("postgresql://", "postgresql+asyncpg://", 1)
elif database_url.startswith("mysql://"):
database_url = database_url.replace("mysql://", "mysql+aiomysql://", 1)
else:
database_url = database_url
connect_args = {}
if "sqlite" in database_url:
connect_args["check_same_thread"] = False
try:
split_result = urlsplit(database_url)
if split_result.query:
query_params = parse_qsl(split_result.query, keep_blank_values=True)
driver_scheme = split_result.scheme
for k, v in query_params:
key_lower = k.lower()
if key_lower == "sslmode" and "postgresql+asyncpg" in driver_scheme:
if v.lower() != "disable" and "sqlite" not in database_url:
connect_args["ssl"] = ssl.create_default_context()
database_url = urlunsplit(
(
split_result.scheme,
split_result.netloc,
split_result.path,
"",
split_result.fragment,
)
)
except Exception:
pass
return database_url, connect_args