import sqlite3 import threading from pathlib import Path _lock = threading.Lock() def _connect(db_path: str) -> sqlite3.Connection: conn = sqlite3.connect(db_path, check_same_thread=False) conn.execute( "CREATE TABLE IF NOT EXISTS seen_ids (id TEXT PRIMARY KEY, created_at TEXT NOT NULL)" ) conn.commit() return conn class IdempotencyStore: def __init__(self, db_path: str) -> None: Path(db_path).parent.mkdir(parents=True, exist_ok=True) self._conn = _connect(db_path) def already_seen(self, capture_id: str) -> bool: row = self._conn.execute( "SELECT 1 FROM seen_ids WHERE id = ?", (capture_id,) ).fetchone() return row is not None def mark_seen(self, capture_id: str, created_at: str) -> None: self._conn.execute( "INSERT OR IGNORE INTO seen_ids (id, created_at) VALUES (?, ?)", (capture_id, created_at), ) self._conn.commit() def get_file_lock() -> threading.Lock: return _lock