You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.1 KiB
Lua
136 lines
3.1 KiB
Lua
local sgsub = string.gsub
|
|
local tinsert = table.insert
|
|
local type = type
|
|
local ipairs = ipairs
|
|
local pairs = pairs
|
|
local mysql = require("resty.mysql")
|
|
local cjson = require("cjson")
|
|
local utils = require("app.libs.utils")
|
|
local config = require("app.config.config")
|
|
local DB = {}
|
|
|
|
function DB:new(conf)
|
|
conf = conf or config.mysql
|
|
local instance = {}
|
|
instance.conf = conf
|
|
setmetatable(instance, { __index = self})
|
|
return instance
|
|
end
|
|
|
|
function DB:exec(sql)
|
|
if not sql then
|
|
ngx.log(ngx.ERR, "sql parse error! please check")
|
|
return nil, "sql parse error! please check"
|
|
end
|
|
|
|
local conf = self.conf
|
|
local db, err = mysql:new()
|
|
if not db then
|
|
ngx.say("failed to instantiate mysql: ", err)
|
|
return
|
|
end
|
|
db:set_timeout(conf.timeout) -- 1 sec
|
|
|
|
local ok, err, errno, sqlstate = db:connect(conf.connect_config)
|
|
if not ok then
|
|
ngx.say("failed to connect: ", err, ": ", errno, " ", sqlstate)
|
|
return
|
|
end
|
|
|
|
ngx.log(ngx.ERR, "connected to mysql, reused_times:", db:get_reused_times(), " sql:", sql)
|
|
|
|
db:query("SET NAMES utf8")
|
|
local res, err, errno, sqlstate = db:query(sql)
|
|
if not res then
|
|
ngx.log(ngx.ERR, "bad result: ", err, ": ", errno, ": ", sqlstate, ".")
|
|
end
|
|
|
|
local ok, err = db:set_keepalive(conf.pool_config.max_idle_timeout, conf.pool_config.pool_size)
|
|
if not ok then
|
|
ngx.say("failed to set keepalive: ", err)
|
|
end
|
|
|
|
return res, err, errno, sqlstate
|
|
end
|
|
|
|
|
|
|
|
function DB:query(sql, params)
|
|
sql = self:parse_sql(sql, params)
|
|
return self:exec(sql)
|
|
end
|
|
|
|
function DB:select(sql, params)
|
|
return self:query(sql, params)
|
|
end
|
|
|
|
function DB:insert(sql, params)
|
|
local res, err, errno, sqlstate = self:query(sql, params)
|
|
if res and not err then
|
|
return res.insert_id, err
|
|
else
|
|
return res, err
|
|
end
|
|
end
|
|
|
|
function DB:update(sql, params)
|
|
return self:query(sql, params)
|
|
end
|
|
|
|
function DB:delete(sql, params)
|
|
local res, err, errno, sqlstate = self:query(sql, params)
|
|
if res and not err then
|
|
return res.affected_rows, err
|
|
else
|
|
return res, err
|
|
end
|
|
end
|
|
|
|
local function split(str, delimiter)
|
|
if str==nil or str=='' or delimiter==nil then
|
|
return nil
|
|
end
|
|
|
|
local result = {}
|
|
for match in (str..delimiter):gmatch("(.-)"..delimiter) do
|
|
tinsert(result, match)
|
|
end
|
|
return result
|
|
end
|
|
|
|
|
|
local function compose(t, params)
|
|
if t==nil or params==nil or type(t)~="table" or type(params)~="table" or #t~=#params+1 or #t==0 then
|
|
return nil
|
|
else
|
|
local result = t[1]
|
|
for i=1, #params do
|
|
result = result .. params[i].. t[i+1]
|
|
end
|
|
return result
|
|
end
|
|
end
|
|
|
|
|
|
function DB:parse_sql(sql, params)
|
|
if not params or not utils.table_is_array(params) or #params == 0 then
|
|
return sql
|
|
end
|
|
|
|
local new_params = {}
|
|
for i, v in ipairs(params) do
|
|
if v and type(v) == "string" then
|
|
v = ngx.quote_sql_str(v)
|
|
end
|
|
|
|
tinsert(new_params, v)
|
|
end
|
|
|
|
local t = split(sql,"?")
|
|
local sql = compose(t, new_params)
|
|
|
|
return sql
|
|
end
|
|
|
|
return DB
|