summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Vincent Rischmann2021-10-13 01:01:41 +0200
committerGravatar Vincent Rischmann2021-10-13 19:37:06 +0200
commit660ebd3dbf4764a21ac17a2fc0b17d2a23264074 (patch)
tree7712896bdff193d0b0462fdb52bb8e578a38b8cd
parentMerge pull request #53 from kacheproject/dynamic-stmt-oldbuild (diff)
downloadzig-sqlite-660ebd3dbf4764a21ac17a2fc0b17d2a23264074.tar.gz
zig-sqlite-660ebd3dbf4764a21ac17a2fc0b17d2a23264074.tar.xz
zig-sqlite-660ebd3dbf4764a21ac17a2fc0b17d2a23264074.zip
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.
-rw-r--r--sqlite.zig34
1 files changed, 24 insertions, 10 deletions
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 {
488 /// prepareWithDiags is like `prepare` but takes an additional options argument. 488 /// prepareWithDiags is like `prepare` but takes an additional options argument.
489 pub fn prepareWithDiags(self: *Self, comptime query: []const u8, options: QueryOptions) !blk: { 489 pub fn prepareWithDiags(self: *Self, comptime query: []const u8, options: QueryOptions) !blk: {
490 @setEvalBranchQuota(100000); 490 @setEvalBranchQuota(100000);
491 break :blk Statement(.{}, ParsedQuery.from(query)); 491 break :blk StatementType(.{}, query);
492 } { 492 } {
493 @setEvalBranchQuota(100000); 493 @setEvalBranchQuota(100000);
494 const parsed_query = ParsedQuery.from(query); 494 const parsed_query = ParsedQuery.from(query);
@@ -516,7 +516,7 @@ pub const Db = struct {
516 /// If you want additional error information in case of failures, use `prepareWithDiags`. 516 /// If you want additional error information in case of failures, use `prepareWithDiags`.
517 pub fn prepare(self: *Self, comptime query: []const u8) !blk: { 517 pub fn prepare(self: *Self, comptime query: []const u8) !blk: {
518 @setEvalBranchQuota(100000); 518 @setEvalBranchQuota(100000);
519 break :blk Statement(.{}, ParsedQuery.from(query)); 519 break :blk StatementType(.{}, query);
520 } { 520 } {
521 @setEvalBranchQuota(100000); 521 @setEvalBranchQuota(100000);
522 const parsed_query = ParsedQuery.from(query); 522 const parsed_query = ParsedQuery.from(query);
@@ -1028,6 +1028,20 @@ pub fn Iterator(comptime Type: type) type {
1028 }; 1028 };
1029} 1029}
1030 1030
1031/// StatementType returns the type of a statement you would get by calling Db.prepare and derivatives.
1032///
1033/// Useful if you want to store a statement in a struct, for example:
1034///
1035/// const MyStatements = struct {
1036/// insert_stmt: sqlite.StatementType(.{}, insert_query),
1037/// delete_stmt: sqlite.StatementType(.{}, delete_query),
1038/// };
1039///
1040pub fn StatementType(comptime opts: StatementOptions, comptime query: []const u8) type {
1041 @setEvalBranchQuota(100000);
1042 return Statement(opts, ParsedQuery.from(query));
1043}
1044
1031pub const StatementOptions = struct {}; 1045pub const StatementOptions = struct {};
1032 1046
1033/// DynamicStatement represents a statement in sqlite3. It almost works like sqlite3_stmt. 1047/// DynamicStatement represents a statement in sqlite3. It almost works like sqlite3_stmt.
@@ -1989,7 +2003,7 @@ test "sqlite: read a single text value" {
1989 inline for (types) |typ| { 2003 inline for (types) |typ| {
1990 const query = "SELECT name FROM user WHERE id = ?{usize}"; 2004 const query = "SELECT name FROM user WHERE id = ?{usize}";
1991 2005
1992 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 2006 var stmt: StatementType(.{}, query) = try db.prepare(query);
1993 defer stmt.deinit(); 2007 defer stmt.deinit();
1994 2008
1995 const name = try stmt.oneAlloc(typ, &arena.allocator, .{}, .{ 2009 const name = try stmt.oneAlloc(typ, &arena.allocator, .{}, .{
@@ -2036,7 +2050,7 @@ test "sqlite: read a single integer value" {
2036 inline for (types) |typ| { 2050 inline for (types) |typ| {
2037 const query = "SELECT age FROM user WHERE id = ?{usize}"; 2051 const query = "SELECT age FROM user WHERE id = ?{usize}";
2038 2052
2039 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 2053 var stmt: StatementType(.{}, query) = try db.prepare(query);
2040 defer stmt.deinit(); 2054 defer stmt.deinit();
2041 2055
2042 var age = try stmt.one(typ, .{}, .{ 2056 var age = try stmt.one(typ, .{}, .{
@@ -2070,7 +2084,7 @@ test "sqlite: read a single value into an enum backed by an integer" {
2070 2084
2071 // Use one 2085 // Use one
2072 { 2086 {
2073 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 2087 var stmt: StatementType(.{}, query) = try db.prepare(query);
2074 defer stmt.deinit(); 2088 defer stmt.deinit();
2075 2089
2076 const b = try stmt.one(IntColor, .{}, .{ 2090 const b = try stmt.one(IntColor, .{}, .{
@@ -2082,7 +2096,7 @@ test "sqlite: read a single value into an enum backed by an integer" {
2082 2096
2083 // Use oneAlloc 2097 // Use oneAlloc
2084 { 2098 {
2085 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 2099 var stmt: StatementType(.{}, query) = try db.prepare(query);
2086 defer stmt.deinit(); 2100 defer stmt.deinit();
2087 2101
2088 const b = try stmt.oneAlloc(IntColor, &arena.allocator, .{}, .{ 2102 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" {
2107 2121
2108 const query = "SELECT favorite_color FROM user WHERE id = ?{usize}"; 2122 const query = "SELECT favorite_color FROM user WHERE id = ?{usize}";
2109 2123
2110 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 2124 var stmt: StatementType(.{}, query) = try db.prepare(query);
2111 defer stmt.deinit(); 2125 defer stmt.deinit();
2112 2126
2113 const b = try stmt.oneAlloc(TestUser.Color, &arena.allocator, .{}, .{ 2127 const b = try stmt.oneAlloc(TestUser.Color, &arena.allocator, .{}, .{
@@ -2123,7 +2137,7 @@ test "sqlite: read a single value into void" {
2123 2137
2124 const query = "SELECT age FROM user WHERE id = ?{usize}"; 2138 const query = "SELECT age FROM user WHERE id = ?{usize}";
2125 2139
2126 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 2140 var stmt: StatementType(.{}, query) = try db.prepare(query);
2127 defer stmt.deinit(); 2141 defer stmt.deinit();
2128 2142
2129 _ = try stmt.one(void, .{}, .{ 2143 _ = try stmt.one(void, .{}, .{
@@ -2137,7 +2151,7 @@ test "sqlite: read a single value into bool" {
2137 2151
2138 const query = "SELECT id FROM user WHERE id = ?{usize}"; 2152 const query = "SELECT id FROM user WHERE id = ?{usize}";
2139 2153
2140 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 2154 var stmt: StatementType(.{}, query) = try db.prepare(query);
2141 defer stmt.deinit(); 2155 defer stmt.deinit();
2142 2156
2143 const b = try stmt.one(bool, .{}, .{ 2157 const b = try stmt.one(bool, .{}, .{
@@ -2159,7 +2173,7 @@ test "sqlite: insert bool and bind bool" {
2159 2173
2160 const query = "SELECT id FROM article WHERE is_published = ?{bool}"; 2174 const query = "SELECT id FROM article WHERE is_published = ?{bool}";
2161 2175
2162 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 2176 var stmt: StatementType(.{}, query) = try db.prepare(query);
2163 defer stmt.deinit(); 2177 defer stmt.deinit();
2164 2178
2165 const b = try stmt.one(bool, .{}, .{ 2179 const b = try stmt.one(bool, .{}, .{