From 50dd2e7e07cf25780bc825b9e9b30f66b3d233b0 Mon Sep 17 00:00:00 2001 From: rebecca Date: Thu, 17 Sep 2026 20:56:34 +0100 Subject: move r.web.db --> r.db --- db.lua | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 db.lua (limited to 'db.lua') diff --git a/db.lua b/db.lua new file mode 100644 index 0000000..5b616c2 --- /dev/null +++ b/db.lua @@ -0,0 +1,62 @@ +local dbi = require'DBI' +local cqueues = require'cqueues' + +local function db_do(db, sql, ...) + -- print('>>',sql,...) + local stmt = assert(db:prepare(sql)) + ::tryagain:: + local ok, err = stmt:execute(...) + if not ok and err:match"locked" then + print'still waiting' + cqueues.sleep(1) + goto tryagain + end + assert(ok, err) + return stmt +end + +local extra_methods = {} +function extra_methods.fetch_one(db, sql, ...) + local stmt = db_do(db, sql, ...) + local row = stmt:fetch(true) + stmt:close() + return row +end +function extra_methods.fetch(db, sql, ...) + local stmt = db_do(db, sql, ...) + local rows, i = {}, 1 + for row in stmt:rows(true) do + rows[i] = row + i = i + 1 + end + stmt:close() + return rows +end +function extra_methods.exec(db, sql, ...) + local stmt = db_do(db, sql, ...) + stmt:close() +end + +local function get_conn() + local c = assert(dbi.Connect('SQLite3','database.db')) + -- fuck it + local mt = getmetatable(c) + for k,v in pairs(extra_methods) do mt.__index[k] = v end + mt.__close = function(x) x:close() end + c:exec('pragma foreign_keys=ON;') + return c +end + +local function apply_migrations(migrations) + local conn = get_conn() + local ver = conn:fetch_one"pragma user_version".user_version + for i = ver+1, #migrations do + print("applying migration #"..i) + conn:exec(migrations[i]) + end + conn:exec("pragma user_version="..#migrations) + assert(conn:commit()) +end + + +return {conn=get_conn,apply_migrations=apply_migrations} -- cgit v1.2.3