File size: 1,963 Bytes
2401ce5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import sqlite3
from datetime import datetime, timedelta, timezone
from typing import Optional

from storage.metrics_db import DB_PATH

_TABLE = "news_cache"


def _init() -> None:
    DB_PATH.parent.mkdir(parents=True, exist_ok=True)
    with sqlite3.connect(DB_PATH) as conn:
        conn.execute(f"""
            CREATE TABLE IF NOT EXISTS {_TABLE} (
                ticker     TEXT NOT NULL,
                query      TEXT NOT NULL,
                days       INTEGER NOT NULL,
                payload    TEXT NOT NULL,
                fetched_at TEXT NOT NULL,
                PRIMARY KEY (ticker, query, days)
            )
        """)


def get(ticker: str, query: str, days: int, ttl_seconds: int = 3600) -> Optional[str]:
    if not DB_PATH.exists():
        return None
    try:
        with sqlite3.connect(DB_PATH) as conn:
            row = conn.execute(
                f"SELECT payload, fetched_at FROM {_TABLE} WHERE ticker=? AND query=? AND days=?",
                (ticker, query, days),
            ).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(seconds=ttl_seconds):
            return None
        return payload_str
    except Exception:
        return None


def put(ticker: str, query: str, days: int, payload: str) -> None:
    _init()
    try:
        with sqlite3.connect(DB_PATH) as conn:
            conn.execute(
                f"""INSERT INTO {_TABLE} (ticker, query, days, payload, fetched_at)
                    VALUES (?, ?, ?, ?, ?)
                    ON CONFLICT(ticker, query, days) DO UPDATE SET
                        payload=excluded.payload,
                        fetched_at=excluded.fetched_at""",
                (ticker, query, days, payload, datetime.now(timezone.utc).isoformat()),
            )
    except Exception:
        pass