dobrograd-13-06-2022/garrysmod/addons/util-gac/lua/gacstorage/gac_tmysql.lua
Jonny_Bro (Nikita) e4d5311906 first commit
2023-11-16 15:01:19 +05:00

86 lines
No EOL
2.2 KiB
Lua

local _SysTime = SysTime
local _hook_Add = hook.Add
local _include = include
local _print = print
local _require = require
local _tostring = tostring
_require "tmysql4"
gAC.DB = gAC.DB or {}
function gAC.DB.Connect()
if (gAC.DB.Handler) then
gAC.Print("Using pre-established MySQL link.")
return
end
local db, err = tmysql.initialize(gAC.storage.hostname, gAC.storage.username, gAC.storage.password, gAC.storage.database, gAC.storage.port)
if (db == false) or err then
gAC.Print("MySQL connection failed: " .. _tostring(err))
gAC.Print("Resorting to SQLite")
_include("gacstorage/gac_sqlite.lua")
return
end
gAC.Print("MySQL connection established at " .. os.date())
gAC.DB.Handler = db
end
function gAC.EscapeStr(txt)
return gAC.DB.Handler:Escape(_tostring(txt or ""))
end
local retry_errors = {
['Lost connection to MySQL server during query'] = true,
[' MySQL server has gone away'] = true,
}
function gAC.DB.Query(query, callback, ret)
if (!query) then
_print("No query given.")
return
end
if ret then
return gAC.DB.QueryRet(query, callback)
end
gAC.DB.Handler:Query(query, function(results)
if (results[1].error ~= nil) then
if retry_errors[results[1].error] then
gAC.Print("MySQL connection lost during query. Reconnecting.")
gAC.DB.Query(query, callback, ret)
else
gAC.Print("MySQL error: " .. results[1].error)
gAC.Print("Query: " .. query)
end
elseif callback then
callback(results[1].data)
end
end)
end
function gAC.DB.QueryRet(query, callback)
local data
local start = _SysTime() + 0.3
gAC.DB.Query(query, function(_data)
data = _data
end)
while (not data) and (start >= _SysTime()) do
gAC.DB.Handler:Poll()
end
return callback and callback(data) or data
end
_hook_Add("Initialize", "gAC.Connect", gAC.DB.Connect)
function gAC.LogEvent( plr, log )
gAC.DB.Query("INSERT INTO `gac_detections` (`time`, `steamid`, `detection`) VALUES (" .. os.time() .. ", '" .. gAC.EscapeStr(plr:SteamID()) .. "', '" .. gAC.EscapeStr(log) .. "')")
end
function gAC.GetLog( id, cb )
gAC.DB.Query("SELECT `time`, `detection` FROM `gac_detections` WHERE `steamid` = '" .. gAC.EscapeStr(id) .. "' ORDER BY `time` DESC", cb)
end