diff options
| -rw-r--r-- | sqlite.zig | 57 |
1 files changed, 57 insertions, 0 deletions
| @@ -2258,3 +2258,60 @@ fn dbMode(allocator: *mem.Allocator) Db.Mode { | |||
| 2258 | break :blk .{ .File = path }; | 2258 | break :blk .{ .File = path }; |
| 2259 | }; | 2259 | }; |
| 2260 | } | 2260 | } |
| 2261 | |||
| 2262 | const MyData = struct { | ||
| 2263 | data: [16]u8, | ||
| 2264 | |||
| 2265 | const BaseType = []const u8; | ||
| 2266 | |||
| 2267 | pub fn bindField(self: MyData, allocator: *std.mem.Allocator) !BaseType { | ||
| 2268 | return try std.fmt.allocPrint(allocator, "{}", .{std.fmt.fmtSliceHexLower(&self.data)}); | ||
| 2269 | } | ||
| 2270 | |||
| 2271 | pub fn readField(alloc: *std.mem.Allocator, value: BaseType) !MyData { | ||
| 2272 | _ = alloc; | ||
| 2273 | |||
| 2274 | var result = [_]u8{0} ** 16; | ||
| 2275 | var i: usize = 0; | ||
| 2276 | while (i < result.len) : (i += 1) { | ||
| 2277 | const j = i * 2; | ||
| 2278 | result[i] = std.fmt.parseUnsigned(u8, value[j..][0..2], 16) catch unreachable; | ||
| 2279 | } | ||
| 2280 | return MyData{ .data = result }; | ||
| 2281 | } | ||
| 2282 | }; | ||
| 2283 | |||
| 2284 | test "sqlite: bind custom type" { | ||
| 2285 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | ||
| 2286 | defer arena.deinit(); | ||
| 2287 | |||
| 2288 | var db = try getTestDb(); | ||
| 2289 | try addTestData(&db); | ||
| 2290 | |||
| 2291 | const my_data = MyData{ | ||
| 2292 | .data = [_]u8{'x'} ** 16, | ||
| 2293 | }; | ||
| 2294 | |||
| 2295 | { | ||
| 2296 | // insertion | ||
| 2297 | var stmt = try db.prepare("INSERT INTO article(data) VALUES(?)"); | ||
| 2298 | try stmt.execAlloc(&arena.allocator, .{}, .{my_data}); | ||
| 2299 | } | ||
| 2300 | { | ||
| 2301 | // reading back | ||
| 2302 | var stmt = try db.prepare("SELECT * FROM article"); | ||
| 2303 | defer stmt.deinit(); | ||
| 2304 | |||
| 2305 | const Article = struct { | ||
| 2306 | id: u32, | ||
| 2307 | author_id: u32, | ||
| 2308 | data: MyData, | ||
| 2309 | is_published: bool, | ||
| 2310 | }; | ||
| 2311 | |||
| 2312 | const row = try stmt.oneAlloc(Article, &arena.allocator, .{}, .{}); | ||
| 2313 | |||
| 2314 | try testing.expect(row != null); | ||
| 2315 | try testing.expectEqualSlices(u8, &my_data.data, &row.?.data.data); | ||
| 2316 | } | ||
| 2317 | } | ||