import json import sqlite3 from datetime import datetime, timedelta, timezone from pathlib import Path from typing import Optional from storage.metrics_db import DB_PATH def _init() -> None: DB_PATH.parent.mkdir(parents=True, exist_ok=True) with sqlite3.connect(DB_PATH) as conn: conn.execute(""" CREATE TABLE IF NOT EXISTS av_cache ( cache_key TEXT PRIMARY KEY, payload TEXT NOT NULL, fetched_at TEXT NOT NULL ) """) def get(key: str, ttl_hours: int = 24) -> Optional[dict]: if not DB_PATH.exists(): return None try: with sqlite3.connect(DB_PATH) as conn: row = conn.execute( "SELECT payload, fetched_at FROM av_cache WHERE cache_key = ?", (key,) ).fetchone() if row is None: return None payload_str, fetched_at_str = row fetched_at = datetime.fromisoformat(fetched_at_str) if datetime.now(timezone.utc) - fetched_at > timedelta(hours=ttl_hours): return None return json.loads(payload_str) except Exception: return None def set(key: str, payload: dict) -> None: _init() try: with sqlite3.connect(DB_PATH) as conn: conn.execute( """ INSERT INTO av_cache (cache_key, payload, fetched_at) VALUES (?, ?, ?) ON CONFLICT(cache_key) DO UPDATE SET payload=excluded.payload, fetched_at=excluded.fetched_at """, (key, json.dumps(payload), datetime.now(timezone.utc).isoformat()), ) except Exception: pass