Software /
code /
prosody
Comparison
util/sql.lua @ 8382:e5d00bf4a4d5
util: Various minor changes to please [luacheck]
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 10 Nov 2017 05:42:32 +0100 |
parent | 8380:a597ff326758 |
child | 8389:5d866eb8f18f |
comparison
equal
deleted
inserted
replaced
8381:7f6184474149 | 8382:e5d00bf4a4d5 |
---|---|
1 | 1 |
2 local setmetatable, getmetatable = setmetatable, getmetatable; | 2 local setmetatable, getmetatable = setmetatable, getmetatable; |
3 local ipairs, unpack, select = ipairs, table.unpack or unpack, select; --luacheck: ignore 113 | 3 local ipairs, unpack, select = ipairs, table.unpack or unpack, select; --luacheck: ignore 113 |
4 local tonumber, tostring = tonumber, tostring; | 4 local tostring = tostring; |
5 local type = type; | 5 local type = type; |
6 local assert, pcall, xpcall, debug_traceback = assert, pcall, xpcall, debug.traceback; | 6 local assert, pcall, xpcall, debug_traceback = assert, pcall, xpcall, debug.traceback; |
7 local t_concat = table.concat; | 7 local t_concat = table.concat; |
8 local s_char = string.char; | |
9 local log = require "util.logger".init("sql"); | 8 local log = require "util.logger".init("sql"); |
10 | 9 |
11 local DBI = require "DBI"; | 10 local DBI = require "DBI"; |
12 -- This loads all available drivers while globals are unlocked | 11 -- This loads all available drivers while globals are unlocked |
13 -- LuaDBI should be fixed to not set globals. | 12 -- LuaDBI should be fixed to not set globals. |
56 end | 55 end |
57 table_mt.__index = {}; | 56 table_mt.__index = {}; |
58 function table_mt.__index:create(engine) | 57 function table_mt.__index:create(engine) |
59 return engine:_create_table(self); | 58 return engine:_create_table(self); |
60 end | 59 end |
61 function table_mt:__call(...) | |
62 -- TODO | |
63 end | |
64 function column_mt:__tostring() | 60 function column_mt:__tostring() |
65 return 'Column{ name="'..self.name..'", type="'..self.type..'" }' | 61 return 'Column{ name="'..self.name..'", type="'..self.type..'" }' |
66 end | 62 end |
67 function index_mt:__tostring() | 63 function index_mt:__tostring() |
68 local s = 'Index{ name="'..self.name..'"'; | 64 local s = 'Index{ name="'..self.name..'"'; |
69 for i=1,#self do s = s..', "'..self[i]:gsub("[\\\"]", "\\%1")..'"'; end | 65 for i=1,#self do s = s..', "'..self[i]:gsub("[\\\"]", "\\%1")..'"'; end |
70 return s..' }'; | 66 return s..' }'; |
71 -- return 'Index{ name="'..self.name..'", type="'..self.type..'" }' | 67 -- return 'Index{ name="'..self.name..'", type="'..self.type..'" }' |
72 end | |
73 | |
74 local function urldecode(s) return s and (s:gsub("%%(%x%x)", function (c) return s_char(tonumber(c,16)); end)); end | |
75 local function parse_url(url) | |
76 local scheme, secondpart, database = url:match("^([%w%+]+)://([^/]*)/?(.*)"); | |
77 assert(scheme, "Invalid URL format"); | |
78 local username, password, host, port; | |
79 local authpart, hostpart = secondpart:match("([^@]+)@([^@+])"); | |
80 if not authpart then hostpart = secondpart; end | |
81 if authpart then | |
82 username, password = authpart:match("([^:]*):(.*)"); | |
83 username = username or authpart; | |
84 password = password and urldecode(password); | |
85 end | |
86 if hostpart then | |
87 host, port = hostpart:match("([^:]*):(.*)"); | |
88 host = host or hostpart; | |
89 port = port and assert(tonumber(port), "Invalid URL format"); | |
90 end | |
91 return { | |
92 scheme = scheme:lower(); | |
93 username = username; password = password; | |
94 host = host; port = port; | |
95 database = #database > 0 and database or nil; | |
96 }; | |
97 end | 68 end |
98 | 69 |
99 local engine = {}; | 70 local engine = {}; |
100 function engine:connect() | 71 function engine:connect() |
101 if self.conn then return true; end | 72 if self.conn then return true; end |
121 if ok == false then | 92 if ok == false then |
122 return ok, err; | 93 return ok, err; |
123 end | 94 end |
124 return true; | 95 return true; |
125 end | 96 end |
126 function engine:onconnect() | 97 function engine:onconnect() -- luacheck: ignore 212/self |
127 -- Override from create_engine() | 98 -- Override from create_engine() |
128 end | 99 end |
129 | 100 |
130 function engine:prepquery(sql) | 101 function engine:prepquery(sql) |
131 if self.params.driver == "MySQL" then | 102 if self.params.driver == "MySQL" then |
146 stmt, err = self.conn:prepare(sql); | 117 stmt, err = self.conn:prepare(sql); |
147 if not stmt then return stmt, err; end | 118 if not stmt then return stmt, err; end |
148 prepared[sql] = stmt; | 119 prepared[sql] = stmt; |
149 end | 120 end |
150 | 121 |
122 -- luacheck: ignore 411/success | |
151 local success, err = stmt:execute(...); | 123 local success, err = stmt:execute(...); |
152 if not success then return success, err; end | 124 if not success then return success, err; end |
153 return stmt; | 125 return stmt; |
154 end | 126 end |
155 | 127 |
333 end | 305 end |
334 local set_names_query = "SET NAMES '%s';" | 306 local set_names_query = "SET NAMES '%s';" |
335 local charset = "utf8"; | 307 local charset = "utf8"; |
336 if driver == "MySQL" then | 308 if driver == "MySQL" then |
337 self:transaction(function() | 309 self:transaction(function() |
338 for row in self:select"SELECT \"CHARACTER_SET_NAME\" FROM \"information_schema\".\"CHARACTER_SETS\" WHERE \"CHARACTER_SET_NAME\" LIKE 'utf8%' ORDER BY MAXLEN DESC LIMIT 1;" do | 310 for row in self:select[[ |
311 SELECT "CHARACTER_SET_NAME" | |
312 FROM "information_schema"."CHARACTER_SETS" | |
313 WHERE "CHARACTER_SET_NAME" LIKE 'utf8%' | |
314 ORDER BY MAXLEN DESC LIMIT 1; | |
315 ]] do | |
339 charset = row and row[1] or charset; | 316 charset = row and row[1] or charset; |
340 end | 317 end |
341 end); | 318 end); |
342 set_names_query = set_names_query:gsub(";$", (" COLLATE '%s';"):format(charset.."_bin")); | 319 set_names_query = set_names_query:gsub(";$", (" COLLATE '%s';"):format(charset.."_bin")); |
343 end | 320 end |
377 port = params.port, | 354 port = params.port, |
378 path = params.database, | 355 path = params.database, |
379 }; | 356 }; |
380 end | 357 end |
381 | 358 |
382 local function create_engine(self, params, onconnect) | 359 local function create_engine(_, params, onconnect) |
383 return setmetatable({ url = db2uri(params), params = params, onconnect = onconnect }, engine_mt); | 360 return setmetatable({ url = db2uri(params), params = params, onconnect = onconnect }, engine_mt); |
384 end | 361 end |
385 | 362 |
386 return { | 363 return { |
387 is_column = is_column; | 364 is_column = is_column; |