DB_D = {}
setmetatable(DB_D, {__index = _G})
local _ENV = DB_D
local TIMEOUT = 15
local cookie_map = {}
local db_type
local function timer_handle(para)
local cur_time = os.time()
for k,v in pairs(cookie_map) do
if v["begin_time"] + TIMEOUT <= cur_time then
local callback, arg = v["callback"], v["callback_arg"]
cookie_map[k] = nil
if type(callback) == "function" then
if arg then
callback(arg, -2)
else
callback(-2)
end
end
end
end
end
local function default_callback(sql_cmd, ret, result_list)
trace("default_callback sql_cmd(%o) failed. error : '%o'\n", sql_cmd, ret)
end
function get_auto_increment_desc()
if get_db_type() == "sqlite" then
return "INTEGER PRIMARY KEY "
else
return "INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT "
end
end
function get_db_type()
if DB_TYPE then
return DB_TYPE
end
db_type = get_config_value("DB_TYPE")
if sizeof(db_type) == 0 and STANDALONE then
db_type = "sqlite"
end
return db_type
end
function get_db_index()
local dt = get_db_type()
if dt == "mysql" then
return 1
end
return 0
end
function lua_sync_insert(db_name, sql_cmd, n_dbtype)
n_dbtype = n_dbtype or get_db_index()
local err, ret = db_insert_sync(db_name, sql_cmd, n_dbtype)
return err, ret
end
function lua_sync_select(db_name, sql_cmd, n_dbtype)
n_dbtype = n_dbtype or get_db_index()
local err, ret = db_select_sync(db_name, n_dbtype, sql_cmd)
if err ~= 0 then
return err, ret
end
return err, unpack(ret)
end
function convert_table_info(table_struct)
local result = {}
for _,value in ipairs(table_struct) do
local convert = {}
convert["field"] = value["COLUMN_NAME"] or ""
convert["type"] = value["COLUMN_TYPE"] or ""
convert["key"] = value["COLUMN_KEY"] or ""
convert["default"] = value["COLUMN_DEFAULT"] or ""
convert["extra"] = value["EXTRA"] or ""
convert["nullable"] = value["IS_NULLABLE"] == "NO" and 0 or 1
result[convert["field"]] = convert
end
return result
end
function convert_table_index(table_struct)
local result = {}
for _,value in ipairs(table_struct) do
local convert = {}
convert["table"] = value["TABLE_NAME"] or ""
convert["name"] = value["INDEX_NAME"] or ""
convert["indexs"] = value["COLUMN_NAME"] or ""
convert["uni"] = tonumber(value["NON_UNIQUE"]) == 0
result[convert["name"]] = convert
end
return result
end
function get_table(table_name, db_name)
db_name = db_name or DATA_D.get_db_name(table_name)
if not db_name then
return
end
local sql_cmd
local n_dbtype = 0
if get_db_type() == "sqlite" then
sql_cmd = string.format("pragma table_info (%s)", table_name)
else
n_dbtype = 1
sql_cmd = string.format("describe %s", table_name)
end
local err, ret = lua_sync_select(db_name, sql_cmd, n_dbtype)
return ret
end
function get_index_table(table_name, db_name)
db_name = db_name or DATA_D.get_db_name(table_name)
if not db_name then
return
end
local sql_cmd
local n_dbtype = 0
if get_db_type() == "sqlite" then
sql_cmd = string.format("pragma table_info (%s)", table_name)
else
n_dbtype = 1
sql_cmd = string.format("SHOW INDEX FROM %s", table_name)
end
local err, ret = lua_sync_select(db_name, sql_cmd, n_dbtype)
return ret
end
function is_cookie_map_nil()
if sizeof(cookie_map) == 0 then
return true
end
return false
end
function notify_operation_result(cookie, ret, result_list)
local oper = cookie_map[tostring(cookie)]
if not oper then
do return end
end
cookie_map[tostring(cookie)] = nil
local callback = oper["callback"]
local callback_arg = oper["callback_arg"]
local sql_cmd = oper["sql_cmd"]
if type(callback) == "function" then
if callback_arg then
callback(callback_arg, ret, result_list)
else
callback(ret, result_list)
end
else
default_callback(sql_cmd, ret, result_list)
end
end
function read_db(table_name, sql_cmd, callback, callback_arg)
local db_name = DATA_D.get_db_name(table_name)
local cookie = 0
if callback then
cookie = new_cookie()
local record = {
callback = callback,
callback_arg = callback_arg,
sql_cmd = sql_cmd,
begin_time = os.time(),
}
cookie_map[tostring(cookie)] = record
end
local n_dbtype = 0
if get_db_type() == "mysql" then
n_dbtype = 1
end
db_select(db_name, n_dbtype, sql_cmd, cookie)
end
function transaction_db(table_name, sql_cmd_list, callback, callback_arg)
local db_name = DATA_D.get_db_name(table_name)
local cookie = 0
if callback then
cookie = new_cookie()
local record = {
callback = callback,
callback_arg = callback_arg,
sql_cmd = sql_cmd_list,
begin_time = os.time(),
}
cookie_map[tostring(cookie)] = record
end
local n_dbtype = 0
if get_db_type() == "mysql" then
n_dbtype = 1
end
db_transaction(db_name, n_dbtype, sql_cmd_list, cookie, 0)
end
function batch_execute_db(table_name, sql_cmd_list, callback, callback_arg)
local db_name = DATA_D.get_db_name(table_name)
local cookie = 0
if callback then
cookie = new_cookie()
local record = {
callback = callback,
callback_arg = callback_arg,
sql_cmd = sql_cmd_list,
begin_time = os.time(),
}
cookie_map[tostring(cookie)] = record
end
local n_dbtype = 0
if get_db_type() == "mysql" then
n_dbtype = 1
end
db_batch_execute(db_name, n_dbtype, sql_cmd_list, cookie, 0)
end
function sync_insert_db(table_name, sql_cmd)
local db_name = DATA_D.get_db_name(table_name)
return lua_sync_insert(db_name, sql_cmd)
end
function insert_db(table_name, sql_cmd, callback, callback_arg)
local db_name = DATA_D.get_db_name(table_name)
local cookie = 0
if callback then
cookie = new_cookie()
local record = {
callback = callback,
callback_arg = callback_arg,
sql_cmd = sql_cmd,
begin_time = os.time(),
}
cookie_map[tostring(cookie)] = record
end
local n_dbtype = 0
if get_db_type() == "mysql" then
n_dbtype = 1
end
db_insert(db_name, n_dbtype, sql_cmd, cookie)
end
function execute_db(table_name, sql_cmd, callback, callback_arg)
local db_name = DATA_D.get_db_name(table_name)
local cookie = 0
if callback then
cookie = new_cookie()
local record = {
callback = callback,
callback_arg = callback_arg,
sql_cmd = sql_cmd,
begin_time = os.time(),
}
cookie_map[tostring(cookie)] = record
end
local n_dbtype = 0
if get_db_type() == "mysql" then
n_dbtype = 1
end
db_execute(db_name, n_dbtype, sql_cmd, cookie)
end
function gen_cloumn_ext(cloumn)
local sql = ""
if cloumn["default"] and sizeof(cloumn["default"]) > 0 then
sql = sql .. string.format(" DEFAULT '%s' ", cloumn["default"])
end
if cloumn["nullable"] == 0 then
sql = sql .. " NOT NULL "
end
if cloumn["comment"] then
sql = sql .. string.format(" COMMENT '%s'", cloumn["comment"])
end
return sql
end
function gen_cloumn_after(cloumn)
local sql = ""
if cloumn["pre_field"] and sizeof(cloumn["pre_field"]) > 0 then
sql = sql .. string.format(" AFTER `%s` ", cloumn["pre_field"])
end
return sql
end
function gen_unique_ext(cloumn)
if not cloumn["key"] then
return ""
end
if cloumn["key"] == "NO_UNI" then
return string.format(", DROP INDEX `%s`", cloumn["field"])
end
if cloumn["key"] == "UNI" then
return string.format(", ADD UNIQUE (%s)", cloumn["field"])
end
return ""
end
function del_primary_key(db_name, table_name, key)
if key == nil or sizeof(key) == 0 then
return true
end
local sql = string.format("ALTER TABLE `%s` DROP PRIMARY KEY", table_name)
return lua_sync_select(db_name, sql)
end
function add_primary_key(db_name, table_name, key)
if key == nil or sizeof(key) == 0 then
return true
end
local sql = string.format("ALTER TABLE `%s` ADD PRIMARY KEY (%s)", table_name, key)
return lua_sync_select(db_name, sql)
end
function add_cloumn(db_name, table_name, cloumn)
local sql = string.format("ALTER TABLE `%s` ADD COLUMN `%s` %s", table_name, cloumn["field"], cloumn["type"])
sql = sql .. gen_cloumn_ext(cloumn)
sql = sql .. gen_cloumn_after(cloumn)
trace("add_cloumn sql is %o", sql)
return lua_sync_select(db_name, sql)
end
function del_cloumn(db_name, table_name, cloumn)
local sql = string.format("ALTER TABLE `%s` DROP COLUMN `%s`", table_name, cloumn["field"])
trace("del_cloumn sql is %o", sql)
return lua_sync_select(db_name, sql)
end
function mod_cloumn(db_name, table_name, cloumn)
local sql = string.format("ALTER TABLE `%s` MODIFY COLUMN `%s` %s", table_name, cloumn["field"], cloumn["type"])
sql = sql .. gen_cloumn_ext(cloumn)
trace("mod_cloumn sql is %o", sql)
return lua_sync_select(db_name, sql)
end
function add_index(db_name, table_name, index)
local sql = string.format("ALTER TABLE `%s` ADD ", table_name)
if index["uni"] then
sql = sql .. " UNIQUE "
end
sql = sql .. string.format(" INDEX %s(%s)", index["name"], index["indexs"])
return lua_sync_select(db_name, sql)
end
function get_cookie_map()
return cookie_map
end
function create()
set_timer(1000, timer_handle, nil, true)
end
create()