diff --git a/src/main.zig b/src/main.zig index b0ff0db..92c5d4c 100644 --- a/src/main.zig +++ b/src/main.zig @@ -6,6 +6,8 @@ const Client = @import("client.zig").Client; const webhook = @import("webhook.zig"); const sqlite = @import("sqlite.zig"); +const DATABASE_VERSION_CODE = 1; + const CREATE_TABLES = \\ CREATE TABLE VERSION \\ ( @@ -100,7 +102,7 @@ pub fn main() anyerror!void { }; } - try db.exec(CREATE_TABLES); + try createTables(&db); var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); var allocator = arena.allocator(); @@ -123,6 +125,28 @@ pub fn main() anyerror!void { arena.deinit(); } +pub fn createTables(db: *sqlite.Database) anyerror!void { + var stm = db.prepare("SELECT versionCode FROM VERSION ORDER BY versionCode DESC") catch { + std.log.debug("Creating database", .{}); + + try db.exec(CREATE_TABLES); + return; + }; + + if (stm.next()) { + var code: isize = 0; + + try stm.fetch(.{&code}); + + if (DATABASE_VERSION_CODE == code) { + std.log.debug("Database already created", .{}); + stm.finalize(); + return; + } + } + stm.finalize(); +} + pub fn updateAlert(allocator: std.mem.Allocator, client: *Client, config: *Config, headers: *std.StringHashMap([]const u8)) anyerror!void { var request = std.ArrayList(u8).init(allocator); diff --git a/src/sqlite.zig b/src/sqlite.zig index 5a31c27..ac07c80 100644 --- a/src/sqlite.zig +++ b/src/sqlite.zig @@ -12,7 +12,7 @@ pub const Database = struct { var rc = sqlite3.sqlite3_open(path, &ptr); if (rc > 0) { - std.log.err("Can't open database: {s}\n", .{sqlite3.sqlite3_errmsg(ptr)}); + std.log.err("Can't open database: {s}", .{sqlite3.sqlite3_errmsg(ptr)}); return error.FailedToOpenDatabase; } @@ -24,7 +24,7 @@ pub const Database = struct { pub fn close(self: *@This()) anyerror!void { var rc = sqlite3.sqlite3_close(self.db); if (rc > 0) { - std.log.err("Can't close database: {s}\n", .{sqlite3.sqlite3_errmsg(self.db)}); + std.log.err("Can't close database: {s}", .{sqlite3.sqlite3_errmsg(self.db)}); } self.db = null; @@ -35,7 +35,7 @@ pub const Database = struct { var rc = sqlite3.sqlite3_prepare_v2(self.db, query.ptr, @intCast(c_int, query.len), &res, 0); if (rc != sqlite3.SQLITE_OK) { - std.log.err("failed to fetch data: {s}\n", .{sqlite3.sqlite3_errmsg(self.db)}); + std.log.err("failed to fetch data: {s}", .{sqlite3.sqlite3_errmsg(self.db)}); return error.FailedToFetchData; } @@ -53,7 +53,7 @@ pub const Database = struct { var rc = sqlite3.sqlite3_exec(self.db, queries, null, null, &errorMsg); if (rc != sqlite3.SQLITE_OK) { - std.log.err("failed to execute queries: {s}\n", .{errorMsg}); // TODO + std.log.err("failed to execute queries: {s}", .{errorMsg}); // TODO sqlite3.sqlite3_free(errorMsg); return error.FailedToExecuteQueries; } @@ -70,14 +70,14 @@ pub const Statement = struct { .Float, .ComptimeFloat => { var rc = sqlite3.sqlite3_bind_double(self.statement, @intCast(c_int, index), value); if (rc != sqlite3.SQLITE_OK) { - std.log.err("failed to bind parameter: {s}\n", .{sqlite3.sqlite3_errmsg(self.db.db)}); + std.log.err("failed to bind parameter: {s}", .{sqlite3.sqlite3_errmsg(self.db.db)}); return error.FailedToBindParameter; } }, .Int, .ComptimeInt => { var rc = sqlite3.sqlite3_bind_int(self.statement, @intCast(c_int, index), value); if (rc != sqlite3.SQLITE_OK) { - std.log.err("failed to bind parameter: {s}\n", .{sqlite3.sqlite3_errmsg(self.db.db)}); + std.log.err("failed to bind parameter: {s}", .{sqlite3.sqlite3_errmsg(self.db.db)}); return error.FailedToBindParameter; } }, @@ -87,14 +87,14 @@ pub const Statement = struct { U8ArrayTypeTag.text => { var rc = sqlite3.sqlite3_bind_text(self.statement, @intCast(c_int, index), value.text.ptr, @intCast(c_int, value.text.len), sqlite3.SQLITE_TRANSIENT); if (rc != sqlite3.SQLITE_OK) { - std.log.err("failed to bind parameter: {s}\n", .{sqlite3.sqlite3_errmsg(self.db.db)}); + std.log.err("failed to bind parameter: {s}", .{sqlite3.sqlite3_errmsg(self.db.db)}); return error.FailedToBindParameter; } }, U8ArrayTypeTag.bytes => { var rc = sqlite3.sqlite3_bind_blob(self.statement, @intCast(c_int, index), value.bytes.ptr, @intCast(c_int, value.bytes.len), sqlite3.SQLITE_TRANSIENT); if (rc != sqlite3.SQLITE_OK) { - std.log.err("failed to bind parameter: {s}\n", .{sqlite3.sqlite3_errmsg(self.db.db)}); + std.log.err("failed to bind parameter: {s}", .{sqlite3.sqlite3_errmsg(self.db.db)}); return error.FailedToBindParameter; } },