diff --git a/collector/db.py b/collector/db.py index 6bee655..3d8a638 100644 --- a/collector/db.py +++ b/collector/db.py @@ -17,7 +17,10 @@ def connect() -> sqlite3.Connection: Path(path).parent.mkdir(parents=True, exist_ok=True) conn = sqlite3.connect(path) conn.row_factory = sqlite3.Row - conn.execute("PRAGMA journal_mode=WAL;") + # Bewusst KEIN WAL: Der web-Container liest die DB read-only aus einem + # anderen Prozess. Eine readonly-Verbindung kann eine WAL-Datenbank ohne + # aktiven Writer/-shm nicht öffnen ("attempt to write a readonly database"). + # Rollback-Journal (Default) lässt readonly-Reads jederzeit zu. return conn diff --git a/collector/schema.sql b/collector/schema.sql index 2317356..c0fa291 100644 --- a/collector/schema.sql +++ b/collector/schema.sql @@ -1,5 +1,3 @@ -PRAGMA journal_mode=WAL; - CREATE TABLE IF NOT EXISTS charges ( id INTEGER PRIMARY KEY AUTOINCREMENT, start_time TEXT NOT NULL, -- ISO 8601, lokale Zeit (Europe/Berlin) diff --git a/web/lib/db.ts b/web/lib/db.ts index ddb079a..47abf0d 100644 --- a/web/lib/db.ts +++ b/web/lib/db.ts @@ -32,7 +32,9 @@ export interface Totals { function withDb(fallback: T, fn: (conn: Database.Database) => T): T { let conn: Database.Database | null = null; try { - conn = new Database(DB_PATH, { readonly: true, fileMustExist: true }); + // timeout: wartet kurz, falls der collector gerade schreibt (statt + // sofort mit SQLITE_BUSY zu scheitern). + conn = new Database(DB_PATH, { readonly: true, fileMustExist: true, timeout: 5000 }); const hasTable = conn .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='charges'") .get();