summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sqlite.zig57
1 files changed, 57 insertions, 0 deletions
diff --git a/sqlite.zig b/sqlite.zig
index 8662262..3ef2692 100644
--- a/sqlite.zig
+++ b/sqlite.zig
@@ -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
2262const 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
2284test "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}