From fc8474d721aadb7ce7391f1980fc5eb3fa3f51cc Mon Sep 17 00:00:00 2001 From: Spencer Brower Date: Sun, 3 May 2026 13:03:14 -0400 Subject: [PATCH] feat: Restore db from file. --- fixtures/encrypted-single-file.db.age | Bin 0 -> 12500 bytes fixtures/single-file.db | Bin 12288 -> 12288 bytes src/Db.zig | 297 ++++++++++++++++++++------ zig-vendor/zig-sqlite/query.zig | 1 + zig-vendor/zig-sqlite/sqlite.zig | 32 +-- zig-vendor/zig-sqlite/vtab.zig | 44 ++-- 6 files changed, 283 insertions(+), 91 deletions(-) create mode 100644 fixtures/encrypted-single-file.db.age diff --git a/fixtures/encrypted-single-file.db.age b/fixtures/encrypted-single-file.db.age new file mode 100644 index 0000000000000000000000000000000000000000..02d1c4c4d04914e7419d1fd8f4d471dd00c7a4a2 GIT binary patch literal 12500 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 !t5yh|{ni+tet?O)b8@q(sL5>0RPprH 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 UI_7IUULths=xm03a|49~0HNeK!vFvP literal 0 HcmV?d00001 diff --git a/fixtures/single-file.db b/fixtures/single-file.db index 2095cd0ade85e67b545df90006768f210af951e7..143c3987df5383346b84e030e44058e6b10d0b2b 100644 GIT binary patch delta 87 zcmZojXh@hK&B!!S#+i|6V}hBygQ=xuVq#)is)eDEnW4F1lCiO+rKPcnaZ*ZhVoG9~ qsiA?Hg=LbNu}P9)QlgQCc~YvSp;2l|nz>=BrKL%-(dKLNS^@wkI~aHX delta 87 zcmZojXh@hK&B!=W#+i|EV}hBygJD{tk%^J1rBQN{QA)C5N>W;iQIch{MQW09im9Q6 qnW?d1TB@m8a .unsigned, 'i' => .signed, + else => unreachable, }; return @Int(signedness, std.fmt.parseInt(usize, type_info[1..type_info.len], 10) catch { @compileError("invalid type info " ++ type_info); diff --git a/zig-vendor/zig-sqlite/sqlite.zig b/zig-vendor/zig-sqlite/sqlite.zig index 1702a0b..2c1d343 100644 --- a/zig-vendor/zig-sqlite/sqlite.zig +++ b/zig-vendor/zig-sqlite/sqlite.zig @@ -3,7 +3,7 @@ const builtin = @import("builtin"); const build_options = @import("build_options"); const debug = std.debug; const heap = std.heap; -const io = std.io; +const io = std.Io; const mem = std.mem; const testing = std.testing; @@ -1967,7 +1967,7 @@ pub const DynamicStatement = struct { pub fn all(self: *Self, comptime Type: type, allocator: mem.Allocator, options: QueryOptions, values: anytype) ![]Type { var iter = try self.iteratorAlloc(Type, allocator, values); - var rows: std.ArrayList(Type) = .{}; + var rows: std.ArrayList(Type) = .empty; while (try iter.nextAlloc(allocator, options)) |row| { try rows.append(allocator, row); } @@ -2257,7 +2257,7 @@ pub fn Statement(comptime opts: StatementOptions, comptime query: anytype) type pub fn all(self: *Self, comptime Type: type, allocator: mem.Allocator, options: QueryOptions, values: anytype) ![]Type { var iter = try self.iteratorAlloc(Type, allocator, values); - var rows: std.ArrayList(Type) = .{}; + var rows: std.ArrayList(Type) = .empty; while (try iter.nextAlloc(allocator, options)) |row| { try rows.append(allocator, row); } @@ -3020,7 +3020,7 @@ test "sqlite: statement iterator" { var stmt = try db.prepare("INSERT INTO user(name, id, age, weight, favorite_color) VALUES(?{[]const u8}, ?{usize}, ?{usize}, ?{f32}, ?{[]const u8})"); defer stmt.deinit(); - var expected_rows: std.ArrayList(TestUser) = .{}; + var expected_rows: std.ArrayList(TestUser) = .empty; var i: usize = 0; while (i < 20) : (i += 1) { const name = try std.fmt.allocPrint(allocator, "Vincent {d}", .{i}); @@ -3047,7 +3047,7 @@ test "sqlite: statement iterator" { var iter = try stmt2.iterator(RowType, .{}); - var rows: std.ArrayList(RowType) = .{}; + var rows: std.ArrayList(RowType) = .empty; while (try iter.next(.{})) |row| { try rows.append(allocator, row); } @@ -3074,7 +3074,7 @@ test "sqlite: statement iterator" { var iter = try stmt2.iterator(RowType, .{}); - var rows: std.ArrayList(RowType) = .{}; + var rows: std.ArrayList(RowType) = .empty; while (try iter.nextAlloc(allocator, .{})) |row| { try rows.append(allocator, row); } @@ -3459,7 +3459,7 @@ test "sqlite: bind runtime slice" { const allocator = arena.allocator(); // creating array list on heap so that it's deemed runtime size - var list: std.ArrayList([]const u8) = .{}; + var list: std.ArrayList([]const u8) = .empty; defer list.deinit(allocator); try list.append(allocator, "this is some data"); const args = try list.toOwnedSlice(allocator); @@ -3749,7 +3749,11 @@ test "sqlite: create aggregate function with no aggregate context" { var db = try getTestDb(); defer db.deinit(); - var rand = std.Random.DefaultPrng.init(@intCast(std.time.milliTimestamp())); + const test_io = testing.io; + + var rand = std.Random.DefaultPrng.init(@intCast( + std.Io.Timestamp.now(test_io, .real).toMilliseconds(), + )); // Create an aggregate function working with a MyContext @@ -3810,7 +3814,11 @@ test "sqlite: create aggregate function with an aggregate context" { var db = try getTestDb(); defer db.deinit(); - var rand = std.Random.DefaultPrng.init(@intCast(std.time.milliTimestamp())); + const test_io = std.testing.io; + + var rand = std.Random.DefaultPrng.init( + @intCast(std.Io.Timestamp.now(test_io, .real).toMilliseconds()), + ); try db.createAggregateFunction( "mySum", @@ -3877,7 +3885,7 @@ test "sqlite: empty slice" { defer db.deinit(); try addTestData(&db); - var list: std.ArrayList(u8) = .{}; + var list: std.ArrayList(u8) = .empty; const ptr = try list.toOwnedSlice(allocator); try db.exec("INSERT INTO article(author_id, data) VALUES(?, ?)", .{}, .{ 1, ptr }); @@ -4054,7 +4062,7 @@ test "reuse same field twice in query string" { test "fuzzing" { const Context = struct { - fn testOne(_: @This(), input: []const u8) anyerror!void { + fn testOne(_: @This(), input: *testing.Smith) anyerror!void { var db = try Db.init(.{ .mode = .Memory, .open_flags = .{ @@ -4066,7 +4074,7 @@ test "fuzzing" { try db.exec("CREATE TABLE test(id integer primary key, name text, data blob)", .{}, .{}); - db.execDynamic(input, .{}, .{}) catch |err| switch (err) { + db.execDynamic(input.value([]const u8), .{}, .{}) catch |err| switch (err) { error.SQLiteError => return, error.ExecReturnedData => return, error.EmptyQuery => return, diff --git a/zig-vendor/zig-sqlite/vtab.zig b/zig-vendor/zig-sqlite/vtab.zig index 19826d0..65e2d6a 100644 --- a/zig-vendor/zig-sqlite/vtab.zig +++ b/zig-vendor/zig-sqlite/vtab.zig @@ -766,7 +766,8 @@ pub fn VirtualTable( // - const nullable_state: ?*State = @fieldParentPtr("vtab", vtab); + const vtab_ptr: *c.sqlite3_vtab = @ptrCast(vtab); + const nullable_state: ?*State = @fieldParentPtr("vtab", vtab_ptr); const state = nullable_state orelse unreachable; var arena = heap.ArenaAllocator.init(state.module_context.allocator); @@ -789,7 +790,8 @@ pub fn VirtualTable( } fn xDisconnect(vtab: [*c]c.sqlite3_vtab) callconv(.c) c_int { - const nullable_state: ?*State = @fieldParentPtr("vtab", vtab); + const vtab_ptr: *c.sqlite3_vtab = @ptrCast(vtab); + const nullable_state: ?*State = @fieldParentPtr("vtab", vtab_ptr); const state = nullable_state orelse unreachable; state.deinit(); @@ -806,7 +808,8 @@ pub fn VirtualTable( } fn xOpen(vtab: [*c]c.sqlite3_vtab, vtab_cursor: [*c][*c]c.sqlite3_vtab_cursor) callconv(.c) c_int { - const nullable_state: ?*State = @fieldParentPtr("vtab", vtab); + const vtab_ptr: *c.sqlite3_vtab = @ptrCast(vtab); + const nullable_state: ?*State = @fieldParentPtr("vtab", vtab_ptr); const state = nullable_state orelse unreachable; const cursor_state = CursorState.init(state.module_context, state.table) catch |err| { @@ -819,7 +822,8 @@ pub fn VirtualTable( } fn xClose(vtab_cursor: [*c]c.sqlite3_vtab_cursor) callconv(.c) c_int { - const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor); + const vtab_cursor_ptr: *c.sqlite3_vtab_cursor = @ptrCast(vtab_cursor); + const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor_ptr); const cursor_state = nullable_cursor_state orelse unreachable; cursor_state.deinit(); @@ -828,7 +832,8 @@ pub fn VirtualTable( } fn xEof(vtab_cursor: [*c]c.sqlite3_vtab_cursor) callconv(.c) c_int { - const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor); + const vtab_cursor_ptr: *c.sqlite3_vtab_cursor = @ptrCast(vtab_cursor); + const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor_ptr); const cursor_state = nullable_cursor_state orelse unreachable; const cursor = cursor_state.cursor; @@ -866,7 +871,8 @@ pub fn VirtualTable( } fn xFilter(vtab_cursor: [*c]c.sqlite3_vtab_cursor, idx_num: c_int, idx_str: [*c]const u8, argc: c_int, argv: [*c]?*c.sqlite3_value) callconv(.c) c_int { - const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor); + const vtab_cursor_ptr: *c.sqlite3_vtab_cursor = @ptrCast(vtab_cursor); + const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor_ptr); const cursor_state = nullable_cursor_state orelse unreachable; const cursor = cursor_state.cursor; @@ -892,7 +898,8 @@ pub fn VirtualTable( } fn xNext(vtab_cursor: [*c]c.sqlite3_vtab_cursor) callconv(.c) c_int { - const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor); + const vtab_cursor_ptr: *c.sqlite3_vtab_cursor = @ptrCast(vtab_cursor); + const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor_ptr); const cursor_state = nullable_cursor_state orelse unreachable; const cursor = cursor_state.cursor; @@ -911,7 +918,8 @@ pub fn VirtualTable( } fn xColumn(vtab_cursor: [*c]c.sqlite3_vtab_cursor, ctx: ?*c.sqlite3_context, n: c_int) callconv(.c) c_int { - const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor); + const vtab_cursor_ptr: *c.sqlite3_vtab_cursor = @ptrCast(vtab_cursor); + const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor_ptr); const cursor_state = nullable_cursor_state orelse unreachable; const cursor = cursor_state.cursor; @@ -955,7 +963,8 @@ pub fn VirtualTable( } fn xRowid(vtab_cursor: [*c]c.sqlite3_vtab_cursor, row_id_ptr: [*c]c.sqlite3_int64) callconv(.c) c_int { - const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor); + const vtab_cursor_ptr: *c.sqlite3_vtab_cursor = @ptrCast(vtab_cursor); + const nullable_cursor_state: ?*CursorState = @fieldParentPtr("vtab_cursor", vtab_cursor_ptr); const cursor_state = nullable_cursor_state orelse unreachable; const cursor = cursor_state.cursor; @@ -1023,7 +1032,9 @@ const TestVirtualTable = struct { // const data = &[_][]const u8{ - "Vincent", "José", "Michel", + "Vincent", + "José", + "Michel", }; var rand = std.Random.DefaultPrng.init(204882485); @@ -1064,13 +1075,18 @@ const TestVirtualTable = struct { debug.print("connect\n", .{}); } - pub const BuildBestIndexError = error{} || mem.Allocator.Error; + pub const BuildBestIndexError = error{} || mem.Allocator.Error || error{WriteFailed}; - pub fn buildBestIndex(self: *TestVirtualTable, diags: *VTabDiagnostics, builder: *BestIndexBuilder) BuildBestIndexError!void { + pub fn buildBestIndex( + self: *TestVirtualTable, + diags: *VTabDiagnostics, + builder: *BestIndexBuilder, + ) BuildBestIndexError!void { _ = self; _ = diags; - var id_str_writer = builder.id_str_buffer.writer(builder.allocator); + // var id_str_writer = builder.id_str_buffer.writer(builder.allocator); + var id_str_writer = std.Io.Writer.fromArrayList(&builder.id_str_buffer); var argv_index: i32 = 0; for (builder.constraints) |*constraint| { @@ -1174,7 +1190,7 @@ const TestVirtualTableCursor = struct { // 3 chars for the '=' marker // 6 chars because we format all columns in a 6 char wide string const col_str = id[pos + 1 .. pos + 1 + 6]; - const col = try fmt.parseInt(i32, mem.trimRight(u8, col_str, " "), 10); + const col = try fmt.parseInt(i32, mem.trimEnd(u8, col_str, " "), 10); id = id[pos + 1 + 6 ..];