From 660ebd3dbf4764a21ac17a2fc0b17d2a23264074 Mon Sep 17 00:00:00 2001 From: Vincent Rischmann Date: Wed, 13 Oct 2021 01:01:41 +0200 Subject: add the StatementType function This function returns the type of a statement as would be returned by Db.prepare. Needed to be able to store a statement in a struct. --- sqlite.zig | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) (limited to 'sqlite.zig') diff --git a/sqlite.zig b/sqlite.zig index ecf78c9..af970a1 100644 --- a/sqlite.zig +++ b/sqlite.zig @@ -488,7 +488,7 @@ pub const Db = struct { /// prepareWithDiags is like `prepare` but takes an additional options argument. pub fn prepareWithDiags(self: *Self, comptime query: []const u8, options: QueryOptions) !blk: { @setEvalBranchQuota(100000); - break :blk Statement(.{}, ParsedQuery.from(query)); + break :blk StatementType(.{}, query); } { @setEvalBranchQuota(100000); const parsed_query = ParsedQuery.from(query); @@ -516,7 +516,7 @@ pub const Db = struct { /// If you want additional error information in case of failures, use `prepareWithDiags`. pub fn prepare(self: *Self, comptime query: []const u8) !blk: { @setEvalBranchQuota(100000); - break :blk Statement(.{}, ParsedQuery.from(query)); + break :blk StatementType(.{}, query); } { @setEvalBranchQuota(100000); const parsed_query = ParsedQuery.from(query); @@ -1028,6 +1028,20 @@ pub fn Iterator(comptime Type: type) type { }; } +/// StatementType returns the type of a statement you would get by calling Db.prepare and derivatives. +/// +/// Useful if you want to store a statement in a struct, for example: +/// +/// const MyStatements = struct { +/// insert_stmt: sqlite.StatementType(.{}, insert_query), +/// delete_stmt: sqlite.StatementType(.{}, delete_query), +/// }; +/// +pub fn StatementType(comptime opts: StatementOptions, comptime query: []const u8) type { + @setEvalBranchQuota(100000); + return Statement(opts, ParsedQuery.from(query)); +} + pub const StatementOptions = struct {}; /// DynamicStatement represents a statement in sqlite3. It almost works like sqlite3_stmt. @@ -1989,7 +2003,7 @@ test "sqlite: read a single text value" { inline for (types) |typ| { const query = "SELECT name FROM user WHERE id = ?{usize}"; - var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); + var stmt: StatementType(.{}, query) = try db.prepare(query); defer stmt.deinit(); const name = try stmt.oneAlloc(typ, &arena.allocator, .{}, .{ @@ -2036,7 +2050,7 @@ test "sqlite: read a single integer value" { inline for (types) |typ| { const query = "SELECT age FROM user WHERE id = ?{usize}"; - var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); + var stmt: StatementType(.{}, query) = try db.prepare(query); defer stmt.deinit(); var age = try stmt.one(typ, .{}, .{ @@ -2070,7 +2084,7 @@ test "sqlite: read a single value into an enum backed by an integer" { // Use one { - var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); + var stmt: StatementType(.{}, query) = try db.prepare(query); defer stmt.deinit(); const b = try stmt.one(IntColor, .{}, .{ @@ -2082,7 +2096,7 @@ test "sqlite: read a single value into an enum backed by an integer" { // Use oneAlloc { - var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); + var stmt: StatementType(.{}, query) = try db.prepare(query); defer stmt.deinit(); const b = try stmt.oneAlloc(IntColor, &arena.allocator, .{}, .{ @@ -2107,7 +2121,7 @@ test "sqlite: read a single value into an enum backed by a string" { const query = "SELECT favorite_color FROM user WHERE id = ?{usize}"; - var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); + var stmt: StatementType(.{}, query) = try db.prepare(query); defer stmt.deinit(); const b = try stmt.oneAlloc(TestUser.Color, &arena.allocator, .{}, .{ @@ -2123,7 +2137,7 @@ test "sqlite: read a single value into void" { const query = "SELECT age FROM user WHERE id = ?{usize}"; - var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); + var stmt: StatementType(.{}, query) = try db.prepare(query); defer stmt.deinit(); _ = try stmt.one(void, .{}, .{ @@ -2137,7 +2151,7 @@ test "sqlite: read a single value into bool" { const query = "SELECT id FROM user WHERE id = ?{usize}"; - var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); + var stmt: StatementType(.{}, query) = try db.prepare(query); defer stmt.deinit(); const b = try stmt.one(bool, .{}, .{ @@ -2159,7 +2173,7 @@ test "sqlite: insert bool and bind bool" { const query = "SELECT id FROM article WHERE is_published = ?{bool}"; - var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); + var stmt: StatementType(.{}, query) = try db.prepare(query); defer stmt.deinit(); const b = try stmt.one(bool, .{}, .{ -- cgit v1.2.3