fix: prevent SQLite corruption by checkpointing WAL and closing DB on shutdown

The database was never properly closed on SIGINT/SIGTERM — WAL files were left
in a partially-written state causing "database disk image is malformed" errors.
Adds WAL checkpoint on close, synchronous=NORMAL pragma, SIGTERM handlers, and
a store.close() method that flushes all pending writes before exit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsxdsm
2026-03-31 23:15:30 -07:00
parent fc37015f79
commit fa9b277c32
4 changed files with 55 additions and 5 deletions

View File

@@ -122,6 +122,8 @@ export class CentralDatabase {
// Enable WAL mode for concurrent reader/writer access
this.db.exec("PRAGMA journal_mode = WAL");
// Ensure data reaches disk on commit (NORMAL is safe with WAL mode)
this.db.exec("PRAGMA synchronous = NORMAL");
// Enable foreign key enforcement
this.db.exec("PRAGMA foreign_keys = ON");
}
@@ -144,8 +146,14 @@ export class CentralDatabase {
/**
* Close the database connection.
* Checkpoints the WAL first to ensure all writes are flushed to the main db file.
*/
close(): void {
try {
this.db.exec("PRAGMA wal_checkpoint(TRUNCATE)");
} catch {
// Best-effort: checkpoint failure is non-fatal
}
this.db.close();
}