There're 3 files
connection.lua
meta.xml
s_mysql.lua
connection.lua
-- connection settings
local hostname = "localhost"
local username = "HeitorB"
local password = "mypass"
local database = "HeitorBdb"
local port = tonumber( get( "port" ) ) or 3306
-- global things.
local MySQLConnection = nil
local resultPool = { }
local sqllog = false
local countqueries = 0
-- connectToDatabase - Internal function, to spawn a DB connection
function connectToDatabase(res)
MySQLConnection = mysql_connect(hostname, username, password, database, port)
if (not MySQLConnection) then
if (res == getThisResource()) then
cancelEvent(true, "Cannot connect to the database.")
end
return nil
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 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)
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
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
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)
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)
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
meta.xml
<meta>
<info author="vG MTA Scripting Team" type="script" description="MySQL"/>
<script src="s_mysql.lua" type="server"/>
<export function="getMySQLUsername" type="server"/>
<export function="getMySQLPassword" type="server"/>
<export function="getMySQLDBName" type="server"/>
<export function="getMySQLHost" type="server"/>
<export function="getMySQLPort" type="server"/>
<!-- above is legacy -->
<script src="connection.lua" type="server" />
<export function="ping" type="server" http="false" />
<export function="escape_string" type="server" http="false" />
<export function="query" type="server" http="false" />
<export function="unbuffered_query" type="server" http="false" />
<export function="query_free" type="server" http="false" />
<export function="fetch_assoc" type="server" http="false" />
<export function="rows_assoc" type="server" http="false" />
<export function="free_result" type="server" http="false" />
<export function="result" type="server" http="false" />
<export function="num_rows" type="server" http="false" />
<export function="query_fetch_assoc"type="server" http="false" />
<export function="query_rows_assoc" type="server" http="false" />
<export function="insert_id" type="server" http="false" />
<export function="query_rows_assoc" type="server" http="false" />
<export function="query_insert_free"type="server" http="false" />
<export function="escape_string" type="server" http="false" />
<export function="debugMode" type="server" http="false" />
<export function="returnQueryStats" type="server" http="false" />
</meta>
s_mysql.lua
username = "HeitorB"
password = "mypass"
db = "HeitorBdb"
host = "localhost"
port = tonumber( get( "port" ) ) or 3306
function getMySQLUsername()
return username
end
function getMySQLPassword()
return password
end
function getMySQLDBName()
return db
end
function getMySQLHost()
return host
end
function getMySQLPort()
return port
end