local mysql = require "resty.mysql"local _M = { host = "127.0.0.1", port = 3306, database = "", user = "root", password = "", charset = "utf8", tablePrefix = '', timeout = 1000, max_packet_size = 1024 * 1024,}function _M:new(config) config = config or {} setmetatable(config, self) self.__index = self return configendfunction _M:connect() local db, err = mysql:new() if not db then ngx.log(ngx.ERR, "failed to instantiate mysql: ", err) return nil end db:set_timeout(self.timeout) local ok, err, errcode, sqlstate = db:connect { host = self.host, port = self.port, database = self.database, user = self.user, password = self.password, max_packet_size = self.max_packet_size, } if not ok then ngx.log(ngx.ERR, "failed to connect: ", err, ": ", errcode, " ", sqlstate) return nil end local ok, err = db:get_reused_times() if (not ok or ok == 0) and self.charset then db:query('SET NAMES ' .. self.charset) end self.db = db return trueendfunction _M:set_keepalive(max_idle_timeout, pool_size) max_idle_timeout = max_idle_timeout or 10000 pool_size = pool_size or 10 local ok, err = self.db:set_keepalive(max_idle_timeout, pool_size) if not ok then ngx.log(ngx.ERR, "failed to set_keepalive: ", err) return nil end return trueendfunction _M:tbname(tableName) return self.tablePrefix .. tableNameendfunction _M:query(sql, nrows) --ngx.log(ngx.ERR, "query sql: ", sql) local res, err, errno, sqlstate = self.db:query(sql, nrows) if not res then ngx.log(ngx.ERR, "bad count result: ", err, ": ", errno, ": ", sqlstate, " sql:", sql) return nil end return resendfunction _M:count(tbname, where, sql) local count = 0 if not sql then where = where or '1=1' end local sql = string.format("SELECT COUNT(1) AS NUM FROM %s WHERE %s", self:tbname(tbname), where) local res = self:query(sql, 1) if res then count = tonumber(res[1]['NUM']) or 0 end return countendfunction _M:find(tbname, where, field, order, sql) if not sql then where = where or '1=1' field = field or '*' order = order and string.format('order by %s', order) or '' if type(field) == 'table' then field = string.format('`%s`', table.concat(field, '`,`')) end sql = string.format("SELECT %s FROM %s WHERE %s %s limit 1", field, self:tbname(tbname), where, order) end local res = self:query(sql, 1) if not res then return false end return res[1]endfunction _M:findOne(tbname, where, field, order, sql) if not sql then where = where or '1=1' field = field or 'id' order = order and string.format('order by %s', order) or '' sql = string.format("SELECT `%s` FROM %s WHERE %s %s limit 1", field, self:tbname(tbname), where, order) end local res = self:query(sql, 1) if not res then return false end return res[1][field]endfunction _M:findAll(tbname, where, field, order, limit, sql) if not sql then where = where or '1=1' field = field or '*' order = order and string.format('order by %s', order) or '' limit = limit and string.format('limit %s', limit) or '' if type(field) == 'table' then field = string.format('`%s`', table.concat(field, '`,`')) end sql = string.format("SELECT %s FROM %s WHERE %s %s %s", field, self:tbname(tbname), where, order, limit) end local res = self:query(sql, 1) return resendfunction _M:findCol(tbname, where, field, order, limit, sql) if not sql then where = where or '1=1' field = field or 'id' order = order and string.format('order by %s', order) or '' limit = limit and string.format('limit %s', limit) or '' sql = string.format("SELECT %s FROM %s WHERE %s %s %s", field, self:tbname(tbname), where, order, limit) end local res = self:query(sql) if not res then return false end local t = {} for k, r in pairs(res) do t[k] = r[field] end return tendfunction _M:insert(tbname, params) if type(params) ~= 'table' then ngx.log(ngx.ERR, 'mysql insert params required table', type(params)) return false end local field, valus = {}, {} local index = 1; for k, v in pairs(params) do field[index] = k valus[index] = ngx.quote_sql_str(v) index = index + 1 end field = table.concat(field, '`,`') valus = table.concat(valus, ",") local sql = string.format("INSERT INTO %s (`%s`) VALUES (%s)", self:tbname(tbname), field, valus) local res = self:query(sql) if not res then return false end return res.insert_idendfunction _M:update(tbname, where, params) if type(params) ~= 'table' then ngx.log(ngx.ERR, 'mysql update params required table') return false end local field = {} local index = 1; for k, v in pairs(params) do field[index] = string.format("`%s`=%s", k, ngx.quote_sql_str(v)) index = index + 1 end field = table.concat(field, ',') local sql = string.format("UPDATE %s SET %s WHERE %s", self:tbname(tbname), field, where) local res = self:query(sql) if not res then return false end return res.affected_rowsendfunction _M:delete(tbname, where) local sql = string.format("DELETE FROM %s WHERE %s", self:tbname(tbname), where) local res = self:query(sql) if not res then return false end return res.affected_rowsendfunction _M:close() local ok, err = self.db:close() if not ok then ngx.say("failed to close: ", err) return false end return trueendreturn _M