author | Kim Alvefur <zash@zash.se> |
Mon, 01 Aug 2022 15:23:33 +0200 | |
changeset 12849 | f306336b7e99 |
child 12851 | d6cdde74cd9b |
permissions | -rw-r--r-- |
12849
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 |
-- luacheck: ignore 113/unpack 211 212 411 213 |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 |
local setmetatable, getmetatable = setmetatable, getmetatable; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 |
local ipairs, unpack, select = ipairs, table.unpack or unpack, select; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 |
local tonumber, tostring = tonumber, tostring; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 |
local assert, xpcall, debug_traceback = assert, xpcall, debug.traceback; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 |
local error = error |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 |
local type = type |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 |
local t_concat = table.concat; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
local t_insert = table.insert; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 |
local s_char = string.char; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 |
local log = require "util.logger".init("sql"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 |
local lsqlite3 = require "lsqlite3"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 |
local build_url = require "socket.url".build; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 |
local ROW, DONE = lsqlite3.ROW, lsqlite3.DONE; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 |
local err2str = { |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 |
[0] = "OK"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 |
"ERROR"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 |
"INTERNAL"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 |
"PERM"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 |
"ABORT"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 |
"BUSY"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 |
"LOCKED"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
"NOMEM"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 |
"READONLY"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
"INTERRUPT"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 |
"IOERR"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 |
"CORRUPT"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 |
"NOTFOUND"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 |
"FULL"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 |
"CANTOPEN"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 |
"PROTOCOL"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 |
"EMPTY"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 |
"SCHEMA"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 |
"TOOBIG"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 |
"CONSTRAINT"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 |
"MISMATCH"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 |
"MISUSE"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 |
"NOLFS"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 |
[24] = "FORMAT"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 |
[25] = "RANGE"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 |
[26] = "NOTADB"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 |
[100] = "ROW"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 |
[101] = "DONE"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 |
}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 |
local assert = function(cond, errno, err) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 |
return assert(cond, err or err2str[errno]); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 |
local _ENV = nil; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 |
-- luacheck: std none |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 |
local column_mt = {}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 |
local table_mt = {}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 |
local query_mt = {}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 |
--local op_mt = {}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 |
local index_mt = {}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 |
local function is_column(x) return getmetatable(x)==column_mt; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 |
local function is_index(x) return getmetatable(x)==index_mt; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 |
local function is_table(x) return getmetatable(x)==table_mt; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 |
local function is_query(x) return getmetatable(x)==query_mt; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 |
local function Integer(n) return "Integer()" end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 |
local function String(n) return "String()" end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 |
local function Column(definition) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 |
return setmetatable(definition, column_mt); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 |
local function Table(definition) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 |
local c = {} |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 |
for i,col in ipairs(definition) do |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 |
if is_column(col) then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 |
c[i], c[col.name] = col, col; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 |
elseif is_index(col) then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 |
col.table = definition.name; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 |
return setmetatable({ __table__ = definition, c = c, name = definition.name }, table_mt); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 |
local function Index(definition) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 |
return setmetatable(definition, index_mt); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 |
function table_mt:__tostring() |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 |
local s = { 'name="'..self.__table__.name..'"' } |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 |
for i,col in ipairs(self.__table__) do |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 |
s[#s+1] = tostring(col); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 |
return 'Table{ '..t_concat(s, ", ")..' }' |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 |
table_mt.__index = {}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 |
function table_mt.__index:create(engine) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 |
return engine:_create_table(self); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 |
function table_mt:__call(...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 |
-- TODO |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 |
function column_mt:__tostring() |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 |
return 'Column{ name="'..self.name..'", type="'..self.type..'" }' |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 |
function index_mt:__tostring() |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 |
local s = 'Index{ name="'..self.name..'"'; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 |
for i=1,#self do s = s..', "'..self[i]:gsub("[\\\"]", "\\%1")..'"'; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 |
return s..' }'; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 |
-- return 'Index{ name="'..self.name..'", type="'..self.type..'" }' |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 |
local function urldecode(s) return s and (s:gsub("%%(%x%x)", function (c) return s_char(tonumber(c,16)); end)); end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 |
local function parse_url(url) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 |
local scheme, secondpart, database = url:match("^([%w%+]+)://([^/]*)/?(.*)"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 |
assert(scheme, "Invalid URL format"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 |
local username, password, host, port; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 |
local authpart, hostpart = secondpart:match("([^@]+)@([^@+])"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 |
if not authpart then hostpart = secondpart; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 |
if authpart then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 |
username, password = authpart:match("([^:]*):(.*)"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 |
username = username or authpart; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 |
password = password and urldecode(password); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 |
if hostpart then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
122 |
host, port = hostpart:match("([^:]*):(.*)"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 |
host = host or hostpart; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
124 |
port = port and assert(tonumber(port), "Invalid URL format"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
125 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
126 |
return { |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
127 |
scheme = scheme:lower(); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
128 |
username = username; password = password; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
129 |
host = host; port = port; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
130 |
database = #database > 0 and database or nil; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 |
}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
132 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
134 |
local engine = {}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
135 |
function engine:connect() |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 |
if self.conn then return true; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
137 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 |
local params = self.params; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
139 |
assert(params.driver == "SQLite3", "Only sqlite3 is supported"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
140 |
local dbh, err = lsqlite3.open(params.database); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
141 |
if not dbh then return nil, err2str[err]; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 |
self.conn = dbh; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
143 |
self.prepared = {}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
144 |
local ok, err = self:set_encoding(); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
145 |
if not ok then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
146 |
return ok, err; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
148 |
local ok, err = self:onconnect(); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
149 |
if ok == false then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 |
return ok, err; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 |
return true; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
153 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
154 |
function engine:onconnect() |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
155 |
-- Override from create_engine() |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 |
function engine:execute(sql, ...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 |
local success, err = self:connect(); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 |
if not success then return success, err; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 |
local prepared = self.prepared; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
162 |
local stmt = prepared[sql]; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 |
if not stmt then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
164 |
local err; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
165 |
stmt, err = self.conn:prepare(sql); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
166 |
if not stmt then return stmt, err; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
167 |
prepared[sql] = stmt; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
168 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
169 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
170 |
local ret = stmt:bind_values(...); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
171 |
if ret ~= lsqlite3.OK then return nil, self.conn:errmsg(); end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
172 |
return stmt; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
173 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
174 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
175 |
local result_mt = { |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
176 |
__index = { |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
177 |
affected = function(self) return self.__affected; end; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
178 |
rowcount = function(self) return self.__rowcount; end; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
179 |
}, |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
180 |
}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
181 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
182 |
local function iterator(table) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
183 |
local i=0; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
184 |
return function() |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
185 |
i=i+1; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
186 |
local item=table[i]; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
187 |
if item ~= nil then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
188 |
return item; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
189 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
190 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
191 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
192 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
193 |
local function debugquery(where, sql, ...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
194 |
local i = 0; local a = {...} |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
195 |
sql = sql:gsub("\n?\t+", " "); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
196 |
log("debug", "[%s] %s", where, (sql:gsub("%?", function () |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
197 |
i = i + 1; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
198 |
local v = a[i]; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
199 |
if type(v) == "string" then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 |
v = ("'%s'"):format(v:gsub("'", "''")); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
201 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
202 |
return tostring(v); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
203 |
end))); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
204 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
206 |
function engine:execute_query(sql, ...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
207 |
local prepared = self.prepared; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
208 |
local stmt = prepared[sql]; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
209 |
if stmt and stmt:isopen() then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
210 |
prepared[sql] = nil; -- Can't be used concurrently |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
211 |
else |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
212 |
stmt = assert(self.conn:prepare(sql)); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
213 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
214 |
local ret = stmt:bind_values(...); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
215 |
if ret ~= lsqlite3.OK then error(self.conn:errmsg()); end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
216 |
local data, ret = {} |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
217 |
while stmt:step() == ROW do |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
218 |
t_insert(data, stmt:get_values()); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
219 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
220 |
-- FIXME Error handling, BUSY, ERROR, MISUSE |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 |
if stmt:reset() == lsqlite3.OK then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
222 |
prepared[sql] = stmt; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
223 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
224 |
return setmetatable({ __data = data }, { __index = result_mt.__index, __call = iterator(data) }); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
225 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
226 |
function engine:execute_update(sql, ...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
227 |
local prepared = self.prepared; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
228 |
local stmt = prepared[sql]; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
229 |
if not stmt or not stmt:isopen() then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
230 |
stmt = assert(self.conn:prepare(sql)); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
231 |
else |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
232 |
prepared[sql] = nil; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
233 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
234 |
local ret = stmt:bind_values(...); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
235 |
if ret ~= lsqlite3.OK then error(self.conn:errmsg()); end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
236 |
local rowcount = 0; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
237 |
repeat |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
238 |
ret = stmt:step(); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
239 |
if ret == lsqlite3.ROW then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
240 |
rowcount = rowcount + 1; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
241 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
242 |
until ret ~= lsqlite3.ROW; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
243 |
local affected = self.conn:changes(); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
244 |
if stmt:reset() == lsqlite3.OK then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
245 |
prepared[sql] = stmt; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
246 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
247 |
return setmetatable({ __affected = affected, __rowcount = rowcount }, result_mt); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
248 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
249 |
engine.insert = engine.execute_update; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
250 |
engine.select = engine.execute_query; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
251 |
engine.delete = engine.execute_update; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
252 |
engine.update = engine.execute_update; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
253 |
local function debugwrap(name, f) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
254 |
return function (self, sql, ...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
255 |
debugquery(name, sql, ...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
256 |
return f(self, sql, ...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
257 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
258 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
259 |
function engine:debug(enable) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
260 |
self._debug = enable; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
261 |
if enable then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
262 |
engine.insert = debugwrap("insert", engine.execute_update); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
263 |
engine.select = debugwrap("select", engine.execute_query); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
264 |
engine.delete = debugwrap("delete", engine.execute_update); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
265 |
engine.update = debugwrap("update", engine.execute_update); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
266 |
else |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
267 |
engine.insert = engine.execute_update; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
268 |
engine.select = engine.execute_query; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
269 |
engine.delete = engine.execute_update; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
270 |
engine.update = engine.execute_update; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
271 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
272 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
273 |
function engine:_(word) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
274 |
local ret = self.conn:exec(word); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
275 |
if ret ~= lsqlite3.OK then return nil, self.conn:errmsg(); end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
276 |
return true; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
277 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
278 |
function engine:_transaction(func, ...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
279 |
if not self.conn then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
280 |
local a,b = self:connect(); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
281 |
if not a then return a,b; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
282 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
283 |
--assert(not self.__transaction, "Recursive transactions not allowed"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
284 |
local ok, err = self:_"BEGIN"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
285 |
if not ok then return ok, err; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
286 |
self.__transaction = true; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
287 |
local success, a, b, c = xpcall(func, debug_traceback, ...); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
288 |
self.__transaction = nil; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
289 |
if success then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
290 |
log("debug", "SQL transaction success [%s]", tostring(func)); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
291 |
local ok, err = self:_"COMMIT"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
292 |
if not ok then return ok, err; end -- commit failed |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
293 |
return success, a, b, c; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
294 |
else |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
295 |
log("debug", "SQL transaction failure [%s]: %s", tostring(func), a); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
296 |
if self.conn then self:_"ROLLBACK"; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
297 |
return success, a; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
298 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
299 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
300 |
function engine:transaction(...) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
301 |
local ok, ret = self:_transaction(...); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
302 |
if not ok then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
303 |
local conn = self.conn; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
304 |
if not conn or not conn:isopen() then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
305 |
self.conn = nil; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
306 |
ok, ret = self:_transaction(...); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
307 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
308 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
309 |
return ok, ret; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
310 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
311 |
function engine:_create_index(index) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
312 |
local sql = "CREATE INDEX IF NOT EXISTS \""..index.name.."\" ON \""..index.table.."\" ("; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
313 |
for i=1,#index do |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
314 |
sql = sql.."\""..index[i].."\""; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
315 |
if i ~= #index then sql = sql..", "; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
316 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
317 |
sql = sql..");" |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
318 |
if index.unique then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
319 |
sql = sql:gsub("^CREATE", "CREATE UNIQUE"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
320 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
321 |
if self._debug then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
322 |
debugquery("create", sql); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
323 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
324 |
return self:execute(sql); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
325 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
326 |
function engine:_create_table(table) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
327 |
local sql = "CREATE TABLE IF NOT EXISTS \""..table.name.."\" ("; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
328 |
for i,col in ipairs(table.c) do |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
329 |
local col_type = col.type; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
330 |
sql = sql.."\""..col.name.."\" "..col_type; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
331 |
if col.nullable == false then sql = sql.." NOT NULL"; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
332 |
if col.primary_key == true then sql = sql.." PRIMARY KEY"; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
333 |
if col.auto_increment == true then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
334 |
sql = sql.." AUTOINCREMENT"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
335 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
336 |
if i ~= #table.c then sql = sql..", "; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
337 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
338 |
sql = sql.. ");" |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
339 |
if self._debug then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
340 |
debugquery("create", sql); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
341 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
342 |
local success,err = self:execute(sql); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
343 |
if not success then return success,err; end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
344 |
for i,v in ipairs(table.__table__) do |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
345 |
if is_index(v) then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
346 |
self:_create_index(v); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
347 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
348 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
349 |
return success; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
350 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
351 |
function engine:set_encoding() -- to UTF-8 |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
352 |
return self:transaction(function() |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
353 |
for encoding in self:select"PRAGMA encoding;" do |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
354 |
if encoding[1] == "UTF-8" then |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
355 |
self.charset = "utf8"; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
356 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
357 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
358 |
end); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
359 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
360 |
local engine_mt = { __index = engine }; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
361 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
362 |
local function db2uri(params) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
363 |
return build_url{ |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
364 |
scheme = params.driver, |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
365 |
user = params.username, |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
366 |
password = params.password, |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
367 |
host = params.host, |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
368 |
port = params.port, |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
369 |
path = params.database, |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
370 |
}; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
371 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
372 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
373 |
local function create_engine(_, params, onconnect) |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
374 |
assert(params.driver == "SQLite3", "Only SQLite3 is supported without LuaDBI"); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
375 |
return setmetatable({ url = db2uri(params), params = params, onconnect = onconnect }, engine_mt); |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
376 |
end |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
377 |
|
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
378 |
return { |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
379 |
is_column = is_column; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
380 |
is_index = is_index; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
381 |
is_table = is_table; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
382 |
is_query = is_query; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
383 |
Integer = Integer; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
384 |
String = String; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
385 |
Column = Column; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
386 |
Table = Table; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
387 |
Index = Index; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
388 |
create_engine = create_engine; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
389 |
db2uri = db2uri; |
f306336b7e99
util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
390 |
}; |