now-arriving/cache.py

32 lines
1.0 KiB
Python

import contextlib
import datetime
import sqlite3
class Cache:
def __init__(self, db):
self.db = db
def get(self, key, timeout, f):
now = datetime.datetime.now(datetime.timezone.utc)
earliest_acceptable = now - timeout
match self.db.execute(
'SELECT value FROM cache WHERE key = ? AND timestamp >= ?',
(key, earliest_acceptable.isoformat()),
).fetchall():
case [(value,)]:
return value
value = f()
self.db.execute(
'INSERT INTO cache (key, timestamp, value) VALUES (?, ?, ?) ' +
'ON CONFLICT(key) DO UPDATE SET timestamp = excluded.timestamp, value = excluded.value',
(key, now.isoformat(), value),
)
return value
@contextlib.contextmanager
def open():
with sqlite3.connect('cache.sqlite', isolation_level=None) as db:
db.execute('CREATE TABLE IF NOT EXISTS cache (key TEXT PRIMARY KEY, timestamp TEXT NOT NULL, value TEXT NOT NULL)')
yield Cache(db)