fix(database): enable SQLite WAL before schema reconciliation

This commit is contained in:
cesnimda
2026-10-21 08:04:26 +02:00
parent a15336cc94
commit f51e0506cc
10 changed files with 594 additions and 3 deletions
@@ -54,6 +54,39 @@ public sealed class DatabaseBackupRunnerTests : IDisposable
Assert.Equal(2L, (long)(await count.ExecuteScalarAsync())!);
}
[Fact]
public async Task RunOnce_includes_committed_WAL_rows_in_an_independent_restorable_snapshot()
{
CreateSourceDb(out var connectionString);
await using var source = new SqliteConnection(connectionString);
await source.OpenAsync();
await using var write = source.CreateCommand();
write.CommandText = "PRAGMA journal_mode=WAL;";
Assert.Equal("wal", await write.ExecuteScalarAsync());
write.CommandText = "INSERT INTO Sample (Name) VALUES ('committed-in-wal');";
await write.ExecuteNonQueryAsync();
Assert.True(new FileInfo(Path.Combine(_root, "source.db-wal")).Length > 0);
var backupPath = await CreateRunner(connectionString).RunOnceAsync(CancellationToken.None);
Assert.NotNull(backupPath);
await using var backup = new SqliteConnection($"Data Source={backupPath};Mode=ReadOnly;Pooling=False");
await backup.OpenAsync();
await using var query = backup.CreateCommand();
query.CommandText = "PRAGMA integrity_check;";
Assert.Equal("ok", await query.ExecuteScalarAsync());
query.CommandText = "SELECT COUNT(*) FROM Sample;";
Assert.Equal(3L, await query.ExecuteScalarAsync());
query.CommandText = "SELECT Name FROM Sample WHERE Id=3;";
Assert.Equal("committed-in-wal", await query.ExecuteScalarAsync());
write.CommandText = "INSERT INTO Sample (Name) VALUES ('after-snapshot');";
await write.ExecuteNonQueryAsync();
query.CommandText = "SELECT COUNT(*) FROM Sample;";
Assert.Equal(3L, await query.ExecuteScalarAsync());
write.CommandText = "SELECT COUNT(*) FROM Sample;";
Assert.Equal(4L, await write.ExecuteScalarAsync());
}
[Fact]
public async Task RunOnce_prunes_backups_beyond_retention()
{