summaryrefslogtreecommitdiff
path: root/sqlite.zig
diff options
context:
space:
mode:
Diffstat (limited to 'sqlite.zig')
-rw-r--r--sqlite.zig111
1 files changed, 83 insertions, 28 deletions
diff --git a/sqlite.zig b/sqlite.zig
index 4cd91fd..bc1235a 100644
--- a/sqlite.zig
+++ b/sqlite.zig
@@ -994,6 +994,26 @@ test "sqlite: read a single user into a struct" {
994 994
995 // Read a row with db.one() 995 // Read a row with db.one()
996 { 996 {
997 var row = try db.one(
998 struct {
999 id: usize,
1000 name: [128:0]u8,
1001 age: usize,
1002 },
1003 "SELECT id, name, age FROM user WHERE id = ?{usize}",
1004 .{},
1005 .{@as(usize, 20)},
1006 );
1007 testing.expect(row != null);
1008
1009 const exp = test_users[0];
1010 testing.expectEqual(exp.id, row.?.id);
1011 testing.expectEqualStrings(exp.name, mem.spanZ(&row.?.name));
1012 testing.expectEqual(exp.age, row.?.age);
1013 }
1014
1015 // Read a row with db.oneAlloc()
1016 {
997 var row = try db.oneAlloc( 1017 var row = try db.oneAlloc(
998 struct { 1018 struct {
999 id: usize, 1019 id: usize,
@@ -1129,12 +1149,9 @@ test "sqlite: read a single text value" {
1129 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 1149 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query);
1130 defer stmt.deinit(); 1150 defer stmt.deinit();
1131 1151
1132 const name = try stmt.oneAlloc( 1152 const name = try stmt.oneAlloc(typ, &arena.allocator, .{}, .{
1133 typ, 1153 .id = @as(usize, 20),
1134 &arena.allocator, 1154 });
1135 .{},
1136 .{ .id = @as(usize, 20) },
1137 );
1138 testing.expect(name != null); 1155 testing.expect(name != null);
1139 switch (typ) { 1156 switch (typ) {
1140 Text, Blob => { 1157 Text, Blob => {
@@ -1181,7 +1198,9 @@ test "sqlite: read a single integer value" {
1181 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 1198 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query);
1182 defer stmt.deinit(); 1199 defer stmt.deinit();
1183 1200
1184 var age = try stmt.one(typ, .{}, .{ .id = @as(usize, 20) }); 1201 var age = try stmt.one(typ, .{}, .{
1202 .id = @as(usize, 20),
1203 });
1185 testing.expect(age != null); 1204 testing.expect(age != null);
1186 1205
1187 testing.expectEqual(@as(typ, 33), age.?); 1206 testing.expectEqual(@as(typ, 33), age.?);
@@ -1198,7 +1217,9 @@ test "sqlite: read a single value into void" {
1198 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 1217 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query);
1199 defer stmt.deinit(); 1218 defer stmt.deinit();
1200 1219
1201 _ = try stmt.one(void, .{}, .{ .id = @as(usize, 20) }); 1220 _ = try stmt.one(void, .{}, .{
1221 .id = @as(usize, 20),
1222 });
1202} 1223}
1203 1224
1204test "sqlite: read a single value into bool" { 1225test "sqlite: read a single value into bool" {
@@ -1211,7 +1232,9 @@ test "sqlite: read a single value into bool" {
1211 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 1232 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query);
1212 defer stmt.deinit(); 1233 defer stmt.deinit();
1213 1234
1214 const b = try stmt.one(bool, .{}, .{ .id = @as(usize, 20) }); 1235 const b = try stmt.one(bool, .{}, .{
1236 .id = @as(usize, 20),
1237 });
1215 testing.expect(b != null); 1238 testing.expect(b != null);
1216 testing.expect(b.?); 1239 testing.expect(b.?);
1217} 1240}
@@ -1232,7 +1255,9 @@ test "sqlite: insert bool and bind bool" {
1232 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query); 1255 var stmt: Statement(.{}, ParsedQuery.from(query)) = try db.prepare(query);
1233 defer stmt.deinit(); 1256 defer stmt.deinit();
1234 1257
1235 const b = try stmt.one(bool, .{}, .{ .is_published = true }); 1258 const b = try stmt.one(bool, .{}, .{
1259 .is_published = true,
1260 });
1236 testing.expect(b != null); 1261 testing.expect(b != null);
1237 testing.expect(b.?); 1262 testing.expect(b.?);
1238} 1263}
@@ -1293,30 +1318,60 @@ test "sqlite: statement iterator" {
1293 testing.expectEqual(@as(usize, 1), rows_inserted); 1318 testing.expectEqual(@as(usize, 1), rows_inserted);
1294 } 1319 }
1295 1320
1296 // Get the data with an iterator 1321 // Get data with a non-allocating iterator.
1297 var stmt2 = try db.prepare("SELECT name, age FROM user"); 1322 {
1298 defer stmt2.deinit(); 1323 var stmt2 = try db.prepare("SELECT name, age FROM user");
1324 defer stmt2.deinit();
1299 1325
1300 const Type = struct { 1326 const RowType = struct {
1301 name: Text, 1327 name: [128:0]u8,
1302 age: usize, 1328 age: usize,
1303 }; 1329 };
1330
1331 var iter = try stmt2.iterator(RowType, .{});
1332
1333 var rows = std.ArrayList(RowType).init(allocator);
1334 while (true) {
1335 const row = (try iter.next(.{})) orelse break;
1336 try rows.append(row);
1337 }
1304 1338
1305 var iter = try stmt2.iterator(Type, .{}); 1339 // Check the data
1340 testing.expectEqual(expected_rows.items.len, rows.items.len);
1306 1341
1307 var rows = std.ArrayList(Type).init(allocator); 1342 for (rows.items) |row, j| {
1308 while (true) { 1343 const exp_row = expected_rows.items[j];
1309 const row = (try iter.nextAlloc(allocator, .{})) orelse break; 1344 testing.expectEqualStrings(exp_row.name, mem.spanZ(&row.name));
1310 try rows.append(row); 1345 testing.expectEqual(exp_row.age, row.age);
1346 }
1311 } 1347 }
1312 1348
1313 // Check the data 1349 // Get data with an iterator
1314 testing.expectEqual(expected_rows.items.len, rows.items.len); 1350 {
1351 var stmt2 = try db.prepare("SELECT name, age FROM user");
1352 defer stmt2.deinit();
1353
1354 const RowType = struct {
1355 name: Text,
1356 age: usize,
1357 };
1315 1358
1316 for (rows.items) |row, j| { 1359 var iter = try stmt2.iterator(RowType, .{});
1317 const exp_row = expected_rows.items[j]; 1360
1318 testing.expectEqualStrings(exp_row.name, row.name.data); 1361 var rows = std.ArrayList(RowType).init(allocator);
1319 testing.expectEqual(exp_row.age, row.age); 1362 while (true) {
1363 const row = (try iter.nextAlloc(allocator, .{})) orelse break;
1364 try rows.append(row);
1365 }
1366
1367 // Check the data
1368 testing.expectEqual(expected_rows.items.len, rows.items.len);
1369
1370 for (rows.items) |row, j| {
1371 const exp_row = expected_rows.items[j];
1372 testing.expectEqualStrings(exp_row.name, row.name.data);
1373 testing.expectEqual(exp_row.age, row.age);
1374 }
1320 } 1375 }
1321} 1376}
1322 1377