diff options
Diffstat (limited to 'sqlite.zig')
| -rw-r--r-- | sqlite.zig | 111 |
1 files changed, 83 insertions, 28 deletions
| @@ -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 | ||
| 1204 | test "sqlite: read a single value into bool" { | 1225 | test "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 | ||