summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Vincent Rischmann2024-12-19 01:02:33 +0100
committerGravatar Vincent Rischmann2024-12-19 01:02:41 +0100
commit5fb342c99cf80cd0be05a410bb251956aa0decab (patch)
treeca3be165114f929da14dc0bd87679c0ccdbe89f2
parentdynamic statement: add prepareWithTail (diff)
downloadzig-sqlite-5fb342c99cf80cd0be05a410bb251956aa0decab.tar.gz
zig-sqlite-5fb342c99cf80cd0be05a410bb251956aa0decab.tar.xz
zig-sqlite-5fb342c99cf80cd0be05a410bb251956aa0decab.zip
rework execMulti
We don't have to expose the tail pointer to get execMulti to work: the tail pointer can stay local to execMulti instead of polluting the QueryOptions. This is a breaking change but as far as I can tell people only use execMulti, never the tail pointer for anything, so I guess it's fine.
Diffstat (limited to '')
-rw-r--r--sqlite.zig31
1 files changed, 6 insertions, 25 deletions
diff --git a/sqlite.zig b/sqlite.zig
index b1f9f81..97ef60f 100644
--- a/sqlite.zig
+++ b/sqlite.zig
@@ -810,30 +810,16 @@ pub const Db = struct {
810 /// 810 ///
811 /// Exmaple: 'create table a(); create table b();' 811 /// Exmaple: 'create table a(); create table b();'
812 pub fn execMulti(self: *Self, query: []const u8, options: QueryOptions) !void { 812 pub fn execMulti(self: *Self, query: []const u8, options: QueryOptions) !void {
813 var new_options = options; 813 var sql_tail: [*c]const u8 = query.ptr;
814 var sql_tail_ptr: ?[*:0]const u8 = null;
815 new_options.sql_tail_ptr = &sql_tail_ptr;
816 814
817 while (true) { 815 while (true) {
818 // continuously prepare and execute (dynamically as there's no 816 const new_query = std.mem.span(sql_tail);
819 // values to bind in this case) 817 if (new_query.len == 0) return;
820 var stmt: DynamicStatement = undefined;
821 if (sql_tail_ptr != null) {
822 const new_query = std.mem.span(sql_tail_ptr.?);
823 if (new_query.len == 0) break;
824 stmt = self.prepareDynamicWithDiags(new_query, new_options) catch |err| switch (err) {
825 error.EmptyQuery => break,
826 else => return err,
827 };
828 } else {
829 stmt = self.prepareDynamicWithDiags(query, new_options) catch |err| switch (err) {
830 error.EmptyQuery => break,
831 else => return err,
832 };
833 }
834 818
819 var stmt = try DynamicStatement.prepareWithTail(self, new_query, options, 0, &sql_tail);
835 defer stmt.deinit(); 820 defer stmt.deinit();
836 try stmt.exec(new_options, .{}); 821
822 try stmt.exec(options, .{});
837 } 823 }
838 } 824 }
839 825
@@ -1030,11 +1016,6 @@ pub const Savepoint = struct {
1030pub const QueryOptions = struct { 1016pub const QueryOptions = struct {
1031 /// if provided, diags will be populated in case of failures. 1017 /// if provided, diags will be populated in case of failures.
1032 diags: ?*Diagnostics = null, 1018 diags: ?*Diagnostics = null,
1033
1034 /// if provided, sql_tail_ptr will point to the last uncompiled statement
1035 /// in the prepare() call. this is useful for multiple-statements being
1036 /// processed.
1037 sql_tail_ptr: ?*?[*:0]const u8 = null,
1038}; 1019};
1039 1020
1040/// Iterator allows iterating over a result set. 1021/// Iterator allows iterating over a result set.