Annotate

util/sqlite3.lua @ 13146:771eb453e03a

util.sqlite3: Deduplicate query methods There were 3 very similar methods: - :execute() - :execute_query() - :execute_update() The first one returns the prepared statement and is mainly used internally in the library for CREATE statements. The later two only really differ in how the results are returned. Those two are one main method and one small one that only picks out the iterator.
author Kim Alvefur <zash@zash.se>
date Sat, 10 Jun 2023 22:02:15 +0200
parent 13145:af251471d5ae
child 13147:e560f7c691ce
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12845
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;
13146
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
12 local array = require "prosody.util.array";
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12872
diff changeset
13 local log = require "prosody.util.logger".init("sql");
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local lsqlite3 = require "lsqlite3";
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 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
17 local ROW, DONE = lsqlite3.ROW, lsqlite3.DONE;
12847
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
18
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
19 -- from sqlite3.h, no copyright claimed
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12872
diff changeset
20 local sqlite_errors = require"prosody.util.error".init("util.sqlite3", {
12847
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
21 -- FIXME xmpp error conditions?
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
22 [1] = { code = 1; type = "modify"; condition = "ERROR"; text = "Generic error" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
23 [2] = { code = 2; type = "cancel"; condition = "INTERNAL"; text = "Internal logic error in SQLite" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
24 [3] = { code = 3; type = "auth"; condition = "PERM"; text = "Access permission denied" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
25 [4] = { code = 4; type = "cancel"; condition = "ABORT"; text = "Callback routine requested an abort" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
26 [5] = { code = 5; type = "wait"; condition = "BUSY"; text = "The database file is locked" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
27 [6] = { code = 6; type = "wait"; condition = "LOCKED"; text = "A table in the database is locked" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
28 [7] = { code = 7; type = "wait"; condition = "NOMEM"; text = "A malloc() failed" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
29 [8] = { code = 8; type = "cancel"; condition = "READONLY"; text = "Attempt to write a readonly database" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
30 [9] = { code = 9; type = "cancel"; condition = "INTERRUPT"; text = "Operation terminated by sqlite3_interrupt()" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
31 [10] = { code = 10; type = "wait"; condition = "IOERR"; text = "Some kind of disk I/O error occurred" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
32 [11] = { code = 11; type = "cancel"; condition = "CORRUPT"; text = "The database disk image is malformed" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
33 [12] = { code = 12; type = "modify"; condition = "NOTFOUND"; text = "Unknown opcode in sqlite3_file_control()" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
34 [13] = { code = 13; type = "wait"; condition = "FULL"; text = "Insertion failed because database is full" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
35 [14] = { code = 14; type = "auth"; condition = "CANTOPEN"; text = "Unable to open the database file" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
36 [15] = { code = 15; type = "cancel"; condition = "PROTOCOL"; text = "Database lock protocol error" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
37 [16] = { code = 16; type = "continue"; condition = "EMPTY"; text = "Internal use only" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
38 [17] = { code = 17; type = "modify"; condition = "SCHEMA"; text = "The database schema changed" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
39 [18] = { code = 18; type = "modify"; condition = "TOOBIG"; text = "String or BLOB exceeds size limit" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
40 [19] = { code = 19; type = "modify"; condition = "CONSTRAINT"; text = "Abort due to constraint violation" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
41 [20] = { code = 20; type = "modify"; condition = "MISMATCH"; text = "Data type mismatch" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
42 [21] = { code = 21; type = "modify"; condition = "MISUSE"; text = "Library used incorrectly" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
43 [22] = { code = 22; type = "cancel"; condition = "NOLFS"; text = "Uses OS features not supported on host" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
44 [23] = { code = 23; type = "auth"; condition = "AUTH"; text = "Authorization denied" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
45 [24] = { code = 24; type = "modify"; condition = "FORMAT"; text = "Not used" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
46 [25] = { code = 25; type = "modify"; condition = "RANGE"; text = "2nd parameter to sqlite3_bind out of range" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
47 [26] = { code = 26; type = "cancel"; condition = "NOTADB"; text = "File opened that is not a database file" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
48 [27] = { code = 27; type = "continue"; condition = "NOTICE"; text = "Notifications from sqlite3_log()" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
49 [28] = { code = 28; type = "continue"; condition = "WARNING"; text = "Warnings from sqlite3_log()" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
50 [100] = { code = 100; type = "continue"; condition = "ROW"; text = "sqlite3_step() has another row ready" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
51 [101] = { code = 101; type = "continue"; condition = "DONE"; text = "sqlite3_step() has finished executing" };
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
52 });
12845
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 assert = function(cond, errno, err)
12847
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
55 return assert(sqlite_errors.coerce(cond, err or errno));
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 local _ENV = nil;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 -- luacheck: std none
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 column_mt = {};
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 local table_mt = {};
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 local query_mt = {};
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 --local op_mt = {};
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 local index_mt = {};
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 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
67 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
68 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
69 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
70 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
71 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
72
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 local function Column(definition)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 return setmetatable(definition, column_mt);
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 local function Table(definition)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 local c = {}
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 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
79 if is_column(col) then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 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
81 elseif is_index(col) then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 col.table = definition.name;
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 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 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
86 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 local function Index(definition)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 return setmetatable(definition, index_mt);
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
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91 function table_mt:__tostring()
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 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
93 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
94 s[#s+1] = tostring(col);
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 return 'Table{ '..t_concat(s, ", ")..' }'
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 table_mt.__index = {};
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 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
100 return engine:_create_table(self);
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 table_mt:__call(...)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 -- TODO
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 function column_mt:__tostring()
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 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
107 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 function index_mt:__tostring()
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 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
110 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
111 return s..' }';
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 -- 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
113 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
115 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
116 local function parse_url(url)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 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
118 assert(scheme, "Invalid URL format");
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 local username, password, host, port;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 local authpart, hostpart = secondpart:match("([^@]+)@([^@+])");
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121 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
122 if authpart then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
123 username, password = authpart:match("([^:]*):(.*)");
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
124 username = username or authpart;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 password = password and urldecode(password);
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 if hostpart then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128 host, port = hostpart:match("([^:]*):(.*)");
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
129 host = host or hostpart;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
130 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
131 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 return {
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
133 scheme = scheme:lower();
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
134 username = username; password = password;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
135 host = host; port = port;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
136 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
137 };
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
139
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
140 local engine = {};
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 function engine:connect()
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
142 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
143
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
144 local params = self.params;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
145 assert(params.driver == "SQLite3", "Only sqlite3 is supported");
12847
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
146 local dbh, err = sqlite_errors.coerce(lsqlite3.open(params.database));
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
147 if not dbh then return nil, err; end
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
148 self.conn = dbh;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
149 self.prepared = {};
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
150 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
151 if not ok then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
152 return ok, err;
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 local ok, err = self:onconnect();
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
155 if ok == false then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
156 return ok, err;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
157 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
158 return true;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
159 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
160 function engine:onconnect()
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
161 -- Override from create_engine()
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
162 end
12872
a20923f7d5fd mod_storage_sql: Record connection to database as module status
Kim Alvefur <zash@zash.se>
parents: 12848
diff changeset
163 function engine:ondisconnect() -- luacheck: ignore 212/self
a20923f7d5fd mod_storage_sql: Record connection to database as module status
Kim Alvefur <zash@zash.se>
parents: 12848
diff changeset
164 -- Override from create_engine()
a20923f7d5fd mod_storage_sql: Record connection to database as module status
Kim Alvefur <zash@zash.se>
parents: 12848
diff changeset
165 end
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
166 function engine:execute(sql, ...)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
167 local success, err = self:connect();
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
168 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
169 local prepared = self.prepared;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
170
12848
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
171 if select('#', ...) == 0 then
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
172 local ret = self.conn:exec(sql);
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
173 if ret ~= lsqlite3.OK then
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
174 local err = sqlite_errors.new(err);
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
175 err.text = self.conn:errmsg();
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
176 return err;
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
177 end
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
178 return true;
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
179 end
ccb030d988ac util.sqlite3: Skip prepared statements when no parameters are given
Kim Alvefur <zash@zash.se>
parents: 12847
diff changeset
180
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
181 local stmt = prepared[sql];
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
182 if not stmt then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
183 local err;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
184 stmt, err = self.conn:prepare(sql);
12847
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
185 if not stmt then
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
186 err = sqlite_errors.new(err);
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
187 err.text = self.conn:errmsg();
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
188 return stmt, err;
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
189 end
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
190 prepared[sql] = stmt;
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 ret = stmt:bind_values(...);
12847
d6cdde74cd9b util.sqlite3: Create util.error registry from headers
Kim Alvefur <zash@zash.se>
parents: 12845
diff changeset
194 if ret ~= lsqlite3.OK then return nil, sqlite_errors.new(ret, { message = self.conn:errmsg() }); end
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
195 return stmt;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
196 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
197
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 local function iterator(table)
13145
af251471d5ae util.sqlite3: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
199 local i = 0;
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
200 return function()
13145
af251471d5ae util.sqlite3: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
201 i = i + 1;
af251471d5ae util.sqlite3: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
202 local item = table[i];
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
203 if item ~= nil then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
204 return item;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
205 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
206 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
207 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
208
13146
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
209 local result_mt = {
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
210 __len = function(self)
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
211 return self.__rowcount;
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
212 end;
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
213 __index = {
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
214 affected = function(self)
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
215 return self.__affected;
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
216 end;
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
217 rowcount = function(self)
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
218 return self.__rowcount;
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
219 end;
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
220 };
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
221 __call = function(self)
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
222 return iterator(self.__data);
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
223 end;
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
224 };
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
225
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
226 local function debugquery(where, sql, ...)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
227 local i = 0; local a = {...}
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
228 sql = sql:gsub("\n?\t+", " ");
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
229 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
230 i = i + 1;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
231 local v = a[i];
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
232 if type(v) == "string" then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
233 v = ("'%s'"):format(v:gsub("'", "''"));
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
234 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
235 return tostring(v);
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
236 end)));
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
237 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
238
13146
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
239 function engine:execute_update(sql, ...)
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
240 local prepared = self.prepared;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
241 local stmt = prepared[sql];
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
242 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
243 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
244 else
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
245 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
246 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
247 local ret = stmt:bind_values(...);
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
248 if ret ~= lsqlite3.OK then error(self.conn:errmsg()); end
13146
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
249 local data = array();
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
250 for row in stmt:rows() do
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
251 data:push(array(row));
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
252 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
253 -- 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
254 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
255 prepared[sql] = stmt;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
256 end
13146
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
257 local affected = self.conn:changes();
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
258 return setmetatable({ __affected = affected; __rowcount = #data; __data = data }, result_mt);
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
259 end
13146
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
260
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
261 function engine:execute_query(sql, ...)
771eb453e03a util.sqlite3: Deduplicate query methods
Kim Alvefur <zash@zash.se>
parents: 13145
diff changeset
262 return self:execute_update(sql, ...)()
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
263 end
13145
af251471d5ae util.sqlite3: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
264
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
265 engine.insert = engine.execute_update;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
266 engine.select = engine.execute_query;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
267 engine.delete = engine.execute_update;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
268 engine.update = engine.execute_update;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
269 local function debugwrap(name, f)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
270 return function (self, sql, ...)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
271 debugquery(name, sql, ...)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
272 return f(self, sql, ...)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
273 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
274 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
275 function engine:debug(enable)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
276 self._debug = enable;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
277 if enable then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
278 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
279 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
280 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
281 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
282 else
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
283 engine.insert = engine.execute_update;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
284 engine.select = engine.execute_query;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
285 engine.delete = engine.execute_update;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
286 engine.update = engine.execute_update;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
287 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
288 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
289 function engine:_(word)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
290 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
291 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
292 return true;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
293 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
294 function engine:_transaction(func, ...)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
295 if not self.conn then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
296 local a,b = self:connect();
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
297 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
298 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
299 --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
300 local ok, err = self:_"BEGIN";
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
301 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
302 self.__transaction = true;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
303 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
304 self.__transaction = nil;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
305 if success then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
306 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
307 local ok, err = self:_"COMMIT";
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
308 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
309 return success, a, b, c;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
310 else
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
311 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
312 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
313 return success, a;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
314 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
315 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
316 function engine:transaction(...)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
317 local ok, ret = self:_transaction(...);
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
318 if not ok then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
319 local conn = self.conn;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
320 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
321 self.conn = nil;
12872
a20923f7d5fd mod_storage_sql: Record connection to database as module status
Kim Alvefur <zash@zash.se>
parents: 12848
diff changeset
322 self:ondisconnect();
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
323 ok, ret = self:_transaction(...);
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
324 end
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 return ok, ret;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
327 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
328 function engine:_create_index(index)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
329 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
330 for i=1,#index do
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
331 sql = sql.."\""..index[i].."\"";
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
332 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
333 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
334 sql = sql..");"
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
335 if index.unique then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
336 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
337 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
338 if self._debug then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
339 debugquery("create", sql);
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
340 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
341 return self:execute(sql);
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
342 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
343 function engine:_create_table(table)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
344 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
345 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
346 local col_type = col.type;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
347 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
348 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
349 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
350 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
351 sql = sql.." AUTOINCREMENT";
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
352 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
353 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
354 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
355 sql = sql.. ");"
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
356 if self._debug then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
357 debugquery("create", sql);
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 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
360 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
361 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
362 if is_index(v) then
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
363 self:_create_index(v);
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
364 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
365 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
366 return success;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
367 end
13145
af251471d5ae util.sqlite3: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
368
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
369 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
370 return self:transaction(function()
13145
af251471d5ae util.sqlite3: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
371 for encoding in self:select "PRAGMA encoding;" do
af251471d5ae util.sqlite3: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
372 if encoding[1] == "UTF-8" then
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
373 self.charset = "utf8";
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
374 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
375 end
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 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
378 local engine_mt = { __index = engine };
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
379
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
380 local function db2uri(params)
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
381 return build_url{
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
382 scheme = params.driver,
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
383 user = params.username,
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
384 password = params.password,
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
385 host = params.host,
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
386 port = params.port,
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
387 path = params.database,
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
388 };
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
389 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
390
12872
a20923f7d5fd mod_storage_sql: Record connection to database as module status
Kim Alvefur <zash@zash.se>
parents: 12848
diff changeset
391 local function create_engine(_, params, onconnect, ondisconnect)
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
392 assert(params.driver == "SQLite3", "Only SQLite3 is supported without LuaDBI");
12872
a20923f7d5fd mod_storage_sql: Record connection to database as module status
Kim Alvefur <zash@zash.se>
parents: 12848
diff changeset
393 return setmetatable({ url = db2uri(params); params = params; onconnect = onconnect; ondisconnect = ondisconnect }, engine_mt);
12845
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
394 end
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
395
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
396 return {
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
397 is_column = is_column;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
398 is_index = is_index;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
399 is_table = is_table;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
400 is_query = is_query;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
401 Integer = Integer;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
402 String = String;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
403 Column = Column;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
404 Table = Table;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
405 Index = Index;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
406 create_engine = create_engine;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
407 db2uri = db2uri;
f306336b7e99 util.sqlite3: SQLite3-only variant of util.sql using LuaSQLite3
Kim Alvefur <zash@zash.se>
parents:
diff changeset
408 };