tdengine 0.1.2

game server for Rust
Documentation
-- sqld.lua
-- 声明模块名

_LT  = "_LT" -- <
_LTE = "_LTE" -- <=
_GT  = "_GT" -- >
_GTE = "_GTE" -- >=
_NE  = "_NE" -- <>
_LIKE = "_LIKE" -- like

_LIMIT = "_LIMIT" 
_OFFSET = "_OFFSET"
_ORDER = "_ORDER"

_AND = "_AND"
_OR = "_OR"

_DESC = "_DESC"
_ASC = "_ASC"

_FIELDS = "_FIELDS"
_WHERE = "_WHERE"
_ACT = "_ACT"

SQL_D = {}
setmetatable(SQL_D, {__index = _G})
local _ENV = SQL_D

local sql_table = {
    _LT = "<",
    _LTE = "<=",
    _GT  = ">", -- >
    _GTE = ">=", -- >=
    _NE  = "<>", -- <>
    _LIKE = "like", -- like
    _LIMIT = "limit", 
    _OFFSET = "offset",
    _AND = "and",
    _OR = "or",
}

function convert_db_key( value )
    if is_string(value) then
        return string.format("`%s`", value)
    elseif is_int(value) then
        return tostring(value)
    else
        return value
    end
end

function convert_to_sql(value)
    if is_string(value) then
        return "'" .. value .. "'"
    elseif is_int(value) then
        return tostring(value)
    else
        return value
    end
end

function piece_one_condition( key, condition)
    if not condition then
        return ""
    end
    local result = ""
    local convert_key = convert_db_key(key)
    local convert_val
    if not is_table(condition) then
        result = convert_key .. "=" .. convert_to_sql(condition)
    else
        local defaultLink = condition[_ACT] or _AND
        for k,val in pairs(condition) do
            convert_val = convert_to_sql(val)
            if sizeof(result) > 0 then
                result = result .. " " .. sql_table[defaultLink] .. " "
            end
            if k == _LT or k == _LTE or k == _GT or k == _GTE or k == _NE or k == _LIKE then
                result = result .. " " .. convert_key .. " " .. sql_table[k] .. " " ..  convert_val
            end
        end
    end
    return result
end

function piece_single_where( condition )
    if not condition then
        return ""
    end
    local result
    for k,v in pairs(condition) do
        result = piece_one_condition(k, v)
        break
    end
    return result
end

function piece_where_condition( table_name, condition )
    if not condition then
        return ""
    end
    local defaultLinkValue = sql_table[condition[_ACT] or _AND]
    local where_condition = condition[_WHERE]
    local result = ""
    if is_array(where_condition) then
        for _,val in ipairs(where_condition) do
            if sizeof(result) > 0 then
                result = result .. " " .. defaultLinkValue .. " "
            end
            result = result .. piece_single_where(val)
        end
    elseif is_table(where_condition) then 
        result = piece_single_where(where_condition)
    end
    if sizeof(result) > 0 then
        return " where " .. result .. " " 
    end
    return ""
end

function piece_select_fields(table_name, condition)
    if not condition then
        return "*"
    end
    local fields = condition[_FIELDS]
    if not fields then
        return "*"
    else
        local result = ""
        for _,v in ipairs(fields) do
            if sizeof(result) > 0 then
                result = result .. ","
            end
            result = result .. string.format("`%s`", v)
        end
        return result
    end
end

function piece_select_offset( table_name, condition )
    if not condition then
        return ""
    end
    local offset = condition[_OFFSET]
    if not offset then
        return ""
    end
    return " offset " .. tostring(offset) .. " "
end

function piece_select_order( table_name, condition )
    if not condition then
        return ""
    end
    local order = condition[_ORDER]
    if not order or not is_table(order) then
        return ""
    end
    local key, value = nil, nil
    for k,v in pairs(order) do
        key, value = k, v
        break
    end
    if not key then
        return ""
    end
    return " ORDER BY `" .. key .. "` " .. value .. " "
end

function piece_select_limit( table_name, condition )
    if not condition then
        return ""
    end
    local limit = condition[_LIMIT]
    if not limit then
        return ""
    end
    return " limit " .. tostring(limit) .. " "
end

function select_sql( table_name, condition )
    local result = "SELECT " .. piece_select_fields(table_name, condition) .. " FROM " .. table_name
    result = result .. piece_where_condition(table_name, condition)
    result = result .. piece_select_order(table_name, condition)
    result = result .. piece_select_limit(table_name, condition)
    result = result .. piece_select_offset(table_name, condition)
    return result
end

function encode_table_data(table_name, data)
    local tabledata = DATA_D.get_table_fields(table_name) or {}
    local result = {misc={}}
    for k,v in pairs(data) do
        if not tabledata[k] then
            result.misc[k] = v
        else
            result[k] = v
        end
    end
    if tabledata.misc then
        result.misc = encode_json(result.misc)
    else
        result.misc = nil
    end
    --trace("encode_table_data table_name is %o, tabledata is %o, result is %o", table_name, tabledata, result)
    return result
end

function decode_table_data(table_name, data) 
    local result = dup(data)
    result.misc = decode_json(data.misc)
    for k,v in pairs(result.misc) do
        result[k] = v
    end
    result.misc = nil
    return result
end

function piece_insert_sql( table_name, data )
    data = encode_table_data(table_name, data)
    local field_key = ""
    local field_val = ""
    for k,v in pairs(data) do
        if sizeof(field_key) > 0 then
            field_key = field_key .. ","
            field_val = field_val .. ","
        end
        field_key = field_key .. convert_db_key(k)
        field_val = field_val .. convert_to_sql(v)
    end
    return "(" .. field_key .. ")" .. " VALUES (" .. field_val .. ")" 
end

function insert_sql( table_name, data )
    local sql = piece_insert_sql(table_name, data)
    return "INSERT INTO " .. convert_db_key(table_name) .. sql
end

function piece_update_sql(table_name, data)
    local update_data = encode_table_data(table_name, data)
    if not data["misc"] then --混合字段只有主动更新才进行更新
        update_data["misc"] = nil
    end
    local result = ""
    for k,v in pairs(data) do
        if sizeof(result) > 0 then
            result = result .. ","
        end
        result = result .. " `" .. k .. "` = " .. convert_to_sql(v)
    end
    return result 

end

function update_sql( table_name, data, condition )
    local sql = piece_update_sql(table_name, data)
    if condition and not condition[_WHERE] then
        local tmp = condition
        condition = {}
        condition[_WHERE] = tmp
    end
    local where_sql = piece_where_condition(table_name, condition)
    return "UPDATE " .. table_name .. " SET " .. sql .. where_sql
end

function delete_sql( table_name, condition )
    if condition and not condition[_WHERE] then
        local tmp = condition
        condition = {}
        condition[_WHERE] = tmp
    end
    local where_sql = piece_where_condition(table_name, condition)
    return "DELETE FROM " .. table_name .. " " .. where_sql
end



-- 'is_array({[1]=2,[2]=3,act="and"})

-- 'is_array({[1]=2,[2]=3})

-- SQL_D.select_sql("author", {_FIELDS={"me","you","he"}, _WHERE={he=21}, _LIMIT=2, _OFFSET=3})
-- 'SQL_D.select_sql("author", {_FIELDS={"me","you","he"}, _WHERE={he={_LT=2}}, _LIMIT=2, _OFFSET=3})

-- 'SQL_D.insert_sql("author", {fda="fd",er="re"})

-- 'SQL_D.update_sql("author", {fda="fd",er="re"}, {he={_LT=2}})
-- 'SQL_D.update_sql("author", {fda="fd",er="re"})

-- 'SQL_D.delete_sql("author", {he={_LT=2}})

--                 {   "field" : "account",                   "type" : "string",      "len" : 12,             "key" : "primary"   },
--                 {   "field" : "device_id",                 "type" : "string",      "len" : 32                                  },
--                 {   "field" : "rid",                       "type" : "string",      "len" : 12,             "key" : "unique"    },
--                 {   "field" : "name",                      "type" : "string",      "len" : 18                                  },
--                 {   "field" : "password",                  "type" : "string",      "len" : 32                                  },
--                 {   "field" : "takeover_pwd",              "type" : "string",      "len" : 32                                  },
--                 {   "field" : "is_freezed",                "type" : "int",         "len" : 1                                   },
--                 {   "field" : "emoney",                    "type" : "int",         "len" : 32                                  },
--                 {   "field" : "misc",                      "type" : "string",      "len" : 1024                                },

-- 'SQL_D.insert_sql("author", {account="myuser",device_id="2323232", rid="fdkaskjfdk", name="you", test="dfdsa", test2="fdsafds"})

-- DB_D.execute_db("hddb3", SQL_D.insert_sql("account", {account="myuser",device_id="2323232", rid="fdkaskjfdk", name="you", test="dfdsa", test2="fdsafds"}))

-- DB_D.read_db("hddb3", SQL_D.select_sql("account"))

-- DB_D.execute_db("hddb3", SQL_D.update_sql("account", {name="he"}))

-- DB_D.execute_db("mser", SQL_D.delete_sql("user"))

-- 'DB_D.sync_execute_db("hddb3", SQL_D.select_sql("account"))

-- 'DB_D.sync_execute_db("mser", SQL_D.select_sql("account"))


-- x, y = DB_D.sync_execute_db("mser", SQL_D.select_sql("account"))
-- 'x
-- 'y
-- sync_execute_db

-- '