Files
VnUtest/garrysmod/addons/shreports/lua/reports/lib_database.lua
2026-03-31 10:27:04 +03:00

122 lines
2.7 KiB
Lua

local base_table = SH_REPORTS
local prefix = "SH_REPORTS."
base_table.DatabaseConfig = {
host = "localhost",
user = "root",
password = "",
database = "mysql",
port = 3306,
}
function base_table:DBPrint(s)
local src = debug.getinfo(1)
local _, __, name = src.short_src:find("addons/(.-)/")
MsgC(Color(0, 200, 255), "[" .. name:upper() .. " DB] ", color_white, s, "\n")
end
function base_table:ConnectToDatabase()
local dm = self.DatabaseMode
if (dm == "mysqloo") then
require("mysqloo")
local cfg = self.DatabaseConfig
self:DBPrint("Connecting to database")
local db = mysqloo.connect(cfg.host, cfg.user, cfg.password, cfg.database, cfg.port)
db:setAutoReconnect(true)
db:setMultiStatements(true)
db.onConnected = function()
self:DBPrint("Connected to database!")
self.m_bConnectedToDB = true
if (self.DatabaseConnected) then
self:DatabaseConnected()
end
end
db.onConnectionFailed = function(me, err)
self:DBPrint("Failed to connect to database: " .. err .. "\n")
print(err)
self.m_bConnectedToDB = false
end
db:connect()
_G[prefix .. "DB"] = db
else
self:DBPrint("Defaulting to sqlite")
self.m_bConnectedToDB = true
if (self.DatabaseConnected) then
self:DatabaseConnected()
end
end
end
function base_table:IsConnectedToDB()
return self.m_bConnectedToDB
end
function base_table:Query(query, callback)
if (!self:IsConnectedToDB()) then
return end
local dm = self.DatabaseMode
callback = callback or function(q, ok, ret) end
if (dm == "mysqloo") then
local q = _G[prefix .. "DB"]:query(query)
q.onSuccess = function(me, data)
_SH_QUERY_LAST_INSERT_ID = me:lastInsert()
callback(query, true, data)
_SH_QUERY_LAST_INSERT_ID = nil
end
q.onError = function(me, err, fq)
callback(query, false, err .. " (" .. fq .. ")")
self:DBPrint(err .. " (" .. fq .. ")")
end
q:start()
else
local d = sql.Query(query)
if (d ~= false) then
callback(query, true, d or {})
else
callback(query, false, sql.LastError())
print("sqlite error (" .. query .. "): " .. sql.LastError())
end
end
end
function base_table:Escape(s)
local dm = self.DatabaseMode
if (dm == "mysqloo") then
return _G[prefix .. "DB"]:escape(s)
else
return sql.SQLStr(s, true)
end
end
function base_table:BetterQuery(query, args, callback)
for k, v in pairs (args) do
if (isstring(v)) then
v = self:Escape(v)
end
v = tostring(v)
query = query:Replace("{" .. k .. "}", "'" .. v .. "'")
query = query:Replace("[" .. k .. "]", v)
end
self:Query(query, callback)
end
hook.Add("InitPostEntity", prefix .. "ConnectToDatabase", function()
base_table:ConnectToDatabase()
end)
if (_G[prefix .. "DB"]) then
base_table.m_bConnectedToDB = _G[prefix .. "DB"]:status() == 0
end
-- vk.com/urbanichka