79 lines
1.6 KiB
Zig
79 lines
1.6 KiB
Zig
const std = @import("std");
|
|
const sqlite = @import("sqlite");
|
|
|
|
// TODO: Make DB an object so we can just do Self.
|
|
// TODO: Wrap into transactions with a .flush() method
|
|
|
|
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
|
|
\\);
|
|
,
|
|
.{},
|
|
.{},
|
|
);
|
|
}
|