Coverage for src/local_deep_research/metrics/database.py: 100%
25 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-06 15:42 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-06 15:42 +0000
1"""Database utilities for metrics module with SQLAlchemy."""
3from contextlib import contextmanager
4from typing import Generator, Optional
6from sqlalchemy.orm import Session
8from ..database.session_context import get_user_db_session
9from ..utilities.request_context import get_current_username # noqa: F401
12class MetricsDatabase:
13 """Database manager for metrics using SQLAlchemy."""
15 def __init__(
16 self, username: Optional[str] = None, password: Optional[str] = None
17 ):
18 # Store credentials if provided (for testing/background tasks)
19 self.username = username
20 self.password = password
22 @contextmanager
23 def get_session(
24 self, username: Optional[str] = None, password: Optional[str] = None
25 ) -> Generator[Session, None, None]:
26 """Get a database session with automatic cleanup.
28 Args:
29 username: Override username for this session
30 password: Override password for this session (if needed for thread access)
31 """
32 # Use provided username or fall back to stored/session username
33 user = username or self.username
34 pwd = password or self.password
36 # Try to get username from request context if still not available
37 if not user:
38 user = get_current_username()
40 if not user:
41 # No username available - can't access user database
42 yield None
43 return
45 # If we have password, use thread-safe access
46 if pwd:
47 from ..database.thread_metrics import metrics_writer
49 metrics_writer.set_user_password(user, pwd)
50 with metrics_writer.get_session(user) as session:
51 yield session
52 else:
53 # Use the per-user database session with proper context management
54 with get_user_db_session(user) as session:
55 yield session