From f03b4efd5ed4f3c8ff33ee7507265ebddc86ec84 Mon Sep 17 00:00:00 2001 From: Brigs Date: Sun, 9 Aug 2026 16:08:39 -0400 Subject: [PATCH] fix: make sure the delivered LAVA database opens from read-only media A database whose header says journal_mode=WAL cannot be opened read-only: SQLite must create a -shm file to read one, and the LAVA viewer opens the report database with OPEN_READONLY. lava_finalize_output now checkpoints and returns to the delete journal before closing, so the delivered .db is complete and standalone with no -wal/-shm sidecars to lose when a report is copied. Nothing here enables WAL. This normalises whatever mode the connection ended in, so it is a guard rather than a fix for a failure happening today. Split out of RLEAPP #359; the WAL enablement and storage_safety.py module from that PR are deliberately deferred to the planned core consolidation. Co-Authored-By: Claude Opus 5 --- scripts/lavafuncs.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scripts/lavafuncs.py b/scripts/lavafuncs.py index 361f845..66cd5de 100644 --- a/scripts/lavafuncs.py +++ b/scripts/lavafuncs.py @@ -682,5 +682,19 @@ def lava_finalize_output(output_path): with open(os.path.join(output_path, lava_json_name), 'w', encoding='utf-8') as f: json.dump(lava_data, f, indent=4) + # A database left in WAL mode cannot be opened from read-only media: SQLite + # must create a -shm file to read one, and the LAVA viewer opens the report + # database with OPEN_READONLY. Checkpointing and returning to the delete + # journal guarantees the delivered .db is complete and standalone, with no + # -wal/-shm sidecars to lose when the report folder is copied or zipped. + # This normalises whatever mode the connection ended up in; nothing here + # enables WAL. + try: + if lava_db.execute('PRAGMA journal_mode').fetchone()[0].lower() == 'wal': + lava_db.execute('PRAGMA wal_checkpoint(TRUNCATE)') + lava_db.execute('PRAGMA journal_mode=DELETE') + except sqlite3.Error: + pass + # Close the SQLite database lava_db.close()