Open the database read-only for report and trees (closes #8)
check / check (push) Successful in 1m17s

report and trees now connect read-only (mode=ro, query_only, the same
busy timeout) and no longer set the journal mode, which is a write. A
read-only connection to a WAL database still needs its -wal and -shm
files, or write access to the directory to create them, so scan now
switches the database back to rollback-journal mode whenever it closes
it: between scans the file alone holds the database. If a report has
the database open at that moment the switch is refused; scan warns and
the database stays in WAL mode, with its -wal and -shm files, until the
next scan. README §Database states what readers need.

Model: opus-5-5
This commit was merged in pull request #72.
This commit is contained in:
2026-10-03 16:30:19 +02:00
parent c887f80f57
commit d63d3cc7fc
7 changed files with 197 additions and 34 deletions
+4 -3
View File
@@ -87,8 +87,9 @@ type fileMeta struct {
// hash only when its size, head, and tail match another file's. Flag
// parsing and the at-least-one-operand check are done by cobra. Errors
// are returned rather than exiting, so that the deferred close — which
// checkpoints the SQLite WAL — always runs. Cancelling ctx unwinds the
// worker pools and aborts the scan with the context's error.
// takes the database out of WAL mode — always runs. Cancelling ctx
// unwinds the worker pools and aborts the scan with the context's
// error.
func runScan(ctx context.Context, roots []string, workers int,
oneFS bool,
) error {
@@ -108,7 +109,7 @@ func runScan(ctx context.Context, roots []string, workers int,
return err
}
defer func() { _ = db.Close() }()
defer closeScanDatabase(ctx, db, dbPath)
st, err := syncScan(ctx, db, roots, workers, oneFS)
if err != nil {