diff options
Diffstat (limited to 'sqlite.zig')
| -rw-r--r-- | sqlite.zig | 46 |
1 files changed, 3 insertions, 43 deletions
| @@ -15,6 +15,9 @@ pub const ParsedQuery = @import("query.zig").ParsedQuery; | |||
| 15 | const errors = @import("errors.zig"); | 15 | const errors = @import("errors.zig"); |
| 16 | pub const errorFromResultCode = errors.errorFromResultCode; | 16 | pub const errorFromResultCode = errors.errorFromResultCode; |
| 17 | pub const Error = errors.Error; | 17 | pub const Error = errors.Error; |
| 18 | pub const DetailedError = errors.DetailedError; | ||
| 19 | const getLastDetailedErrorFromDb = errors.getLastDetailedErrorFromDb; | ||
| 20 | const getDetailedErrorFromResultCode = errors.getDetailedErrorFromResultCode; | ||
| 18 | 21 | ||
| 19 | const logger = std.log.scoped(.sqlite); | 22 | const logger = std.log.scoped(.sqlite); |
| 20 | 23 | ||
| @@ -255,53 +258,10 @@ pub const InitOptions = struct { | |||
| 255 | diags: ?*Diagnostics = null, | 258 | diags: ?*Diagnostics = null, |
| 256 | }; | 259 | }; |
| 257 | 260 | ||
| 258 | /// DetailedError contains a SQLite error code and error message. | ||
| 259 | pub const DetailedError = struct { | ||
| 260 | code: usize, | ||
| 261 | near: i32, | ||
| 262 | message: []const u8, | ||
| 263 | |||
| 264 | pub fn format(self: @This(), comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void { | ||
| 265 | _ = fmt; | ||
| 266 | _ = options; | ||
| 267 | |||
| 268 | _ = try writer.print("{{code: {}, near: {d}, message: {s}}}", .{ self.code, self.near, self.message }); | ||
| 269 | } | ||
| 270 | }; | ||
| 271 | |||
| 272 | fn isThreadSafe() bool { | 261 | fn isThreadSafe() bool { |
| 273 | return c.sqlite3_threadsafe() > 0; | 262 | return c.sqlite3_threadsafe() > 0; |
| 274 | } | 263 | } |
| 275 | 264 | ||
| 276 | fn getDetailedErrorFromResultCode(code: c_int) DetailedError { | ||
| 277 | return .{ | ||
| 278 | .code = @intCast(usize, code), | ||
| 279 | .near = -1, | ||
| 280 | .message = blk: { | ||
| 281 | const msg = c.sqlite3_errstr(code); | ||
| 282 | break :blk mem.sliceTo(msg, 0); | ||
| 283 | }, | ||
| 284 | }; | ||
| 285 | } | ||
| 286 | |||
| 287 | fn getErrorOffset(db: *c.sqlite3) i32 { | ||
| 288 | if (c.SQLITE_VERSION_NUMBER >= 3038000) { | ||
| 289 | return c.sqlite3_error_offset(db); | ||
| 290 | } | ||
| 291 | return -1; | ||
| 292 | } | ||
| 293 | |||
| 294 | fn getLastDetailedErrorFromDb(db: *c.sqlite3) DetailedError { | ||
| 295 | return .{ | ||
| 296 | .code = @intCast(usize, c.sqlite3_extended_errcode(db)), | ||
| 297 | .near = getErrorOffset(db), | ||
| 298 | .message = blk: { | ||
| 299 | const msg = c.sqlite3_errmsg(db); | ||
| 300 | break :blk mem.sliceTo(msg, 0); | ||
| 301 | }, | ||
| 302 | }; | ||
| 303 | } | ||
| 304 | |||
| 305 | /// Db is a wrapper around a SQLite database, providing high-level functions for executing queries. | 265 | /// Db is a wrapper around a SQLite database, providing high-level functions for executing queries. |
| 306 | /// A Db can be opened with a file database or a in-memory database: | 266 | /// A Db can be opened with a file database or a in-memory database: |
| 307 | /// | 267 | /// |