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