[Plugin] [REL] MySQL Plugin (Now on github!)

Quote:
Originally Posted by iZN
Посмотреть сообщение
Are you saving the connection ID through mysql_connect? Or you might have messed up the pool parameter of mysql_connect?

pawn Код:
new SQL = mysql_connect( ... );
pawn Код:
native mysql_connect(const host[], const user[], const database[], const password[], port = 3306, bool:autoreconnect = true, pool_size = 2); // <-- this one
If anything doesn't works, try replacing SQL with 1 instead.

pawn Код:
mysql_tquery(1, szQuery, "OnQueryFinish", "ii", THREAD_NO_RESULT, playerid);
well i use this way:

pawn Код:
new SQL = -1;

public  OnGameModeInit()
{
    SQL = mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
    return 1;
}
maybe the problem is:

pawn Код:
new SQL = -1;
?
Reply

Quote:
Originally Posted by PT
Посмотреть сообщение
well i use this way:

pawn Код:
new SQL = -1;

public  OnGameModeInit()
{
    SQL = mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
    return 1;
}
maybe the problem is:

pawn Код:
new SQL = -1;
?
Yes that's the problem!

pawn Код:
new SQL; // this is perfect.
Reply

Quote:
Originally Posted by iZN
Посмотреть сообщение
Yes that's the problem!

pawn Код:
new SQL; // this is perfect.
pawn Код:
[16:18:26] [ERROR] "mysql_format" - invalid connection handle (id: 0)
[16:18:26] [ERROR] "mysql_tquery" - invalid connection handle (id: 0)
looks like the problem dont be that.

i say that because the -1 is to on example scripts on git: https://github.com/pBlueG/SA-MP-MySQ...stem-cache.pwn
Reply

yes

look:

pawn Код:
[16:52:44] [ERROR] "mysql_format" - invalid connection handle (id: 0)
[16:52:44] [ERROR] "mysql_tquery" - invalid connection handle (id: 0)
[16:52:44] [DEBUG] mysql_connect - host: "****", user: "****", database: "****", password: "****", port: 3306, autoreconnect: true, pool_size: 2
[16:52:44] [DEBUG] CMySQLHandle::Create - creating new connection..
[16:52:44] [DEBUG] CMySQLHandle::CMySQLHandle - constructor called
[16:52:44] [DEBUG] CMySQLHandle::Create - connection created (id: 1)
[16:52:44] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[16:52:44] [DEBUG] CMySQLConnection::Connect - connection was successful
[16:52:44] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[16:52:44] [DEBUG] mysql_errno - connection: 1
Reply

Quote:
Originally Posted by PT
Посмотреть сообщение
yes

look:

pawn Код:
[16:52:44] [ERROR] "mysql_format" - invalid connection handle (id: 0)
[16:52:44] [ERROR] "mysql_tquery" - invalid connection handle (id: 0)
[16:52:44] [DEBUG] mysql_connect - host: "****", user: "****", database: "****", password: "****", port: 3306, autoreconnect: true, pool_size: 2
[16:52:44] [DEBUG] CMySQLHandle::Create - creating new connection..
[16:52:44] [DEBUG] CMySQLHandle::CMySQLHandle - constructor called
[16:52:44] [DEBUG] CMySQLHandle::Create - connection created (id: 1)
[16:52:44] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[16:52:44] [DEBUG] CMySQLConnection::Connect - connection was successful
[16:52:44] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[16:52:44] [DEBUG] mysql_errno - connection: 1
Are you trying to send a MySQL query before connecting to MySQL?
Reply

Quote:
Originally Posted by iZN
Посмотреть сообщение
Are you trying to send a MySQL query before connecting to MySQL?
I saw the problem, the problem was, i'm using y_hooks, so loading system was been called before the connection.

I solved this using an manual hook before use YSI, to garantee the first call is the mysql connection.

thanks for the help.
Reply

Quote:
Originally Posted by maddinat0r
Посмотреть сообщение
Could you show me your complete mysql_log.txt? (with all logs from the filterscript and gamemode; debug logging ofc)
I'll also send a huge part of the code, so you can see which part of the debug-log can be related to each part of the code.

Filterscript:
pawn Код:
// Include required files
#include <a_samp>
#include <sscanf2>
#include <streamer>
#include <zcmd>
#include <SHA512>
#include <a_mysql>



// ********************************************************************************************************************************************************************************
// Hardcoded settings (you need to edit these here and recompile the filterscript to change them)
// ********************************************************************************************************************************************************************************

// Define your MySQL connection info here
#define mysql_host                      "127.0.0.1"
#define mysql_user                      "PowerPC603"
#define mysql_password                  "pass"
#define mysql_database                  "ppctrucking"
new SQL_db; // Will hold the connectionhandle to the database

// Define tablenames
#define table_playerdata                "playerdata"
#define table_speedcams                 "speedcameras"
#define table_gasstations               "gasstations"
#define table_policestations            "policestations"
#define table_vehicleinfo               "vehicleinfo"

// This callback gets called when the server initializes the filterscript
public OnFilterScriptInit()
{
    // Print some debug-info to the server console
    printf(" ");
    printf("******************************************************************************************");
    printf("PPC Support filterscript initializing...");
    printf(" ");
    // Turn on debug-logging for MySQL (logs everything into "mysql_log.txt" in the server main directory where "samp-server.exe" is located)
    mysql_log(LOG_WARNING | LOG_ERROR | LOG_DEBUG);
    // Connect to the MySQL database and store the connection-handle
    SQL_db = mysql_connect(mysql_host, mysql_user, mysql_database, mysql_password);
    // Check if there were errors after trying to connect
    if (mysql_errno() == 0)
        printf("Support filterscript: Connecting to MySQL was successful, connection-id: %i", SQL_db);
    else // The connection failed, so close the connection and shutdown the server after 5 seconds
    {
        printf("ERROR: Connecting to MySQL failed, shutting down server in 5 seconds...");
        printf(" ");
        printf(" ");
        printf(" ");
        mysql_close(SQL_db);
        SetTimer("StartShutdownServer", 1000, false);

        // Skip the rest of the callback to prevent trying to load data from a non-existing connection
        return 1;
    }

    // Create tables if they don't exist and populate them with default data (this is checked pretty fast when the tables already exist, usually less than a second)
    // This function can take a few seconds when the tables don't exist yet, as they have to be created and some tables will get default data inserted into them
    SQL_Setup_Tables();

    // Load speedcameras, gas-stations, police-stations and vehicle-info from MySQL and print debug info to the server console
    SQL_Data_Load();

    printf("PPC Support filterscript initialized");
    printf("******************************************************************************************");
    printf(" ");
    printf(" ");
    printf(" ");

    return 1;
}

// This timer is used to shutdown the server if connecting to the database failed
forward StartShutdownServer();
public StartShutdownServer()
{
    printf("****************************************");
    printf("****************************************");
    printf(" ");
    printf("ERROR: Support filterscript was unable to connect to MySQL, server is shutting down in a few seconds...");
    printf(" ");
    printf("****************************************");
    printf("****************************************");

    SetTimer("ShutdownServer", 4000, false);

    return 1;
}

// This timer is used to shutdown the server if connecting to the database failed
forward ShutdownServer();
public ShutdownServer()
{
    SendRconCommand("exit");

    return 1;
}



// This callback is called when the filterscript is unloaded
public OnFilterScriptExit()
{
    // Close the connection to the MySQL database
    mysql_close(SQL_db);

    return 1;
}



// This callback gets called when a player connects to the server
public OnPlayerConnect(playerid)
{
    // Setup local variables
    new Msg[128];

    // Get the name of the player and store it in his account
    GetPlayerName(playerid, APlayerData[playerid][PlayerName], 24);

    // Try to get the password from the SQL-table (he might have already registered and needs to login properly by entering the password, or he might be a new player)
    Player_PasswordLoad(playerid);

    // Send a message to all players to let them know somebody else joined the server
    format(Msg, 128, "{0000FF}Player '{FFFF00}%s{0000FF}' (id: {FFFF00}%i{0000FF}) has joined the server", APlayerData[playerid][PlayerName], playerid);
    SendClientMessageToAll(0xFFFFFFFF, Msg);

    return 1;
}



// This function is called when the player logs in (OnPlayerConnect) and sends a query to try to retrieve the password for this player
Player_PasswordLoad(playerid)
{
    // Setup local variables
    new Query[128];

    // Try to get the password from the SQL-table
    mysql_format(SQL_db, Query, sizeof(Query), "SELECT Password FROM %s WHERE PlayerName = '%e' LIMIT 1", table_playerdata, APlayerData[playerid][PlayerName]);
    mysql_tquery(SQL_db, Query, "Player_OnPasswordLoad", "i", playerid);
}

// This custom callback is called when a player connects to the server (MySQL received a query to get his password using the function "Player_PasswordLoad")
forward Player_OnPasswordLoad(playerid);
public Player_OnPasswordLoad(playerid)
{
    // Check if this player's account exists (number of rows should be 1)
    if (cache_get_row_count(SQL_db) == 1)
    {
        // Store the password from the query-result
        cache_get_row(0, 0, APlayerData[playerid][PlayerPassword], SQL_db, 130);
        // Ask the player to enter his password to login
        ShowPlayerDialog(playerid, DialogLogin, DIALOG_STYLE_PASSWORD, "Welcome", "Please login by entering your password:", "Login", "Cancel");
    }
    else // The player isn't registered yet (he has no account), so let him enter a password to register his account
        ShowPlayerDialog(playerid, DialogRegister, DIALOG_STYLE_PASSWORD, "Welcome", "Please register by entering your password:", "Register", "Cancel");

    return 1;
}

// This function is used after logging in properly by entering the correct password to load the rest of the data
Player_AccountLoad(playerid)
{
    // Setup local variables
    new Query[128];

    // Construct the query to get all data from this player from MySQL
    mysql_format(SQL_db, Query, sizeof(Query), "SELECT * FROM %s WHERE PlayerName = '%e' LIMIT 1", table_playerdata, APlayerData[playerid][PlayerName]);
    // Execute the query and load all data using the custom callback "OnAccountLoad", also inform the player he logged in properly
    mysql_tquery(SQL_db, Query, "Player_OnAccountLoad", "i", playerid);
}

// This custom callback is used after logging in to load the rest of the playerdata (only the password was loaded before during OnPlayerConnect callback)
forward Player_OnAccountLoad(playerid);
public Player_OnAccountLoad(playerid)
{
    // Get all data from the query and store it in the APlayerData array
    if (cache_get_field_content_int(0, "SpeedInMph", SQL_db) == 1)
        APlayerData[playerid][SpeedInMph] = true; // Set the SpeedInMph as mph
    else
        APlayerData[playerid][SpeedInMph] = false; // Set the SpeedInMph as kph

    APlayerData[playerid][SQLID] = cache_get_field_content_int(0, "ID", SQL_db);
    APlayerData[playerid][PlayerFine] = cache_get_field_content_int(0, "Fines", SQL_db);
    APlayerData[playerid][PlayerTickets] = cache_get_field_content_int(0, "Tickets", SQL_db);
    APlayerData[playerid][PlayerTicketPrice] = cache_get_field_content_int(0, "TicketCost", SQL_db);
    APlayerData[playerid][PlayerMoney] = cache_get_field_content_int(0, "Money", SQL_db);
    APlayerData[playerid][PlayerScore] = cache_get_field_content_int(0, "Score", SQL_db);
    APlayerData[playerid][AdminLevel] = cache_get_field_content_int(0, "AdminLevel", SQL_db);
    APlayerData[playerid][JailTime] = cache_get_field_content_int(0, "JailTime", SQL_db);

    // The player has logged in properly
    APlayerData[playerid][LoggedIn] = true;
    // Send a message to the client to inform him that he logged in properly
    SendClientMessage(playerid, 0xFFFFFFFF, "{00FF00}You logged in, welcome back");

    return 1;
}



// This function creates a new account for the given player
Player_AccountCreate(playerid)
{
    // Setup local variables
    new Query[256];

    // Add the player's account to the MySQL database (escape the name only, as there is no need to escape a hashed password)
    mysql_format(SQL_db, Query, sizeof(Query), "INSERT INTO %s (PlayerName, Password) VALUES ('%e', '%s')", table_playerdata, APlayerData[playerid][PlayerName], APlayerData[playerid][PlayerPassword]);
    mysql_tquery(SQL_db, Query, "Player_OnAccountCreate", "i", playerid);
}

// This custom callback is used after creating a new account (playername and password are inserted, but the ID must be loaded now to reference the player later on using this ID)
forward Player_OnAccountCreate(playerid);
public Player_OnAccountCreate(playerid)
{
    // Get the ID from the auto-incremented table ("ID") and store it
    APlayerData[playerid][SQLID] = cache_insert_id();

    return 1;
}



// ********************************************************************************************************************************************************************************
// MySQL functions (creating tables which don't exist + insert default data, and loading functions)
// ********************************************************************************************************************************************************************************

// This function is called to check if all tables exist, and creates them in case they don't exist
// Also default data is inserted into those tables
SQL_Setup_Tables()
{
    // Setup local variables
    new Query[1024], Cache:result;

    printf(" ");
    printf("--------------------------------------------------------------------------------");

    // Check if the playerdata table exists, and created it if it doesn't exist
    format(Query, sizeof(Query), "SHOW TABLES LIKE '%s'", table_playerdata);
    result = mysql_query(SQL_db, Query, true);
    if (cache_get_row_count(SQL_db) == 0)
    {
        printf("MySQL: >> Creating table %s...", table_playerdata);
        format(Query, sizeof(Query), "CREATE TABLE `%s` (", table_playerdata);
        format(Query, sizeof(Query), "%s`ID` int(11) NOT NULL AUTO_INCREMENT, ", Query);
        format(Query, sizeof(Query), "%s`PlayerName` varchar(25) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`Password` varchar(130) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`AdminLevel` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Money` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Score` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Fines` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Tickets` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`TicketCost` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`SpeedInMph` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`JailTime` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%sPRIMARY KEY (`ID`)) ", Query);
        format(Query, sizeof(Query), "%sENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8", Query);
        mysql_query(SQL_db, Query, false);

        // Set "TableCreated_PlayerData" to "true" to indicate this session has created the table "playerdata", so the gamemode can detect it and extend the table with it's own required columns
        TableCreated_PlayerData = true;

        printf("MySQL: >> Table '%s' created", table_playerdata);
    }
    else
        printf("MySQL: Table '%s' exists, skipping table creation and data insertion", table_playerdata);
    // Free the result after executing "SHOW TABLES LIKE ..." to prevent memory leaks
    cache_delete(result, SQL_db);

    // Check if the gasstations table exists, and created it if it doesn't exist, also insert default gas-stations
    format(Query, sizeof(Query), "SHOW TABLES LIKE '%s'", table_gasstations);
    result = mysql_query(SQL_db, Query, true);
    if (cache_get_row_count(SQL_db) == 0)
    {
        printf("MySQL: >> Creating table %s...", table_gasstations);
        format(Query, sizeof(Query), "CREATE TABLE `%s` (", table_gasstations);
        format(Query, sizeof(Query), "%s`ID` int(11) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`Name` varchar(50) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`X` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Y` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Z` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%sPRIMARY KEY (`ID`)) ", Query);
        format(Query, sizeof(Query), "%sENGINE=InnoDB DEFAULT CHARSET=utf8", Query);
        mysql_query(SQL_db, Query, false);

        printf("MySQL: >> Inserting default data into table %s...", table_gasstations);
        mysql_query(SQL_db, "START TRANSACTION", false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('0', 'LV - Tierra Robada', '-1471.50', '1863.75', '32.70')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('1', 'LV - El Quebrados', '-1326.50', '2677.50', '50.10')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('2', 'LV - Bone County', '611.50', '1694.50', '7.00')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('3', 'SF - Angel Pine', '-2249.25', '-2559.00', '32.00')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('4', 'SF - Whetstone', '-1606.50', '-2714.00', '48.60')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('5', 'SF - Flint County', '-93.50', '-1175.00', '2.30')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('6', 'LS - Montgomery', '1377.50', '457.00', '19.90')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('7', 'LS - Dillimore', '651.50', '-565.50', '16.40')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('8', 'SF - Easter Basin', '-1675.75', '412.75', '7.20')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('9', 'SF - Juniper Hollow', '-2405.50', '976.25', '45.30')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('10', 'SF - Doherty', '-2023.25', '156.75', '28.90')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('11', 'SF - Easter Bay Airport', '-1131.75', '-204.25', '14.20')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('12', 'LV - Fort Carson', '77.75', '1216.00', '18.83')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('13', 'Verdant Meadows', '350.50', '2537.50', '16.80')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('14', 'LV - Spinybed', '2147.00', '2747.75', '10.90')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('15', 'LV - Come-A-Lot', '2639.75', '1106.00', '10.90')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('16', 'LV - The Strip', '2115.00', '920.00', '10.90')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('17', 'LV - The Emerald Isle', '2202.00', '2475.00', '10.90')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('18', 'LV - Redsands West', '1596.50', '2199.75', '10.90')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('19', 'LV - Las Venturas Airport', '1584.25', '1448.25', '10.90')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('20', 'LS - Temple', '1004.25', '-940.50', '42.20')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('21', 'LS - Idlewood', '1935.00', '-1772.75', '13.40')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('22', 'LS - Los Santos International Airport', '1855.00', '-2394.25', '13.55')", table_gasstations);
        mysql_query(SQL_db, Query, false);
        mysql_query(SQL_db, "COMMIT", false);

        printf("MySQL: >> Table '%s' created and default data inserted (23 gas-stations)", table_gasstations);
    }
    else
        printf("MySQL: Table '%s' exists, skipping table creation and data insertion", table_gasstations);
    // Free the result after executing "SHOW TABLES LIKE ..." to prevent memory leaks
    cache_delete(result, SQL_db);

    // Check if the policestations table exists, and created it if it doesn't exist, also insert default police-stations
    format(Query, sizeof(Query), "SHOW TABLES LIKE '%s'", table_policestations);
    result = mysql_query(SQL_db, Query, true);
    if (cache_get_row_count(SQL_db) == 0)
    {
        printf("MySQL: >> Creating table %s...", table_policestations);
        format(Query, sizeof(Query), "CREATE TABLE `%s` (", table_policestations);
        format(Query, sizeof(Query), "%s`ID` int(11) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`Name` varchar(50) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`X` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Y` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Z` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%sPRIMARY KEY (`ID`)) ", Query);
        format(Query, sizeof(Query), "%sENGINE=InnoDB DEFAULT CHARSET=utf8", Query);
        mysql_query(SQL_db, Query, false);

        printf("MySQL: >> Inserting default data into table %s...", table_policestations);
        mysql_query(SQL_db, "START TRANSACTION", false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('0', 'SF - Downtown', '-1605.50', '711.50', '13.86')", table_policestations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('1', 'SF - Angel Pine', '-2161.00', '-2385.75', '30.62')", table_policestations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('2', 'LV - El Quebrados', '-1390.00', '2637.75', '56.00')", table_policestations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('3', 'LV - Fort Carson', '-217.25', '979.25', '19.50')", table_policestations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('4', 'LV - Roca Escalante', '2290.25', '2430.50', '10.82')", table_policestations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('5', 'LS - Dillimore', '627.75', '-571.75', '17.57')", table_policestations);
        mysql_query(SQL_db, Query, false);
        format(Query, sizeof(Query), "INSERT INTO `%s` VALUES ('6', 'LS - Pershing Square', '1554.75', '-1675.75', '16.19')", table_policestations);
        mysql_query(SQL_db, Query, false);
        mysql_query(SQL_db, "COMMIT", false);

        printf("MySQL: >> Table '%s' created and default data inserted (7 police-stations)", table_policestations);
    }
    else
        printf("MySQL: Table '%s' exists, skipping table creation and data insertion", table_policestations);
    // Free the result after executing "SHOW TABLES LIKE ..." to prevent memory leaks
    cache_delete(result, SQL_db);

    // Check if the speedcameras table exists, and created it if it doesn't exist
    format(Query, sizeof(Query), "SHOW TABLES LIKE '%s'", table_speedcams);
    result = mysql_query(SQL_db, Query, true);
    if (cache_get_row_count(SQL_db) == 0)
    {
        printf("MySQL: >> Creating table %s...", table_speedcams);
        format(Query, sizeof(Query), "CREATE TABLE `%s` (", table_speedcams);
        format(Query, sizeof(Query), "%s`ID` int(11) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`Name` varchar(50) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`CamSpeed` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`X` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Y` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Z` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Angle` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%sPRIMARY KEY (`ID`)) ", Query);
        format(Query, sizeof(Query), "%sENGINE=InnoDB DEFAULT CHARSET=utf8", Query);
        mysql_query(SQL_db, Query, false);

        printf("MySQL: >> Table '%s' created", table_speedcams);
    }
    else
        printf("MySQL: Table '%s' exists, skipping table creation and data insertion", table_speedcams);
    // Free the result after executing "SHOW TABLES LIKE ..." to prevent memory leaks
    cache_delete(result, SQL_db);

    // Check if the vehicleinfo table exists, and created it if it doesn't exist
    format(Query, sizeof(Query), "SHOW TABLES LIKE '%s'", table_vehicleinfo);
    result = mysql_query(SQL_db, Query, true);
    if (cache_get_row_count(SQL_db) == 0)
    {
        printf("MySQL: >> Creating table %s...", table_vehicleinfo);
        format(Query, sizeof(Query), "CREATE TABLE `%s` (", table_vehicleinfo);
        format(Query, sizeof(Query), "%s`ID` int(11) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`Name` varchar(50) NOT NULL, ", Query);
        format(Query, sizeof(Query), "%s`Class` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Model` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Price` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`MaxFuel` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Consumption` float NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`RefuelTime` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%s`Disabled` int(11) NOT NULL DEFAULT '0', ", Query);
        format(Query, sizeof(Query), "%sPRIMARY KEY (`ID`)) ", Query);
        format(Query, sizeof(Query), "%sENGINE=InnoDB DEFAULT CHARSET=utf8", Query);
        mysql_query(SQL_db, Query, false);

        printf("MySQL: >> Inserting default data into table %s...", table_vehicleinfo);
        new ID, Name[50], Class, Model, Price, Float:MaxFuel, Float:Consump, RefuelT, Disabled;
        mysql_query(SQL_db, "START TRANSACTION", false);
        for (ID = 0; ID < sizeof(AVehicleInfo); ID++)
        {
            format(Name, sizeof(Name), AVehicleInfo[ID][VehicleName]);
            Class = AVehicleInfo[ID][VehicleClass];
            Model = AVehicleInfo[ID][VehicleModel];
            Price = AVehicleInfo[ID][VehiclePrice];
            MaxFuel = AVehicleInfo[ID][VehicleMaxFuel];
            Consump = AVehicleInfo[ID][FuelConsumption];
            RefuelT = AVehicleInfo[ID][RefuelTime];
            if (AVehicleInfo[ID][VehicleDisabled] == true)
                Disabled = 1;
            else
                Disabled = 0;
            mysql_format(SQL_db, Query, sizeof(Query), "INSERT INTO `%s` VALUES ('%i', '%e', '%i', '%i', '%i', '%f', '%f', '%i', '%i')", table_vehicleinfo, ID, Name, Class, Model, Price, MaxFuel, Consump, RefuelT, Disabled);
            mysql_query(SQL_db, Query, false);
        }
        mysql_query(SQL_db, "COMMIT", false);

        printf("MySQL: >> Table '%s' created and default data inserted (212 vehicles)", table_vehicleinfo);
    }
    else
        printf("MySQL: Table '%s' exists, skipping table creation and data insertion", table_vehicleinfo);
    // Free the result after executing "SHOW TABLES LIKE ..." to prevent memory leaks
    cache_delete(result, SQL_db);

    printf("--------------------------------------------------------------------------------");
    printf(" ");

    return 1;
}

// This function is used to load all speedcameras, gas-stations from MySQL when starting the server (called only during OnFilterscriptInit)
SQL_Data_Load()
{
    // Setup local variables
    new Query[128], Cache:result;

    printf("--------------------------------------------------------------------------------");

    // Send a query to load all speedcameras from MySQL
    format(Query, sizeof(Query), "SELECT * FROM %s", table_speedcams);
    result = mysql_query(SQL_db, Query, true);
    // Print some debug info to the server console
    printf("*** Loading speed-cameras from MySQL using \"%s\"", Query);
    CamerasLoad();
    cache_delete(result, SQL_db);

    printf(" ");

    // Send a query to load all gas-stations from MySQL
    format(Query, sizeof(Query), "SELECT * FROM %s", table_gasstations);
    result = mysql_query(SQL_db, Query, true);
    // Print some debug info to the server console
    printf("*** Loading gas-stations from MySQL using \"%s\"", Query);
    GasStationsLoad();
    cache_delete(result, SQL_db);

    printf(" ");

    // Send a query to load all police-stations from MySQL
    format(Query, sizeof(Query), "SELECT * FROM %s", table_policestations);
    result = mysql_query(SQL_db, Query, true);
    // Print some debug info to the server console
    printf("*** Loading police-stations from MySQL using \"%s\"", Query);
    PoliceStationsLoad();
    cache_delete(result, SQL_db);

    printf(" ");

    // Send a query to load all vehicle-info from MySQL
    format(Query, sizeof(Query), "SELECT * FROM %s", table_vehicleinfo);
    result = mysql_query(SQL_db, Query, true);
    // Print some debug info to the server console
    printf("*** Loading vehicle-info from MySQL using \"%s\"", Query);
    VehicleInfoLoad();
    cache_delete(result, SQL_db);

    printf("--------------------------------------------------------------------------------");

    return 1;
}

// This function is called to load the speedcameras
CamerasLoad()
{
    // Setup local variables
    new Rows, CamID, CameraName[50], MaxSpeed, Float:x, Float:y, Float:z, Float:rot, CountSuccess, CountFailed, Query[128];

    // Get the amount of rows (cameras)
    Rows = cache_get_row_count(SQL_db);

    // If there are any rows (cameras) loaded, load data and create them
    if (Rows >= 1)
    {
        // Loop through all rows
        for (new Row; Row < Rows; Row++)
        {
            // Load the data
            CamID = cache_get_field_content_int(Row, "ID", SQL_db);
            cache_get_field_content(Row, "Name", CameraName, SQL_db, sizeof(CameraName));
            MaxSpeed = cache_get_field_content_int(Row, "CamSpeed", SQL_db);
            x = cache_get_field_content_float(Row, "X", SQL_db);
            y = cache_get_field_content_float(Row, "Y", SQL_db);
            z = cache_get_field_content_float(Row, "Z", SQL_db);
            rot = cache_get_field_content_float(Row, "Angle", SQL_db);

            // Check if the CamID is invalid (out of range)
            if ((CamID < 0) || (CamID >= MAX_CAMERAS))
            {
                // Count the amount of failed cameras (invalid CamID's)
                CountFailed++;
                printf("*** ERROR: Invalid CamID found in table %s: %i (entry deleted)", table_speedcams, CamID);
                mysql_format(SQL_db, Query, sizeof(Query), "DELETE FROM %s WHERE ID = '%i'", table_speedcams, CamID);
                mysql_tquery(SQL_db, Query, "", "");
                // Continue with the next speedcamera from the MySQL query
                continue;
            }

            // Check if the CamSpeed is invalid (0 or lower)
            if (MaxSpeed <= 0)
            {
                // Count the amount of failed cameras (invalid MaxSpeed)
                CountFailed++;
                printf("*** ERROR: Invalid CamSpeed found in table %s: CamID %i, MaxSpeed %i (entry deleted)", table_speedcams, CamID, MaxSpeed);
                mysql_format(SQL_db, Query, sizeof(Query), "DELETE FROM %s WHERE ID = '%i'", table_speedcams, CamID);
                mysql_tquery(SQL_db, Query, "", "");
                // Continue with the next speedcamera from the MySQL query
                continue;
            }

            // Create the camera at the given CamID (there should be no duplicate cameras with the same ID as the table-structure doesn't allow it, ID = primary key)
            SetupSpeedCamera(x, y, z, rot, MaxSpeed, CameraName, CamID);
            // Count the succesfully created cameras
            CountSuccess++;
        }
    }

    // Print the amount of speedcams loaded for debugging
    printf("*** Speed-cameras loaded: %i (successful: %i, failed: %i)", Rows, CountSuccess, CountFailed);

    return 1;
}

// This function is called to load the gas-stations
GasStationsLoad()
{
    // Setup local variables
    new Rows, GasID, Name[50], Float:x, Float:y, Float:z, CountSuccess, CountFailed, Query[128];

    // Get the amount of rows (gas-stations)
    Rows = cache_get_row_count(SQL_db);

    // If there are any rows (gas-stations) loaded, load data and create them
    if (Rows >= 1)
    {
        // Loop through all rows
        for (new Row; Row < Rows; Row++)
        {
            // Load the data
            GasID = cache_get_field_content_int(Row, "ID", SQL_db);
            cache_get_field_content(Row, "Name", Name, SQL_db, sizeof(Name));
            x = cache_get_field_content_float(Row, "X", SQL_db);
            y = cache_get_field_content_float(Row, "Y", SQL_db);
            z = cache_get_field_content_float(Row, "Z", SQL_db);

            // Check if the GasID is invalid (out of range)
            if ((GasID < 0) || (GasID >= MAX_GASSTATIONS))
            {
                // Count the amount of failed gas-stations (invalid GasID's)
                CountFailed++;
                printf("*** ERROR: Invalid GasID found in table %s: %i (entry deleted)", table_gasstations, GasID);
                mysql_format(SQL_db, Query, sizeof(Query), "DELETE FROM %s WHERE ID = '%i'", table_gasstations, GasID);
                mysql_tquery(SQL_db, Query, "", "");
                // Continue with the next gas-station from the MySQL query
                continue;
            }

            // Create the gas-station at the given GasID (there should be no duplicate gas-stations with the same ID as the table-structure doesn't allow it, ID = primary key)
            SetupGasStation(x, y, z, Name, GasID);
            // Count the succesfully created gas-stations
            CountSuccess++;
        }
    }

    // Print the amount of gas-stations loaded for debugging
    printf("*** Gas-stations loaded: %i (successful: %i, failed: %i)", Rows, CountSuccess, CountFailed);

    return 1;
}

// This function is called to load the police-stations
PoliceStationsLoad()
{
    // Setup local variables
    new Rows, PoliceID, Name[50], Float:x, Float:y, Float:z, CountSuccess, CountFailed, Query[128];

    // Get the amount of rows (police-stations)
    Rows = cache_get_row_count(SQL_db);

    // If there are any rows (police-stations) loaded, load data and create them
    if (Rows >= 1)
    {
        // Loop through all rows
        for (new Row; Row < Rows; Row++)
        {
            // Load the data
            PoliceID = cache_get_field_content_int(Row, "ID", SQL_db);
            cache_get_field_content(Row, "Name", Name, SQL_db, sizeof(Name));
            x = cache_get_field_content_float(Row, "X", SQL_db);
            y = cache_get_field_content_float(Row, "Y", SQL_db);
            z = cache_get_field_content_float(Row, "Z", SQL_db);

            // Check if the PoliceID is invalid (out of range)
            if ((PoliceID < 0) || (PoliceID >= MAX_POLICESTATIONS))
            {
                // Count the amount of failed police-stations (invalid PoliceID's)
                CountFailed++;
                printf("*** ERROR: Invalid PoliceID found in table %s: %i (entry deleted)", table_policestations, PoliceID);
                mysql_format(SQL_db, Query, sizeof(Query), "DELETE FROM %s WHERE ID = '%i'", table_policestations, PoliceID);
                mysql_tquery(SQL_db, Query, "", "");
                // Continue with the next police-station from the MySQL query
                continue;
            }

            // Create the police-station at the given PoliceID (there should be no duplicate police-stations with the same ID as the table-structure doesn't allow it, ID = primary key)
            SetupPoliceStation(x, y, z, Name, PoliceID);
            // Count the succesfully created police-stations
            CountSuccess++;
        }
    }

    // Print the amount of police-stations loaded for debugging
    printf("*** Police-stations loaded: %i (successful: %i, failed: %i)", Rows, CountSuccess, CountFailed);

    return 1;
}

// This function is called to load the vehicle-info
VehicleInfoLoad()
{
    // Setup local variables
    new Rows, ID, Price, Float:MaxFuel, Float:Consump, RefuelT, Disabled, CountSuccess, CountFailed, Query[128];

    // Get the amount of rows (vehicle-info)
    Rows = cache_get_row_count(SQL_db);

    // If there are any rows (vehicle-info) loaded, load data and overwrite default script-values
    if (Rows >= 1)
    {
        // Loop through all rows
        for (new Row; Row < Rows; Row++)
        {
            // Load the data
            ID = cache_get_field_content_int(Row, "ID", SQL_db);
            Price = cache_get_field_content_int(Row, "Price", SQL_db);
            MaxFuel = cache_get_field_content_float(Row, "MaxFuel", SQL_db);
            Consump = cache_get_field_content_float(Row, "Consumption", SQL_db);
            RefuelT = cache_get_field_content_int(Row, "RefuelTime", SQL_db);
            Disabled = cache_get_field_content_int(Row, "Disabled", SQL_db);

            // Check if the ID is invalid (out of range)
            if ((ID < 0) || (ID >= sizeof(AVehicleInfo)))
            {
                // Count the amount of failed vehicle-info entries (invalid ID's)
                CountFailed++;
                printf("*** ERROR: Invalid ID found in table %s: %i (entry deleted)", table_vehicleinfo, ID);
                mysql_format(SQL_db, Query, sizeof(Query), "DELETE FROM %s WHERE ID = '%i'", table_vehicleinfo, ID);
                mysql_tquery(SQL_db, Query, "", "");
                // Continue with the next vehicle-info entry from the MySQL query
                continue;
            }

            // Store all the data
            AVehicleInfo[ID][VehiclePrice] = Price;
            AVehicleInfo[ID][VehicleMaxFuel] = MaxFuel;
            AVehicleInfo[ID][FuelConsumption] = Consump;
            AVehicleInfo[ID][RefuelTime] = RefuelT;
            if (Disabled == 1)
                AVehicleInfo[ID][VehicleDisabled] = true;
            else
                AVehicleInfo[ID][VehicleDisabled] = false;
            // Count the succesfully loaded vehicle-info entries
            CountSuccess++;
        }
    }

    // Print the amount of vehicle-info entries loaded for debugging
    printf("*** Vehicle-info loaded: %i (successful: %i, failed: %i)", Rows, CountSuccess, CountFailed);

    return 1;
}
Gamemode (this is the only mysql-code currently used by the gamemode):
pawn Код:
// This callback gets called when the server initializes the gamemode
public OnGameModeInit()
{
    // Setup local variables
    new HostCommand[128];

    // Turn on debug-logging for MySQL (logs everything into "mysql_log.txt" in the server main directory where "samp-server.exe" is located)
    mysql_log(LOG_WARNING | LOG_ERROR | LOG_DEBUG);
    // Connect to the MySQL database and store the connection-handle
    SQL_db = mysql_connect(mysql_host, mysql_user, mysql_database, mysql_password);
    // Check if there were errors after trying to connect
    if (mysql_errno() == 0)
        printf("Gamemode: Connecting to MySQL was successful, connection-id: %i", SQL_db);
    else // The connection failed, so close the connection and shutdown the server after 5 seconds
    {
        printf("ERROR: Connecting to MySQL failed, shutting down server in 5 seconds...");
        printf(" ");
        printf(" ");
        printf(" ");
        mysql_close(SQL_db);
        SetTimer("StartShutdownServer", 1000, false);

        // Skip the rest of the callback to prevent trying to load data from a non-existing connection
        return 1;
    }
    return 1;
}
As for the logs, they're a little big (about 280KB) so here's the link to them:
Log R34
Log R39-2

Server-log:
Server log
Reply

So why does https://github.com/pBlueG/SA-MP-MySQ...system-orm.pwn not save the money ?
Reply

Hello!

When I load my houses, values ​​start well in the variables.

But when I save, it resets the values ​​of the variables to 0 ...

And that ALL the variables.

Here is my code, it may be a problem ...

Thx

pawn Код:
forward SaveSQLHouse(idhouse);
public SaveSQLHouse(idhouse)
{
    new query[256];
   
    mysql_format(MySQLConnect, query, 256, "UPDATE houses SET EntreeX = '%f', EntreeY = '%f', EntreeZ = '%f', SortieX = '%f', SortieY = '%f', SortieZ = '%f' WHERE id = %d",
    HouseInfo[idhouse][EntreeX],
    HouseInfo[idhouse][EntreeY],
    HouseInfo[idhouse][EntreeZ],
    HouseInfo[idhouse][SortieX],
    HouseInfo[idhouse][SortieY],
    HouseInfo[idhouse][SortieZ],
    idhouse);
   
    mysql_tquery(MySQLConnect, query);
   
    mysql_format(MySQLConnect, query, 256, "UPDATE houses SET LocationActive = %d, Proprio = '%s', Prix = %d, MapIcone = %d, Inte = %d, Locked = %d, Achete = %d, IntX = %d, VW = %d WHERE id = %d",
    HouseInfo[idhouse][LocationActive],
    HouseInfo[idhouse][Proprio],
    HouseInfo[idhouse][Prix],
    HouseInfo[idhouse][MapIcone],
    HouseInfo[idhouse][Inte],
    HouseInfo[idhouse][Locked],
    HouseInfo[idhouse][Achete],
    HouseInfo[idhouse][IntX],
    HouseInfo[idhouse][VW],
    idhouse);
   
    mysql_tquery(MySQLConnect, query);
   
    mysql_format(MySQLConnect, query, 256, "UPDATE houses SET LocationPrix = %d, Description = '%s' WHERE id = %d",
    HouseInfo[idhouse][LocationPrix],
    HouseInfo[idhouse][Description],
    idhouse);
   
    mysql_tquery(MySQLConnect, query);
    return 1;
}
Reply

Quote:
Originally Posted by Wizzy951
Посмотреть сообщение
Check the MySQL html log. Are there any errors/warnings?
Quote:
Originally Posted by Baltimore
Посмотреть сообщение
Hello!

When I load my houses, values ​​start well in the variables.

But when I save, it resets the values ​​of the variables to 0 ...

And that ALL the variables.

Here is my code, it may be a problem ...

Thx
[...]
Try increasing your 'query' string variable.

@PowerPPC
Your call to 'mysql_error()' in the gamemode is using the wrong connection handle. Apart from that I can't find any mistakes. I'll try to reproduce it on my PC asap.
Reply

Quote:
Originally Posted by maddinat0r
Посмотреть сообщение
Check the MySQL html log. Are there any errors/warnings?

Try increasing your 'query' string variable.

@PowerPPC
Your call to 'mysql_error()' in the gamemode is using the wrong connection handle. Apart from that I can't find any mistakes. I'll try to reproduce it on my PC asap.
I'm not using mysql_error() anywhere.
Or did you mean mysql_errno()?

In that case, I've changed it to "mysql_errno(SQL_db)" instead of "mysql_errno()" in both scripts.
Reply

Quote:
Originally Posted by maddinat0r
Посмотреть сообщение
Check the MySQL html log. Are there any errors/warnings?
It was a week ago when I tested it and here is the html log:
Код:
Logging started at 01:47, 18.10.2014
Reply

When we can wait for faster version?
Reply

Quote:
Originally Posted by Banditukas
Посмотреть сообщение
When we can wait for faster version?
It's already fast, what more you are expecting? Unless you're using non-threaded queries.
Reply

I cant access the links, 403 forbidden... Alternatives?
Reply

Add the exception to your firewall/anti-virusscanner software, it should work (it worked for me).
Reply

uhhmmmm... can i have an older version R37?
Reply

Quote:
Originally Posted by [black]jack
Посмотреть сообщение
uhhmmmm... can i have an older version R37?
Older versions are still over on ****** Code. https://code.******.com/p/sa-mp-mysq.../list?can=1&q=
Reply

Versions below R34 are still on the old ****** Code project page. R34+ can be found on the Github releases page. Some versions don't have download links because they are too unstable or buggy (like R37). Using R38 instead should work too without much hassle.
Reply

Quote:
Originally Posted by maddinat0r
Посмотреть сообщение
Versions below R34 are still on the old ****** Code project page. R34+ can be found on the Github releases page. Some versions don't have download links because they are too unstable or buggy (like R37). Using R38 instead should work too without much hassle.
Hey maddinat0r. Can you tell me how can I download libmysqlclient_r.so.16? Because I get the next error:
Failed (libmysqlclient_r.so.16: cannot open shared object file: No such file or directory)


I'm using Ubuntu 14.04.1 LTS.

Thank you!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)