login

local ffi = require "ffi"

ffi.cdef[[
typedef struct sqlite3 sqlite3;
int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
int sqlite3_close(sqlite3*);
int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);
]]
local C = ffi.load("sqlite3")

local DB = {}
DB.__index = DB

function DB:execute(sql, cb, arg)
    if C.sqlite3_exec(self.db, sql, cb, arg, self.err) ~= 0 then
        print(ffi.string(self.err[0]))
    end
end

function DB:close()
    C.sqlite3_close(self.db)
end

local function open(fname)
    local self = setmetatable({}, DB)
    local pdb = ffi.new("sqlite3 *[1]")
    C.sqlite3_open(fname, pdb)
    self.db = pdb[0]
    self.err = ffi.new("char *[1]")
    return self
end

return {open=open}