Files
wnsrc/lua/slib/sv_storage.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

141 lines
4.0 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
slib = slib or {}
local existSQLChecked = {}
local query, db = sql.Query
local dbconnected = false
local verified = {}
local function verifySQL(id, type)
if verified[id] and verified[id][type] then return end
if type == "sql_local" then
query("CREATE TABLE IF NOT EXISTS "..id.."_data(id VARCHAR(19), data TEXT)")
elseif type == "mysql" then
require( "mysqloo" )
local dbinfo = _G[id].config["mysql_info"]
db = mysqloo.connect(dbinfo.host, dbinfo.username, dbinfo.password, dbinfo.database, dbinfo.port)
function db:onConnected()
print("slib: Successfully made SQL Connection for "..id)
dbconnected = true
hook.Run("slib:MySQLConnected")
end
function db:onConnectionFailed(err)
print("slib: Failed to make SQL Connection for "..id)
print( "Error:", err )
end
db:query("CREATE TABLE IF NOT EXISTS "..id.."_data(id VARCHAR(19), data TEXT)"):start()
db:connect()
end
verified[id] = verified[id] or {}
verified[id][type] = true
end
slib.syncData = function(id, type, str)
verifySQL(id, type)
local data
if type == "file" then
local sid64
if string.find(str, "STEAM") then
sid64 = util.SteamIDTo64(str)
end
data = file.Read(id.."/data/"..(sid64 or str)..".json", "DATA")
elseif type == "sql_local" then
data = query("SELECT data FROM "..id.."_data WHERE id = '"..str.."'")
if data then
data = data[1].data
end
elseif type == "mysql" then
local q = db:query("SELECT data FROM "..id.."_data WHERE id = '"..str.."'")
function q:onSuccess(res)
if table.IsEmpty(res) then
q:onError()
else
if res[1] then
data = res[1].data
data = data and util.JSONToTable(data)
end
hook.Run("slib:SyncedData", id, str, data and data or false)
end
end
function q:onError(err, sql)
hook.Run("slib:SyncedData", id, str, false)
end
q:start()
return
end
data = data and util.JSONToTable(data)
hook.Run("slib:SyncedData", id, str, data and data or false)
end
slib.saveData = function(id, type, str, data)
verifySQL(id, type)
if istable(data) then
data = util.TableToJSON(data)
end
if type == "file" then
if string.find(str, "STEAM") then
str = util.SteamIDTo64(str)
end
file.CreateDir(id.."/data")
file.Write(id.."/data/"..str..".json", data)
elseif type == "sql_local" then
if !existSQLChecked[str] then
if !(query("SELECT * FROM "..id.."_data WHERE id = '"..str.."'")) then
query("INSERT INTO "..id.."_data (id, data) VALUES('"..str.."','"..data.."')")
end
existSQLChecked[str] = true
return
end
query("UPDATE "..id.."_data SET data='"..data.."' WHERE id = '"..str.."'")
elseif type == "mysql" then
if !dbconnected then return end
if !existSQLChecked[str] then
local q = db:query("SELECT * FROM "..id.."_data WHERE id = '"..str.."'")
function q:onSuccess(res)
if !res or !res[1] then
local q = db:query("INSERT INTO "..id.."_data (id, data) VALUES('"..str.."','"..data.."')")
q:start()
return else
existSQLChecked[str] = true
end
end
q:start()
end
local q = db:query("UPDATE "..id.."_data SET data='"..data.."' WHERE id = '"..str.."'")
q:start()
end
end