Database = {} Database.__index = Database function Database:new(...) local instance = {} setmetatable(instance, Database) if instance:constructor(...) then return instance end return false end function Database:constructor(...) self.database = arg[1] self.host = arg[2] self.username = arg[3] self.password = arg[4] self.func = {} self.func.queryAsyncResponse = function(...) self:queryAsyncResponse(...) end self.func.queryAsyncMultiselectResponse = function(...) self:queryAsyncMultiselectResponse(...) end if self:connect() then return true else return false end end function Database:connect() setRuleValue("dbname", self.database) setRuleValue("dbhost", self.host) setRuleValue("dbuser", self.username) setRuleValue("dbpass", self.password) self.connection = dbConnect("mysql", string.format("dbname=%s;host=%s", self.database, self.host), self.username, self.password, "share=1;multi_statements=1") if self.connection then outputDebugString(string.format("[MYSQL] Connected to the database (%s)", self.database)) self:updateNames() return true else outputDebugString(string.format("[MYSQL] Cannot connect to the database (%s)", self.database), 3, 255, 0, 0) return false end end function Database:query(...) local qh = dbQuery(self.connection, dbPrepareString(self.connection, ...)) if not qh then return false end local result, num_affected_rows, last_insert_id = dbPoll(qh, -1, true) if not result then dbFree(qh) end return result, num_affected_rows, last_insert_id end function Database:queryAsync(data, ...) dbQuery(self.func.queryAsyncResponse, {{data}}, self.connection, dbPrepareString(self.connection, ...)) end function Database:queryAsyncWithoutResponse(...) dbQuery(function(qh) dbPoll(qh, 0, true) end, {}, self.connection, dbPrepareString(self.connection, ...)) end function Database:queryAsyncResponse(qh, data) local result, num_affected_rows, last_insert_id = dbPoll(qh, 0, true) triggerEvent(data[1].callback, resourceRoot, data[1], result, num_affected_rows, last_insert_id) end function Database:queryAsyncMultiselect(data, ...) dbQuery(self.func.queryAsyncMultiselectResponse, {{data}}, self.connection, dbPrepareString(self.connection, ...)) end function Database:queryAsyncMultiselectResponse(qh, data) local result, num_affected_rows, last_insert_id = dbPoll(qh, 0, true) triggerEvent(data[1].callback, resourceRoot, data[1], result, num_affected_rows, last_insert_id) end function Database:queryMultiselect(...) local qh = dbQuery(self.connection, dbPrepareString(self.connection, ...)) if not qh then return false end local result, num_affected_rows, last_insert_id = dbPoll(qh, -1, true) if not result then dbFree(qh) end return result, num_affected_rows, last_insert_id end function Database:updateNames() self:query("SET NAMES utf8") end local connection function createMysql() connection = Database:new("database" db_80168, "host" 137.74.6.118, "username" db_80168, "password" WRWPwfWGSa30) end function query(...) local query, rows, lastID = connection:query(...) return query, rows, lastID end function queryMultiselect(...) local time = getTickCount() local query, rows, lastID = connection:queryMultiselect(...) addDevData(getResourceName(sourceResource), getTickCount() - time, #query) return query, rows, lastID end function queryAsync(callback, ...) connection:queryAsync(callback, ...) end function queryAsyncMultiselect(callback, ...) connection:queryAsyncMultiselect(callback, ...) end function queryAsyncWithoutResponse(...) connection:queryAsyncWithoutResponse(...) end -- Export to dev admin data function addDevData(resourceName, time, results) exports.TR_admin:addMysqlInfo(string.format("Resource: %s Time: %d tick Results: %d", resourceName, time, results)) end createMysql()