Add disk-backed SQLite cache mode as an alternative to in-memory

This commit is contained in:
Jan Doubravský
2026-06-08 11:39:04 +02:00
parent 757a8f4eba
commit 209ae667ab
10 changed files with 280 additions and 67 deletions
+42
View File
@@ -289,3 +289,45 @@ def test_invalidate_then_refetch_works(engine):
def test_invalidate_unknown_table_is_noop(engine):
engine.invalidate("nonexistent_table") # must not raise
# ---------------------------------------------------------------------------
# Disk-backed cache (in_memory=False)
# ---------------------------------------------------------------------------
def test_disk_mode_query_works(source_engine, cache_path, monkeypatch):
monkeypatch.setattr(eng_mod, "CACHE_DB_PATH", cache_path)
monkeypatch.setattr(eng_mod, "BACKUP_INTERVAL_SECONDS", 9999)
ce = CachingEngine(source_engine, in_memory=False)
rows = ce.execute("SELECT id, name FROM products")
assert {r["name"] for r in rows} == {"Widget", "Gadget", "Doohickey"}
assert ce._cache._in_memory is False
ce.close()
def test_disk_mode_persists_across_instances(source_engine, cache_path, monkeypatch):
monkeypatch.setattr(eng_mod, "CACHE_DB_PATH", cache_path)
monkeypatch.setattr(eng_mod, "BACKUP_INTERVAL_SECONDS", 9999)
ce1 = CachingEngine(source_engine, in_memory=False)
ce1.execute("SELECT id, name FROM products")
ce1.close()
# Second instance opens the same on-disk cache and finds the table already there.
ce2 = CachingEngine(source_engine, in_memory=False)
assert ce2._cache.is_table_cached("products") is True
rows = ce2.execute("SELECT id, name FROM products")
assert {r["name"] for r in rows} == {"Widget", "Gadget", "Doohickey"}
ce2.close()
def test_in_memory_override_respects_config(source_engine, cache_path, monkeypatch):
"""in_memory=None falls back to the IN_MEMORY config default."""
monkeypatch.setattr(eng_mod, "CACHE_DB_PATH", cache_path)
monkeypatch.setattr(eng_mod, "BACKUP_INTERVAL_SECONDS", 9999)
monkeypatch.setattr(eng_mod, "IN_MEMORY", False)
ce = CachingEngine(source_engine) # no explicit in_memory
assert ce._cache._in_memory is False
ce.close()