diff options
Diffstat (limited to 'sqlite.zig')
| -rw-r--r-- | sqlite.zig | 12 |
1 files changed, 9 insertions, 3 deletions
| @@ -257,13 +257,14 @@ pub const InitOptions = struct { | |||
| 257 | /// DetailedError contains a SQLite error code and error message. | 257 | /// DetailedError contains a SQLite error code and error message. |
| 258 | pub const DetailedError = struct { | 258 | pub const DetailedError = struct { |
| 259 | code: usize, | 259 | code: usize, |
| 260 | near: i32, | ||
| 260 | message: []const u8, | 261 | message: []const u8, |
| 261 | 262 | ||
| 262 | pub fn format(self: @This(), comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void { | 263 | pub fn format(self: @This(), comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void { |
| 263 | _ = fmt; | 264 | _ = fmt; |
| 264 | _ = options; | 265 | _ = options; |
| 265 | 266 | ||
| 266 | _ = try writer.print("{{code: {}, message: {s}}}", .{ self.code, self.message }); | 267 | _ = try writer.print("{{code: {}, near: {d}, message: {s}}}", .{ self.code, self.near, self.message }); |
| 267 | } | 268 | } |
| 268 | }; | 269 | }; |
| 269 | 270 | ||
| @@ -274,6 +275,7 @@ fn isThreadSafe() bool { | |||
| 274 | fn getDetailedErrorFromResultCode(code: c_int) DetailedError { | 275 | fn getDetailedErrorFromResultCode(code: c_int) DetailedError { |
| 275 | return .{ | 276 | return .{ |
| 276 | .code = @intCast(usize, code), | 277 | .code = @intCast(usize, code), |
| 278 | .near = -1, | ||
| 277 | .message = blk: { | 279 | .message = blk: { |
| 278 | const msg = c.sqlite3_errstr(code); | 280 | const msg = c.sqlite3_errstr(code); |
| 279 | break :blk mem.sliceTo(msg, 0); | 281 | break :blk mem.sliceTo(msg, 0); |
| @@ -284,6 +286,7 @@ fn getDetailedErrorFromResultCode(code: c_int) DetailedError { | |||
| 284 | fn getLastDetailedErrorFromDb(db: *c.sqlite3) DetailedError { | 286 | fn getLastDetailedErrorFromDb(db: *c.sqlite3) DetailedError { |
| 285 | return .{ | 287 | return .{ |
| 286 | .code = @intCast(usize, c.sqlite3_extended_errcode(db)), | 288 | .code = @intCast(usize, c.sqlite3_extended_errcode(db)), |
| 289 | .near = @intCast(i32, c.sqlite3_error_offset(db)), | ||
| 287 | .message = blk: { | 290 | .message = blk: { |
| 288 | const msg = c.sqlite3_errmsg(db); | 291 | const msg = c.sqlite3_errmsg(db); |
| 289 | break :blk mem.sliceTo(msg, 0); | 292 | break :blk mem.sliceTo(msg, 0); |
| @@ -1255,6 +1258,7 @@ pub const DynamicStatement = struct { | |||
| 1255 | if (tmp == null) { | 1258 | if (tmp == null) { |
| 1256 | diags.err = .{ | 1259 | diags.err = .{ |
| 1257 | .code = 0, | 1260 | .code = 0, |
| 1261 | .near = -1, | ||
| 1258 | .message = "the input query is not valid SQL (empty string or a comment)", | 1262 | .message = "the input query is not valid SQL (empty string or a comment)", |
| 1259 | }; | 1263 | }; |
| 1260 | return error.SQLiteError; | 1264 | return error.SQLiteError; |
| @@ -2760,20 +2764,22 @@ test "sqlite: diagnostics format" { | |||
| 2760 | .input = .{ | 2764 | .input = .{ |
| 2761 | .err = .{ | 2765 | .err = .{ |
| 2762 | .code = 20, | 2766 | .code = 20, |
| 2767 | .near = -1, | ||
| 2763 | .message = "barbaz", | 2768 | .message = "barbaz", |
| 2764 | }, | 2769 | }, |
| 2765 | }, | 2770 | }, |
| 2766 | .exp = "my diagnostics: {code: 20, message: barbaz}", | 2771 | .exp = "my diagnostics: {code: 20, near: -1, message: barbaz}", |
| 2767 | }, | 2772 | }, |
| 2768 | .{ | 2773 | .{ |
| 2769 | .input = .{ | 2774 | .input = .{ |
| 2770 | .message = "foobar", | 2775 | .message = "foobar", |
| 2771 | .err = .{ | 2776 | .err = .{ |
| 2772 | .code = 20, | 2777 | .code = 20, |
| 2778 | .near = 10, | ||
| 2773 | .message = "barbaz", | 2779 | .message = "barbaz", |
| 2774 | }, | 2780 | }, |
| 2775 | }, | 2781 | }, |
| 2776 | .exp = "my diagnostics: {message: foobar, detailed error: {code: 20, message: barbaz}}", | 2782 | .exp = "my diagnostics: {message: foobar, detailed error: {code: 20, near: 10, message: barbaz}}", |
| 2777 | }, | 2783 | }, |
| 2778 | }; | 2784 | }; |
| 2779 | 2785 | ||