Improve cache stats performance (build 271261145)
This commit is contained in:
@@ -179,6 +179,21 @@ def init_db() -> None:
|
||||
)
|
||||
"""
|
||||
)
|
||||
conn.execute(
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS artwork_cache_status (
|
||||
request_id INTEGER PRIMARY KEY,
|
||||
tmdb_id INTEGER,
|
||||
media_type TEXT,
|
||||
poster_path TEXT,
|
||||
backdrop_path TEXT,
|
||||
has_tmdb INTEGER NOT NULL DEFAULT 0,
|
||||
poster_cached INTEGER NOT NULL DEFAULT 0,
|
||||
backdrop_cached INTEGER NOT NULL DEFAULT 0,
|
||||
updated_at TEXT NOT NULL
|
||||
)
|
||||
"""
|
||||
)
|
||||
conn.execute(
|
||||
"""
|
||||
CREATE INDEX IF NOT EXISTS idx_requests_cache_created_at
|
||||
@@ -191,6 +206,12 @@ def init_db() -> None:
|
||||
ON requests_cache (requested_by_norm)
|
||||
"""
|
||||
)
|
||||
conn.execute(
|
||||
"""
|
||||
CREATE INDEX IF NOT EXISTS idx_artwork_cache_status_updated_at
|
||||
ON artwork_cache_status (updated_at)
|
||||
"""
|
||||
)
|
||||
conn.execute(
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS user_activity (
|
||||
@@ -942,6 +963,116 @@ def get_request_cache_count() -> int:
|
||||
return int(row[0] or 0)
|
||||
|
||||
|
||||
def upsert_artwork_cache_status(
|
||||
request_id: int,
|
||||
tmdb_id: Optional[int],
|
||||
media_type: Optional[str],
|
||||
poster_path: Optional[str],
|
||||
backdrop_path: Optional[str],
|
||||
has_tmdb: bool,
|
||||
poster_cached: bool,
|
||||
backdrop_cached: bool,
|
||||
) -> None:
|
||||
updated_at = datetime.now(timezone.utc).isoformat()
|
||||
with _connect() as conn:
|
||||
conn.execute(
|
||||
"""
|
||||
INSERT INTO artwork_cache_status (
|
||||
request_id,
|
||||
tmdb_id,
|
||||
media_type,
|
||||
poster_path,
|
||||
backdrop_path,
|
||||
has_tmdb,
|
||||
poster_cached,
|
||||
backdrop_cached,
|
||||
updated_at
|
||||
)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
ON CONFLICT(request_id) DO UPDATE SET
|
||||
tmdb_id = excluded.tmdb_id,
|
||||
media_type = excluded.media_type,
|
||||
poster_path = excluded.poster_path,
|
||||
backdrop_path = excluded.backdrop_path,
|
||||
has_tmdb = excluded.has_tmdb,
|
||||
poster_cached = excluded.poster_cached,
|
||||
backdrop_cached = excluded.backdrop_cached,
|
||||
updated_at = excluded.updated_at
|
||||
""",
|
||||
(
|
||||
request_id,
|
||||
tmdb_id,
|
||||
media_type,
|
||||
poster_path,
|
||||
backdrop_path,
|
||||
1 if has_tmdb else 0,
|
||||
1 if poster_cached else 0,
|
||||
1 if backdrop_cached else 0,
|
||||
updated_at,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
def get_artwork_cache_status_count() -> int:
|
||||
with _connect() as conn:
|
||||
row = conn.execute("SELECT COUNT(*) FROM artwork_cache_status").fetchone()
|
||||
return int(row[0] or 0)
|
||||
|
||||
|
||||
def get_artwork_cache_missing_count() -> int:
|
||||
with _connect() as conn:
|
||||
row = conn.execute(
|
||||
"""
|
||||
SELECT COUNT(*)
|
||||
FROM artwork_cache_status
|
||||
WHERE (
|
||||
(poster_path IS NULL AND has_tmdb = 1)
|
||||
OR (poster_path IS NOT NULL AND poster_cached = 0)
|
||||
OR (backdrop_path IS NULL AND has_tmdb = 1)
|
||||
OR (backdrop_path IS NOT NULL AND backdrop_cached = 0)
|
||||
)
|
||||
"""
|
||||
).fetchone()
|
||||
return int(row[0] or 0)
|
||||
|
||||
|
||||
def update_artwork_cache_stats(
|
||||
cache_bytes: Optional[int] = None,
|
||||
cache_files: Optional[int] = None,
|
||||
missing_count: Optional[int] = None,
|
||||
total_requests: Optional[int] = None,
|
||||
) -> None:
|
||||
updated_at = datetime.now(timezone.utc).isoformat()
|
||||
if cache_bytes is not None:
|
||||
set_setting("artwork_cache_bytes", str(int(cache_bytes)))
|
||||
if cache_files is not None:
|
||||
set_setting("artwork_cache_files", str(int(cache_files)))
|
||||
if missing_count is not None:
|
||||
set_setting("artwork_cache_missing", str(int(missing_count)))
|
||||
if total_requests is not None:
|
||||
set_setting("artwork_cache_total_requests", str(int(total_requests)))
|
||||
set_setting("artwork_cache_updated_at", updated_at)
|
||||
|
||||
|
||||
def get_artwork_cache_stats() -> Dict[str, Any]:
|
||||
def _get_int(key: str) -> int:
|
||||
value = get_setting(key)
|
||||
if value is None:
|
||||
return 0
|
||||
try:
|
||||
return int(value)
|
||||
except (TypeError, ValueError):
|
||||
return 0
|
||||
|
||||
return {
|
||||
"cache_bytes": _get_int("artwork_cache_bytes"),
|
||||
"cache_files": _get_int("artwork_cache_files"),
|
||||
"missing_artwork": _get_int("artwork_cache_missing"),
|
||||
"total_requests": _get_int("artwork_cache_total_requests"),
|
||||
"updated_at": get_setting("artwork_cache_updated_at"),
|
||||
}
|
||||
|
||||
|
||||
def update_request_cache_title(
|
||||
request_id: int, title: str, year: Optional[int] = None
|
||||
) -> None:
|
||||
@@ -1030,6 +1161,39 @@ def get_request_cache_payloads(limit: int = 200, offset: int = 0) -> list[Dict[s
|
||||
return results
|
||||
|
||||
|
||||
def get_request_cache_payloads_missing(limit: int = 200, offset: int = 0) -> list[Dict[str, Any]]:
|
||||
limit = max(1, min(limit, 1000))
|
||||
offset = max(0, offset)
|
||||
with _connect() as conn:
|
||||
rows = conn.execute(
|
||||
"""
|
||||
SELECT rc.request_id, rc.payload_json
|
||||
FROM requests_cache rc
|
||||
JOIN artwork_cache_status acs
|
||||
ON rc.request_id = acs.request_id
|
||||
WHERE (
|
||||
(acs.poster_path IS NULL AND acs.has_tmdb = 1)
|
||||
OR (acs.poster_path IS NOT NULL AND acs.poster_cached = 0)
|
||||
OR (acs.backdrop_path IS NULL AND acs.has_tmdb = 1)
|
||||
OR (acs.backdrop_path IS NOT NULL AND acs.backdrop_cached = 0)
|
||||
)
|
||||
ORDER BY rc.request_id ASC
|
||||
LIMIT ? OFFSET ?
|
||||
""",
|
||||
(limit, offset),
|
||||
).fetchall()
|
||||
results: list[Dict[str, Any]] = []
|
||||
for row in rows:
|
||||
payload = None
|
||||
if row[1]:
|
||||
try:
|
||||
payload = json.loads(row[1])
|
||||
except json.JSONDecodeError:
|
||||
payload = None
|
||||
results.append({"request_id": row[0], "payload": payload})
|
||||
return results
|
||||
|
||||
|
||||
def get_cached_requests_since(since_iso: str) -> list[Dict[str, Any]]:
|
||||
with _connect() as conn:
|
||||
rows = conn.execute(
|
||||
|
||||
Reference in New Issue
Block a user