summaryrefslogtreecommitdiff
path: root/sqlite.zig
diff options
context:
space:
mode:
Diffstat (limited to 'sqlite.zig')
-rw-r--r--sqlite.zig93
1 files changed, 48 insertions, 45 deletions
diff --git a/sqlite.zig b/sqlite.zig
index 2600ee2..9ded620 100644
--- a/sqlite.zig
+++ b/sqlite.zig
@@ -973,17 +973,14 @@ fn addTestData(db: *Db) !void {
973} 973}
974 974
975test "sqlite: db init" { 975test "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
981test "sqlite: db pragma" { 979test "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
1021test "sqlite: statement exec" { 1018test "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
1247test "sqlite: read a single integer value" { 1238test "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
1281test "sqlite: read a single value into void" { 1271test "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
1296test "sqlite: read a single value into bool" { 1285test "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
1313test "sqlite: insert bool and bind bool" { 1301test "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
1336test "sqlite: bind string literal" { 1323test "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
1440test "sqlite: statement reset" { 1423test "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
1562test "sqlite: failing prepare statement" { 1543test "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
1574fn initOptions() InitOptions { 1554fn 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
1572fn 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
1584fn dbMode() Db.Mode { 1586fn 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 };