diff options
Diffstat (limited to '')
| -rw-r--r-- | sqlite.zig | 51 |
1 files changed, 51 insertions, 0 deletions
| @@ -88,6 +88,36 @@ pub const Db = struct { | |||
| 88 | _ = c.sqlite3_close(self.db); | 88 | _ = c.sqlite3_close(self.db); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | /// pragma is a convenience function to use the PRAGMA statement. | ||
| 92 | /// | ||
| 93 | /// Here is how to set a pragma value: | ||
| 94 | /// | ||
| 95 | /// try db.pragma(void, "foreign_keys", .{}, .{1}); | ||
| 96 | /// | ||
| 97 | /// Here is how to query a pragama value: | ||
| 98 | /// | ||
| 99 | /// const journal_mode = try db.pragma( | ||
| 100 | /// []const u8, | ||
| 101 | /// "journal_mode", | ||
| 102 | /// .{ .allocator = allocator }, | ||
| 103 | /// .{}, | ||
| 104 | /// ); | ||
| 105 | /// | ||
| 106 | /// The pragma name must be known at comptime. | ||
| 107 | pub fn pragma(self: *Self, comptime Type: type, comptime name: []const u8, options: anytype, arg: anytype) !?Type { | ||
| 108 | comptime var buf: [1024]u8 = undefined; | ||
| 109 | comptime var query = if (arg.len == 1) blk: { | ||
| 110 | break :blk try std.fmt.bufPrint(&buf, "PRAGMA {} = {}", .{ name, arg[0] }); | ||
| 111 | } else blk: { | ||
| 112 | break :blk try std.fmt.bufPrint(&buf, "PRAGMA {}", .{name}); | ||
| 113 | }; | ||
| 114 | |||
| 115 | var stmt = try self.prepare(query); | ||
| 116 | defer stmt.deinit(); | ||
| 117 | |||
| 118 | return try stmt.one(Type, options, .{}); | ||
| 119 | } | ||
| 120 | |||
| 91 | /// exec is a convenience function which prepares a statement and executes it directly. | 121 | /// exec is a convenience function which prepares a statement and executes it directly. |
| 92 | pub fn exec(self: *Self, comptime query: []const u8, values: anytype) !void { | 122 | pub fn exec(self: *Self, comptime query: []const u8, values: anytype) !void { |
| 93 | var stmt = try self.prepare(query); | 123 | var stmt = try self.prepare(query); |
| @@ -618,6 +648,27 @@ test "sqlite: db init" { | |||
| 618 | try db.init(testing.allocator, .{}); | 648 | try db.init(testing.allocator, .{}); |
| 619 | } | 649 | } |
| 620 | 650 | ||
| 651 | test "sqlite: db pragma" { | ||
| 652 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | ||
| 653 | defer arena.deinit(); | ||
| 654 | |||
| 655 | var db: Db = undefined; | ||
| 656 | try db.init(testing.allocator, .{ .mode = dbMode() }); | ||
| 657 | |||
| 658 | const foreign_keys = try db.pragma(usize, "foreign_keys", .{}, .{}); | ||
| 659 | testing.expect(foreign_keys != null); | ||
| 660 | testing.expectEqual(@as(usize, 0), foreign_keys.?); | ||
| 661 | |||
| 662 | const journal_mode = try db.pragma( | ||
| 663 | []const u8, | ||
| 664 | "journal_mode", | ||
| 665 | .{ .allocator = &arena.allocator }, | ||
| 666 | .{"wal"}, | ||
| 667 | ); | ||
| 668 | testing.expect(journal_mode != null); | ||
| 669 | testing.expectEqualStrings("wal", journal_mode.?); | ||
| 670 | } | ||
| 671 | |||
| 621 | test "sqlite: statement exec" { | 672 | test "sqlite: statement exec" { |
| 622 | var db: Db = undefined; | 673 | var db: Db = undefined; |
| 623 | try db.init(testing.allocator, .{ .mode = dbMode() }); | 674 | try db.init(testing.allocator, .{ .mode = dbMode() }); |