mgtzm/src/Db.zig

78 lines
1.5 KiB
Zig

const std = @import("std");
const sqlite = @import("sqlite");
// TODO: Make DB an object so we can just do Self.
const ObjectError = error{
IncompatibleObjectType, // No ?u32 "id" field
};
pub fn getLastId(db: *sqlite.Db) !i64 {
const row = try db.one(
struct {
rowid: i64,
},
"SELECT LAST_INSERT_ROWID();",
.{},
.{},
);
if (row) |row_i| {
return row_i.rowid;
}
return 0;
}
pub fn init() !sqlite.Db {
var db = try sqlite.Db.init(.{
.mode = .{ .File = "/tmp/data.db" },
.open_flags = .{
.write = true,
.create = true,
},
.threading_mode = .MultiThread,
});
try migrate(&db);
return db;
}
// TODO: Make a proper migration system.
fn migrate(db: *sqlite.Db) !void {
try db.exec(
\\CREATE TABLE IF NOT EXISTS item (
\\ id INTEGER PRIMARY KEY
\\);
,
.{},
.{},
);
try db.exec(
\\CREATE TABLE IF NOT EXISTS tag (
\\ name TEXT PRIMARY KEY
\\);
,
.{},
.{},
);
try db.exec(
\\CREATE TABLE IF NOT EXISTS item_tag (
\\ item INTEGER,
\\ tag TEXT,
\\ value TEXT,
\\
\\ PRIMARY KEY (item, tag),
\\
\\ FOREIGN KEY (item) REFERENCES item(id) ON DELETE CASCADE,
\\ FOREIGN KEY (tag) REFERENCES tag(name) ON DELETE CASCADE ON UPDATE CASCADE
\\);
,
.{},
.{},
);
}