-- connection settings
hostname = get( "137.74.0.12" )
username = get( "db_44403" )
password = get( "g2sJZXQVzj0P" )
database = get( "db_44403" )
port = tonumber( get( "21" ) )

-- external mysql connection settings
externalhostname = get( "137.74.0.12" )
externalusername = get( "db_44403" )
externalpassword = get( "g2sJZXQVzj0P" )
externaldatabase = get( "db_44403" )
externalport = tonumber( get( "21" ) )

-- global things
local MySQLConnection = nil
local forumConnection = nil
local resultPool = { }
local queryPool = { }
local sqllog = false
local countqueries = 0



--Debug
function tellMeMySQLStates(thePlayer)
if exports.integration:isPlayerScripter(thePlayer) then
if forumConnection then
if mysql_ping(forumConnection) then
outputChatBox("Forum Connection is online.", thePlayer, 0, 255, 0)
else
outputChatBox("Main DB is offline.", thePlayer, 255, 0, 0)
end
else
outputChatBox("Forum Connection is offline.", thePlayer, 255, 0, 0)
end
if MySQLConnection then
if mysql_ping(MySQLConnection) then
outputChatBox("Main DB is online.", thePlayer, 0, 255, 0)
else
outputChatBox("Main DB is offline.", thePlayer, 255, 0, 0)
end
else
outputChatBox("Main DB is offline.", thePlayer, 255, 0, 0)
end
end
end
addCommandHandler("testdb", tellMeMySQLStates, false, false)

--Forum settings
function openForumDatabase(res)
outputDebugString("--FORUMS DATABASE CREDENTIALS--")
outputDebugString("--HOST: "..(externalhostname or "Error"))
outputDebugString("--DB: "..(externaldatabase or "Error"))
outputDebugString("--USER: "..(externalusername or "Error"))
outputDebugString("--PW: "..(externalpassword and "***********" or "Error"))
outputDebugString("--PORT: "..(externalport or "Error"))
outputDebugString("--RESULT: ")
forumConnection = mysql_connect(externalhostname, externalusername, externalpassword, externaldatabase, externalport)
if (not forumConnection) then
if (res == getThisResource()) then
outputDebugString("Cannot connect to the forum database.")
end
return nil
else
outputDebugString("OK")
end
return nil
end
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), openForumDatabase, false)

function destroyForumConnection()
if (not forumConnection) then
return nil
end
mysql_close(forumConnection)
return nil
end
addEventHandler("onResourceStop", getResourceRootElement(getThisResource()), destroyForumConnection, false)

function forumPing()
if (mysql_ping(forumConnection) == false) then
-- FUU, NO MOAR CONNECTION
destroyForumConnection()
openForumDatabase(nil)
if (mysql_ping(forumConnection) == false) then
logForumSQLError()
return false
end
return true
end

return true
end

function forumQuery(str)
if sqllog then
exports['logs']:logMessage(str, 24)
end
countqueries = countqueries + 1

if (forumPing()) then
local result = mysql_query(forumConnection, str)
if (not result) then
logForumSQLError(str)
return false
end

local resultid = getFreeResultPoolID()
resultPool[resultid] = result
queryPool[resultid] = str
return resultid
end
return false
end

function forum_query_insert_free(str)
local queryresult = forumQuery(str)
if not (queryresult == false) then
local result = forum_insert_id()
free_result(queryresult)
return result
end
return false
end

function forum_insert_id()
return mysql_insert_id(forumConnection) or false
end

function forum_query_free(str)
local queryresult = forumQuery(str)
if not (queryresult == false) then
free_result(queryresult)
return true
end
return false
end

function forum_query_fetch_assoc(str)
local queryresult = forumQuery(str)
if not (queryresult == false) then
local result = fetch_assoc(queryresult)
free_result(queryresult)
return result
end
return false
end
--End Forum

-- connectToDatabase - Internal function, to spawn a DB connection
function connectToDatabase(res)
outputDebugString("--FORUMS DATABASE CREDENTIALS--")
outputDebugString("--HOST: "..(hostname or "Error"))
outputDebugString("--DB: "..(database or "Error"))
outputDebugString("--USER: "..(username or "Error"))
outputDebugString("--PW: "..(password and "***********" or "Error"))
outputDebugString("--PORT: "..(port or "Error"))
outputDebugString("--RESULT: ")

MySQLConnection = mysql_connect(hostname, username, password, database, port)

if (not MySQLConnection) then
if (res == getThisResource()) then
outputDebugString("Cannot connect to the MTA database.")
cancelEvent(true, "Cannot connect to the database.")
end
return nil
else
outputDebugString("OK")
end

return nil
end
addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), connectToDatabase, false)

-- destroyDatabaseConnection - Internal function, kill the connection if theres one.
function destroyDatabaseConnection()
if (not MySQLConnection) then
return nil
end
mysql_close(MySQLConnection)
return nil
end
addEventHandler("onResourceStop", getResourceRootElement(getThisResource()), destroyDatabaseConnection, false)

-- do something usefull here
function logSQLError(str)
local message = str or 'N/A'
outputDebugString("MYSQL ERROR "..mysql_errno(MySQLConnection) .. ": " .. mysql_error(MySQLConnection))
exports['logs']:logMessage("MYSQL ERROR [QUERY] " .. message .. " [ERROR] " .. mysql_errno(MySQLConnection) .. ": " .. mysql_error(MySQLConnection), 24)
end

function logForumSQLError(str)
local message = str or 'N/A'
outputDebugString("MYSQL ERROR "..mysql_errno(forumConnection) .. ": " .. mysql_error(forumConnection))
exports['logs']:logMessage("MYSQL ERROR [QUERY] " .. message .. " [ERROR] " .. mysql_errno(forumConnection) .. ": " .. mysql_error(forumConnection), 24)
end

function getFreeResultPoolID()
local size = #resultPool
if (size == 0) then
return 1
end
for index, query in ipairs(resultPool) do
if (query == nil) then
return index
end
end
return (size + 1)
end

------------ EXPORTED FUNCTIONS ---------------

function ping()
if (mysql_ping(MySQLConnection) == false) then
-- FUU, NO MOAR CONNECTION
destroyDatabaseConnection()
connectToDatabase(nil)
if (mysql_ping(MySQLConnection) == false) then
logSQLError()
return false
end
return true
end

return true
end

function escape_string(str)
if (ping()) then
return mysql_escape_string(MySQLConnection, str)
end
return false
end

function query(str)
--outputDebugString("[mySQL]...")
if sqllog then
exports['logs']:logMessage(str, 24)
end
countqueries = countqueries + 1

if (ping()) then
local result = mysql_query(MySQLConnection, str)
if (not result) then
logSQLError(str)
return false
end

local resultid = getFreeResultPoolID()
resultPool[resultid] = result
queryPool[resultid] = str
return resultid
end
return false
end

function unbuffered_query(str)
if sqllog then
exports['logs']:logMessage(str, 24)
end
countqueries = countqueries + 1

if (ping()) then
local result = mysql_unbuffered_query(MySQLConnection, str)
if (not result) then
logSQLError(str)
return false
end

local resultid = getFreeResultPoolID()
resultPool[resultid] = result
queryPool[resultid] = str
return resultid
end
return false
end

function query_free(str)
local queryresult = query(str)
if not (queryresult == false) then
free_result(queryresult)
return true
end
return false
end

function rows_assoc(resultid)
if (not resultPool[resultid]) then
return false
end
return mysql_rows_assoc(resultPool[resultid])
end

function fetch_assoc(resultid)
if (not resultPool[resultid]) then
return false
end
return mysql_fetch_assoc(resultPool[resultid])
end

function free_result(resultid)
if (not resultPool[resultid]) then
return false
end
mysql_free_result(resultPool[resultid])
table.remove(resultPool, resultid)
table.remove(queryPool, resultid)
return nil
end

-- incase a nub wants to use it, FINE
function result(resultid, row_offset, field_offset)
if (not resultPool[resultid]) then
return false
end
return mysql_result(resultPool[resultid], row_offset, field_offset)
end

function num_rows(resultid)
if (not resultPool[resultid]) then
return false
end
return mysql_num_rows(resultPool[resultid])

end

function insert_id()
return mysql_insert_id(MySQLConnection) or false
end

function query_fetch_assoc(str)
local queryresult = query(str)
if not (queryresult == false) then
local result = fetch_assoc(queryresult)
free_result(queryresult)
return result
end
return false
end

function query_rows_assoc(str)
local queryresult = query(str)
if not (queryresult == false) then
local result = rows_assoc(queryresult)
free_result(queryresult)
return result
end
return false
end

function query_insert_free(str)
local queryresult = query(str)
if not (queryresult == false) then
local result = insert_id()
free_result(queryresult)
return result
end
return false
end

function escape_string(str)
if not (str) then return false end
return mysql_escape_string(MySQLConnection, str)
end

function debugMode()
if (sqllog) then
sqllog = false
else
sqllog = true
end
return sqllog
end

function returnQueryStats()
return countqueries
-- maybe later more
end

function getOpenQueryStr( resultid )
if (not queryPool[resultid]) then
return false
end

return queryPool[resultid]
end

local resources = {
["mysql"] = getResourceFromName("mysql"),
["shop-system"] = getResourceFromName("shop-system"),
["vehicle-manager"] = getResourceFromName("vehicle-manager"),
}

addCommandHandler( 'mysqlleaky',
function(thePlayer)
if exports.integration:isPlayerScripter(thePlayer) then
outputDebugString("queryPool="..tostring(#queryPool))
outputChatBox("#queryPool="..tostring(#queryPool), thePlayer)
--[[
local count = 0
local res = {}
local pretty = {}
for k, v in pairs( resources ) do
if not res[v] then
res[v] = {}
end
table.insert(res[v], queryPool[k])
count = count + 1
end

if count == 0 then
outputDebugString('Not leaking anything.')
return
end

outputDebugString('Only leaking a mere ' .. count .. ' result handles.')

for k, v in pairs( res ) do
outputDebugString(tostring(k) .. ': ' .. tostring(#v) .. "\n\t" .. table.concat(v, "\n\t"))
end
--]]
end
end
)

--Custom functions
local function createWhereClause( array, required )
if not array then
-- will cause an error if it's required and we wanna concat it.
return not required and '' or nil
end
local strings = { }
for i, k in pairs( array ) do
table.insert( strings, "`" .. i .. "` = '" .. ( tonumber( k ) or escape_string( k ) ) .. "'" )
end
return ' WHERE ' .. table.concat(strings, ' AND ')
end

function select( tableName, clause )
local array = {}
local result = query( "SELECT * FROM " .. tableName .. createWhereClause( clause ) )
if result then
while true do
local a = fetch_assoc( result )
if not a then break end
table.insert(array, a)
end
free_result( result )
return array
end
return false
end

function select_one( tableName, clause )
local a
local result = query( "SELECT * FROM " .. tableName .. createWhereClause( clause ) .. ' LIMIT 1' )
if result then
a = fetch_assoc( result )
free_result( result )
return a
end
return false
end

function insert( tableName, array )
local keyNames = { }
local values = { }
for i, k in pairs( array ) do
table.insert( keyNames, i )
table.insert( values, tonumber( k ) or escape_string( k ) )
end

local q = "INSERT INTO `"..tableName.."` (`" .. table.concat( keyNames, "`, `" ) .. "`) VALUES ('" .. table.concat( values, "', '" ) .. "')"

return query_insert_free( q )
end

function update( tableName, array, clause )

local strings = { }
for i, k in pairs( array ) do
table.insert( strings, "`" .. i .. "` = " .. ( k == mysql_null() and "NULL" or ( "'" .. ( tonumber( k ) or escape_string( k ) ) .. "'" ) ) )
end
local q = "UPDATE `" .. tableName .. "` SET " .. table.concat( strings, ", " ) .. createWhereClause( clause, true )

return query_free( q )
end

function delete( tableName, clause )
return query_free( "DELETE FROM " .. tableName .. createWhereClause( clause, true ) )
end
Serwis wykorzystuje pliki cookies w celach statystycznych oraz funkcjonalnych. Korzystanie z witryny oznacza zgodę na ich zapis i odczyt wg ustawień przeglądarki.