diff options
| -rw-r--r-- | sqlite.zig | 93 |
1 files changed, 48 insertions, 45 deletions
| @@ -973,17 +973,14 @@ fn addTestData(db: *Db) !void { | |||
| 973 | } | 973 | } |
| 974 | 974 | ||
| 975 | test "sqlite: db init" { | 975 | test "sqlite: db init" { |
| 976 | var db: Db = undefined; | 976 | var db = try getTestDb(); |
| 977 | try db.init(initOptions()); | ||
| 978 | try db.init(.{}); | ||
| 979 | } | 977 | } |
| 980 | 978 | ||
| 981 | test "sqlite: db pragma" { | 979 | test "sqlite: db pragma" { |
| 982 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 980 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 983 | defer arena.deinit(); | 981 | defer arena.deinit(); |
| 984 | 982 | ||
| 985 | var db: Db = undefined; | 983 | var db = try getTestDb(); |
| 986 | try db.init(initOptions()); | ||
| 987 | 984 | ||
| 988 | const foreign_keys = try db.pragma(usize, .{}, "foreign_keys", .{}); | 985 | const foreign_keys = try db.pragma(usize, .{}, "foreign_keys", .{}); |
| 989 | testing.expect(foreign_keys != null); | 986 | testing.expect(foreign_keys != null); |
| @@ -1019,8 +1016,7 @@ test "sqlite: db pragma" { | |||
| 1019 | } | 1016 | } |
| 1020 | 1017 | ||
| 1021 | test "sqlite: statement exec" { | 1018 | test "sqlite: statement exec" { |
| 1022 | var db: Db = undefined; | 1019 | var db = try getTestDb(); |
| 1023 | try db.init(initOptions()); | ||
| 1024 | try addTestData(&db); | 1020 | try addTestData(&db); |
| 1025 | 1021 | ||
| 1026 | // Test with a Blob struct | 1022 | // Test with a Blob struct |
| @@ -1046,8 +1042,7 @@ test "sqlite: read a single user into a struct" { | |||
| 1046 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1042 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1047 | defer arena.deinit(); | 1043 | defer arena.deinit(); |
| 1048 | 1044 | ||
| 1049 | var db: Db = undefined; | 1045 | var db = try getTestDb(); |
| 1050 | try db.init(initOptions()); | ||
| 1051 | try addTestData(&db); | 1046 | try addTestData(&db); |
| 1052 | 1047 | ||
| 1053 | var stmt = try db.prepare("SELECT name, id, age, weight FROM user WHERE id = ?{usize}"); | 1048 | var stmt = try db.prepare("SELECT name, id, age, weight FROM user WHERE id = ?{usize}"); |
| @@ -1108,8 +1103,7 @@ test "sqlite: read all users into a struct" { | |||
| 1108 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1103 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1109 | defer arena.deinit(); | 1104 | defer arena.deinit(); |
| 1110 | 1105 | ||
| 1111 | var db: Db = undefined; | 1106 | var db = try getTestDb(); |
| 1112 | try db.init(initOptions()); | ||
| 1113 | try addTestData(&db); | 1107 | try addTestData(&db); |
| 1114 | 1108 | ||
| 1115 | var stmt = try db.prepare("SELECT name, id, age, weight FROM user"); | 1109 | var stmt = try db.prepare("SELECT name, id, age, weight FROM user"); |
| @@ -1130,8 +1124,7 @@ test "sqlite: read in an anonymous struct" { | |||
| 1130 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1124 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1131 | defer arena.deinit(); | 1125 | defer arena.deinit(); |
| 1132 | 1126 | ||
| 1133 | var db: Db = undefined; | 1127 | var db = try getTestDb(); |
| 1134 | try db.init(initOptions()); | ||
| 1135 | try addTestData(&db); | 1128 | try addTestData(&db); |
| 1136 | 1129 | ||
| 1137 | var stmt = try db.prepare("SELECT name, id, name, age, id, weight FROM user WHERE id = ?{usize}"); | 1130 | var stmt = try db.prepare("SELECT name, id, name, age, id, weight FROM user WHERE id = ?{usize}"); |
| @@ -1165,8 +1158,7 @@ test "sqlite: read in a Text struct" { | |||
| 1165 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1158 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1166 | defer arena.deinit(); | 1159 | defer arena.deinit(); |
| 1167 | 1160 | ||
| 1168 | var db: Db = undefined; | 1161 | var db = try getTestDb(); |
| 1169 | try db.init(initOptions()); | ||
| 1170 | try addTestData(&db); | 1162 | try addTestData(&db); |
| 1171 | 1163 | ||
| 1172 | var stmt = try db.prepare("SELECT name, id, age FROM user WHERE id = ?{usize}"); | 1164 | var stmt = try db.prepare("SELECT name, id, age FROM user WHERE id = ?{usize}"); |
| @@ -1194,8 +1186,7 @@ test "sqlite: read a single text value" { | |||
| 1194 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1186 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1195 | defer arena.deinit(); | 1187 | defer arena.deinit(); |
| 1196 | 1188 | ||
| 1197 | var db: Db = undefined; | 1189 | var db = try getTestDb(); |
| 1198 | try db.init(initOptions()); | ||
| 1199 | try addTestData(&db); | 1190 | try addTestData(&db); |
| 1200 | 1191 | ||
| 1201 | const types = &[_]type{ | 1192 | const types = &[_]type{ |
| @@ -1245,8 +1236,7 @@ test "sqlite: read a single text value" { | |||
| 1245 | } | 1236 | } |
| 1246 | 1237 | ||
| 1247 | test "sqlite: read a single integer value" { | 1238 | test "sqlite: read a single integer value" { |
| 1248 | var db: Db = undefined; | 1239 | var db = try getTestDb(); |
| 1249 | try db.init(initOptions()); | ||
| 1250 | try addTestData(&db); | 1240 | try addTestData(&db); |
| 1251 | 1241 | ||
| 1252 | const types = &[_]type{ | 1242 | const types = &[_]type{ |
| @@ -1279,8 +1269,7 @@ test "sqlite: read a single integer value" { | |||
| 1279 | } | 1269 | } |
| 1280 | 1270 | ||
| 1281 | test "sqlite: read a single value into void" { | 1271 | test "sqlite: read a single value into void" { |
| 1282 | var db: Db = undefined; | 1272 | var db = try getTestDb(); |
| 1283 | try db.init(initOptions()); | ||
| 1284 | try addTestData(&db); | 1273 | try addTestData(&db); |
| 1285 | 1274 | ||
| 1286 | const query = "SELECT age FROM user WHERE id = ?{usize}"; | 1275 | const query = "SELECT age FROM user WHERE id = ?{usize}"; |
| @@ -1294,8 +1283,7 @@ test "sqlite: read a single value into void" { | |||
| 1294 | } | 1283 | } |
| 1295 | 1284 | ||
| 1296 | test "sqlite: read a single value into bool" { | 1285 | test "sqlite: read a single value into bool" { |
| 1297 | var db: Db = undefined; | 1286 | var db = try getTestDb(); |
| 1298 | try db.init(initOptions()); | ||
| 1299 | try addTestData(&db); | 1287 | try addTestData(&db); |
| 1300 | 1288 | ||
| 1301 | const query = "SELECT id FROM user WHERE id = ?{usize}"; | 1289 | const query = "SELECT id FROM user WHERE id = ?{usize}"; |
| @@ -1311,8 +1299,7 @@ test "sqlite: read a single value into bool" { | |||
| 1311 | } | 1299 | } |
| 1312 | 1300 | ||
| 1313 | test "sqlite: insert bool and bind bool" { | 1301 | test "sqlite: insert bool and bind bool" { |
| 1314 | var db: Db = undefined; | 1302 | var db = try getTestDb(); |
| 1315 | try db.init(initOptions()); | ||
| 1316 | try addTestData(&db); | 1303 | try addTestData(&db); |
| 1317 | 1304 | ||
| 1318 | try db.exec("INSERT INTO article(id, author_id, is_published) VALUES(?{usize}, ?{usize}, ?{bool})", .{ | 1305 | try db.exec("INSERT INTO article(id, author_id, is_published) VALUES(?{usize}, ?{usize}, ?{bool})", .{ |
| @@ -1334,8 +1321,7 @@ test "sqlite: insert bool and bind bool" { | |||
| 1334 | } | 1321 | } |
| 1335 | 1322 | ||
| 1336 | test "sqlite: bind string literal" { | 1323 | test "sqlite: bind string literal" { |
| 1337 | var db: Db = undefined; | 1324 | var db = try getTestDb(); |
| 1338 | try db.init(initOptions()); | ||
| 1339 | try addTestData(&db); | 1325 | try addTestData(&db); |
| 1340 | 1326 | ||
| 1341 | try db.exec("INSERT INTO article(id, data) VALUES(?, ?)", .{ | 1327 | try db.exec("INSERT INTO article(id, data) VALUES(?, ?)", .{ |
| @@ -1357,8 +1343,7 @@ test "sqlite: bind pointer" { | |||
| 1357 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1343 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1358 | defer arena.deinit(); | 1344 | defer arena.deinit(); |
| 1359 | 1345 | ||
| 1360 | var db: Db = undefined; | 1346 | var db = try getTestDb(); |
| 1361 | try db.init(initOptions()); | ||
| 1362 | try addTestData(&db); | 1347 | try addTestData(&db); |
| 1363 | 1348 | ||
| 1364 | const query = "SELECT name FROM user WHERE id = ?"; | 1349 | const query = "SELECT name FROM user WHERE id = ?"; |
| @@ -1379,8 +1364,7 @@ test "sqlite: read pointers" { | |||
| 1379 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1364 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1380 | defer arena.deinit(); | 1365 | defer arena.deinit(); |
| 1381 | 1366 | ||
| 1382 | var db: Db = undefined; | 1367 | var db = try getTestDb(); |
| 1383 | try db.init(initOptions()); | ||
| 1384 | try addTestData(&db); | 1368 | try addTestData(&db); |
| 1385 | 1369 | ||
| 1386 | const query = "SELECT id, name, age, weight FROM user"; | 1370 | const query = "SELECT id, name, age, weight FROM user"; |
| @@ -1414,8 +1398,7 @@ test "sqlite: optional" { | |||
| 1414 | var arena = std.heap.ArenaAllocator.init(testing.allocator); | 1398 | var arena = std.heap.ArenaAllocator.init(testing.allocator); |
| 1415 | defer arena.deinit(); | 1399 | defer arena.deinit(); |
| 1416 | 1400 | ||
| 1417 | var db: Db = undefined; | 1401 | var db = try getTestDb(); |
| 1418 | try db.init(initOptions()); | ||
| 1419 | try addTestData(&db); | 1402 | try addTestData(&db); |
| 1420 | 1403 | ||
| 1421 | try db.exec("INSERT INTO article(author_id, data, is_published) VALUES(?, ?, ?)", .{ 1, null, true }); | 1404 | try db.exec("INSERT INTO article(author_id, data, is_published) VALUES(?, ?, ?)", .{ 1, null, true }); |
| @@ -1438,8 +1421,7 @@ test "sqlite: optional" { | |||
| 1438 | } | 1421 | } |
| 1439 | 1422 | ||
| 1440 | test "sqlite: statement reset" { | 1423 | test "sqlite: statement reset" { |
| 1441 | var db: Db = undefined; | 1424 | var db = try getTestDb(); |
| 1442 | try db.init(initOptions()); | ||
| 1443 | try addTestData(&db); | 1425 | try addTestData(&db); |
| 1444 | 1426 | ||
| 1445 | // Add data | 1427 | // Add data |
| @@ -1467,8 +1449,7 @@ test "sqlite: statement iterator" { | |||
| 1467 | defer arena.deinit(); | 1449 | defer arena.deinit(); |
| 1468 | var allocator = &arena.allocator; | 1450 | var allocator = &arena.allocator; |
| 1469 | 1451 | ||
| 1470 | var db: Db = undefined; | 1452 | var db = try getTestDb(); |
| 1471 | try db.init(initOptions()); | ||
| 1472 | try addTestData(&db); | 1453 | try addTestData(&db); |
| 1473 | 1454 | ||
| 1474 | // Cleanup first | 1455 | // Cleanup first |
| @@ -1560,8 +1541,7 @@ test "sqlite: failing open" { | |||
| 1560 | } | 1541 | } |
| 1561 | 1542 | ||
| 1562 | test "sqlite: failing prepare statement" { | 1543 | test "sqlite: failing prepare statement" { |
| 1563 | var db: Db = undefined; | 1544 | var db = try getTestDb(); |
| 1564 | try db.init(initOptions()); | ||
| 1565 | 1545 | ||
| 1566 | const result = db.prepare("SELECT id FROM foobar"); | 1546 | const result = db.prepare("SELECT id FROM foobar"); |
| 1567 | testing.expectError(error.SQLiteError, result); | 1547 | testing.expectError(error.SQLiteError, result); |
| @@ -1571,21 +1551,44 @@ test "sqlite: failing prepare statement" { | |||
| 1571 | testing.expectEqualStrings("no such table: foobar", detailed_err.message); | 1551 | testing.expectEqualStrings("no such table: foobar", detailed_err.message); |
| 1572 | } | 1552 | } |
| 1573 | 1553 | ||
| 1574 | fn initOptions() InitOptions { | 1554 | fn getTestDb() !Db { |
| 1575 | return .{ | 1555 | var buf: [1024]u8 = undefined; |
| 1556 | var fba = std.heap.FixedBufferAllocator.init(&buf); | ||
| 1557 | |||
| 1558 | var mode = dbMode(&fba.allocator); | ||
| 1559 | |||
| 1560 | var db: Db = undefined; | ||
| 1561 | try db.init(.{ | ||
| 1576 | .open_flags = .{ | 1562 | .open_flags = .{ |
| 1577 | .write = true, | 1563 | .write = true, |
| 1578 | .create = true, | 1564 | .create = true, |
| 1579 | }, | 1565 | }, |
| 1580 | .mode = dbMode(), | 1566 | .mode = mode, |
| 1581 | }; | 1567 | }); |
| 1568 | |||
| 1569 | return db; | ||
| 1570 | } | ||
| 1571 | |||
| 1572 | fn tmpDbPath(allocator: *mem.Allocator) ![:0]const u8 { | ||
| 1573 | const tmp_dir = testing.tmpDir(.{}); | ||
| 1574 | |||
| 1575 | const path = try std.fs.path.join(allocator, &[_][]const u8{ | ||
| 1576 | "zig-cache", | ||
| 1577 | "tmp", | ||
| 1578 | &tmp_dir.sub_path, | ||
| 1579 | "zig-sqlite.db", | ||
| 1580 | }); | ||
| 1581 | defer allocator.free(path); | ||
| 1582 | |||
| 1583 | return allocator.dupeZ(u8, path); | ||
| 1582 | } | 1584 | } |
| 1583 | 1585 | ||
| 1584 | fn dbMode() Db.Mode { | 1586 | fn dbMode(allocator: *mem.Allocator) Db.Mode { |
| 1585 | return if (build_options.in_memory) blk: { | 1587 | return if (build_options.in_memory) blk: { |
| 1586 | break :blk .{ .Memory = {} }; | 1588 | break :blk .{ .Memory = {} }; |
| 1587 | } else blk: { | 1589 | } else blk: { |
| 1588 | const path = "/tmp/zig-sqlite.db"; | 1590 | const path = tmpDbPath(allocator) catch unreachable; |
| 1591 | |||
| 1589 | std.fs.cwd().deleteFile(path) catch {}; | 1592 | std.fs.cwd().deleteFile(path) catch {}; |
| 1590 | break :blk .{ .File = path }; | 1593 | break :blk .{ .File = path }; |
| 1591 | }; | 1594 | }; |