Skip to content

Commit af1f4f0

Browse files
committed
minor refactoring to lapis.db.mysql, use metatable to inherit base db
1 parent eb5cbc1 commit af1f4f0

File tree

5 files changed

+60
-51
lines changed

5 files changed

+60
-51
lines changed

lapis/db/mysql.lua

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ end
66
local concat
77
concat = table.concat
88
local unpack = unpack or table.unpack
9-
local FALSE, NULL, TRUE, build_helpers, format_date, is_raw, raw, is_list, list, is_encodable, clause, is_clause
9+
local NULL, build_helpers, is_raw, is_list
1010
do
1111
local _obj_0 = require("lapis.db.base")
12-
FALSE, NULL, TRUE, build_helpers, format_date, is_raw, raw, is_list, list, is_encodable, clause, is_clause = _obj_0.FALSE, _obj_0.NULL, _obj_0.TRUE, _obj_0.build_helpers, _obj_0.format_date, _obj_0.is_raw, _obj_0.raw, _obj_0.is_list, _obj_0.list, _obj_0.is_encodable, _obj_0.clause, _obj_0.is_clause
12+
NULL, build_helpers, is_raw, is_list = _obj_0.NULL, _obj_0.build_helpers, _obj_0.is_raw, _obj_0.is_list
1313
end
1414
local logger = require("lapis.logging")
15-
local conn
16-
local BACKENDS, set_raw_query, get_raw_query, escape_literal, escape_identifier, connect, raw_query, interpolate_query, encode_values, encode_assigns, encode_clause, append_all, add_cond, query, _select, _insert, _update, _delete, _truncate
17-
BACKENDS = {
15+
local active_connection
16+
local connect, raw_query
17+
local BACKENDS = {
1818
luasql = function()
1919
local config = require("lapis.config").get()
2020
local mysql_config = assert(config.mysql, "missing mysql configuration")
@@ -30,14 +30,14 @@ BACKENDS = {
3030
table.insert(conn_opts, mysql_config.port)
3131
end
3232
end
33-
conn = assert(luasql:connect(unpack(conn_opts)))
33+
active_connection = assert(luasql:connect(unpack(conn_opts)))
3434
return function(q)
3535
logger.query(q)
36-
local cur = assert(conn:execute(q))
36+
local cur = assert(active_connection:execute(q))
3737
local has_rows = type(cur) ~= "number"
3838
local result = {
3939
affected_rows = has_rows and cur:numrows() or cur,
40-
last_auto_id = conn:getlastautoid()
40+
last_auto_id = active_connection:getlastautoid()
4141
}
4242
if has_rows then
4343
local colnames = cur:getcolnames()
@@ -156,19 +156,22 @@ BACKENDS = {
156156
end
157157
end
158158
}
159+
local set_raw_query
159160
set_raw_query = function(fn)
160161
raw_query = fn
161162
end
163+
local get_raw_query
162164
get_raw_query = function()
163165
return raw_query
164166
end
167+
local escape_literal
165168
escape_literal = function(val)
166169
local _exp_0 = type(val)
167170
if "number" == _exp_0 then
168171
return tostring(val)
169172
elseif "string" == _exp_0 then
170-
if conn then
171-
return "'" .. tostring(conn:escape(val)) .. "'"
173+
if active_connection then
174+
return "'" .. tostring(active_connection:escape(val)) .. "'"
172175
else
173176
if ngx then
174177
return ngx.quote_sql_str(val)
@@ -206,6 +209,7 @@ escape_literal = function(val)
206209
end
207210
return error("don't know how to escape value: " .. tostring(val))
208211
end
212+
local escape_identifier
209213
escape_identifier = function(ident)
210214
if is_raw(ident) then
211215
return ident[1]
@@ -234,12 +238,14 @@ raw_query = function(...)
234238
connect()
235239
return raw_query(...)
236240
end
237-
interpolate_query, encode_values, encode_assigns, encode_clause = build_helpers(escape_literal, escape_identifier)
241+
local interpolate_query, encode_values, encode_assigns, encode_clause = build_helpers(escape_literal, escape_identifier)
242+
local append_all
238243
append_all = function(t, ...)
239244
for i = 1, select("#", ...) do
240245
t[#t + 1] = select(i, ...)
241246
end
242247
end
248+
local add_cond
243249
add_cond = function(buffer, cond, ...)
244250
append_all(buffer, " WHERE ")
245251
local _exp_0 = type(cond)
@@ -249,15 +255,18 @@ add_cond = function(buffer, cond, ...)
249255
return append_all(buffer, interpolate_query(cond, ...))
250256
end
251257
end
258+
local query
252259
query = function(str, ...)
253260
if select("#", ...) > 0 then
254261
str = interpolate_query(str, ...)
255262
end
256263
return raw_query(str)
257264
end
265+
local _select
258266
_select = function(str, ...)
259267
return query("SELECT " .. str, ...)
260268
end
269+
local _insert
261270
_insert = function(tbl, values, ...)
262271
local buff = {
263272
"INSERT INTO ",
@@ -267,6 +276,7 @@ _insert = function(tbl, values, ...)
267276
encode_values(values, buff)
268277
return raw_query(concat(buff))
269278
end
279+
local _update
270280
_update = function(table, values, cond, ...)
271281
local buff = {
272282
"UPDATE ",
@@ -279,6 +289,7 @@ _update = function(table, values, cond, ...)
279289
end
280290
return raw_query(concat(buff))
281291
end
292+
local _delete
282293
_delete = function(table, cond, ...)
283294
local buff = {
284295
"DELETE FROM ",
@@ -289,30 +300,20 @@ _delete = function(table, cond, ...)
289300
end
290301
return raw_query(concat(buff))
291302
end
303+
local _truncate
292304
_truncate = function(table)
293305
return raw_query("TRUNCATE " .. escape_identifier(table))
294306
end
295-
return {
307+
return setmetatable({
296308
__type = "mysql",
297309
connect = connect,
298-
NULL = NULL,
299-
TRUE = TRUE,
300-
FALSE = FALSE,
301-
raw = raw,
302-
is_raw = is_raw,
303-
list = list,
304-
is_list = is_list,
305-
clause = clause,
306-
is_clause = is_clause,
307-
is_encodable = is_encodable,
308310
encode_values = encode_values,
309311
encode_assigns = encode_assigns,
310312
encode_clause = encode_clause,
311313
interpolate_query = interpolate_query,
312314
query = query,
313315
escape_literal = escape_literal,
314316
escape_identifier = escape_identifier,
315-
format_date = format_date,
316317
set_raw_query = set_raw_query,
317318
get_raw_query = get_raw_query,
318319
parse_clause = function()
@@ -324,4 +325,6 @@ return {
324325
delete = _delete,
325326
truncate = _truncate,
326327
BACKENDS = BACKENDS
327-
}
328+
}, {
329+
__index = require("lapis.db.base")
330+
})

lapis/db/mysql.moon

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,19 @@ import concat from table
55
unpack = unpack or table.unpack
66

77
import
8-
FALSE
98
NULL
10-
TRUE
119
build_helpers
12-
format_date
1310
is_raw
14-
raw
1511
is_list
16-
list
17-
is_encodable
18-
clause
19-
is_clause
2012
from require "lapis.db.base"
2113

2214
logger = require "lapis.logging"
2315

24-
local conn
25-
local *
16+
-- NOTE: active connection only stored in local with luasql, otherwise request
17+
-- context is used to store connection
18+
local active_connection
19+
20+
local connect, raw_query
2621

2722
BACKENDS = {
2823
luasql: ->
@@ -35,16 +30,20 @@ BACKENDS = {
3530
table.insert conn_opts, mysql_config.host
3631
if mysql_config.port then table.insert conn_opts, mysql_config.port
3732

38-
conn = assert luasql\connect unpack(conn_opts)
33+
-- Note that connection is established up front. This is
34+
-- necessary since connection is used for escaping literal when
35+
-- using lua sql. This is distinct from ngx mode which lazily
36+
-- establishes connection on first query
37+
active_connection = assert luasql\connect unpack(conn_opts)
3938

4039
(q) ->
4140
logger.query q
42-
cur = assert conn\execute q
41+
cur = assert active_connection\execute q
4342
has_rows = type(cur) != "number"
4443

4544
result = {
4645
affected_rows: has_rows and cur\numrows! or cur
47-
last_auto_id: conn\getlastautoid!
46+
last_auto_id: active_connection\getlastautoid!
4847
}
4948

5049
if has_rows
@@ -152,8 +151,8 @@ escape_literal = (val) ->
152151
when "number"
153152
return tostring val
154153
when "string"
155-
if conn
156-
return "'#{conn\escape val}'"
154+
if active_connection
155+
return "'#{active_connection\escape val}'"
157156
else if ngx
158157
return ngx.quote_sql_str(val)
159158
else
@@ -268,17 +267,17 @@ _truncate = (table) ->
268267
--
269268
-- }
270269

271-
{
270+
setmetatable {
272271
__type: "mysql"
273272

274273
:connect
275-
:NULL, :TRUE, :FALSE
276-
277-
:raw, :is_raw
278-
:list, :is_list
279-
:clause, :is_clause
280274

281-
:is_encodable
275+
-- :NULL, :TRUE, :FALSE
276+
-- :raw, :is_raw
277+
-- :list, :is_list
278+
-- :clause, :is_clause
279+
-- :format_date
280+
-- :is_encodable
282281

283282
:encode_values
284283
:encode_assigns
@@ -289,8 +288,6 @@ _truncate = (table) ->
289288
:escape_literal
290289
:escape_identifier
291290

292-
:format_date
293-
294291
:set_raw_query
295292
:get_raw_query
296293

@@ -303,4 +300,5 @@ _truncate = (table) ->
303300
truncate: _truncate
304301

305302
:BACKENDS
306-
}
303+
}, __index: require "lapis.db.base"
304+

lapis/spec/db.moon

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

2-
-- NOTE: do not require lapis.db, etc. on the top level as it will try to bind
3-
-- to the connection type to the closure.
2+
-- NOTE: do not require config dependent modules on the top level here, eg.
3+
-- lapis.db
44

55
import assert_env from require "lapis.environment"
66

spec/mysql_spec.moon

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ value_table = { hello: db.FALSE, age: 34 }
1515

1616
TESTS = {
1717
-- lapis.db.mysql
18+
{
19+
-> db.format_date 0
20+
"1970-01-01 00:00:00"
21+
}
1822
{
1923
-> db.escape_identifier "dad"
2024
'`dad`'

spec/postgres_spec.moon

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ import sorted_pairs from require "spec.helpers"
1111

1212
TESTS = {
1313
-- lapis.db.postgres
14+
{
15+
-> db.format_date 0
16+
"1970-01-01 00:00:00"
17+
}
1418
{
1519
-> db.escape_identifier "dad"
1620
'"dad"'

0 commit comments

Comments
 (0)