Нужна помощь с базой данных

dvernoff

Добрая душа
Сообщения
638
Реакции
591
✋, столкнулся с проблемой при написании плагина который работает с базами,
вообще не понимаю в чём может быть проблема, вроде запрос сформировал правильно.

C-подобный:
Database     g_DataBaseWR;
char         sCurrentMap[256];

public void OnPluginStart()
{
    Database.Connect(ConnectCallBack, "smartwr");
}

public void ConnectCallBack(Database hDatabase, const char[] sError, any data)
{
    if (hDatabase == null)
    {
        SetFailState("Database failure: %s", sError);
        return;
    }

    g_DataBaseWR = hDatabase;
    SQL_LockDatabase(g_DataBaseWR);

    g_DataBaseWR.Query(SQL_Callback_CheckError,              "CREATE TABLE IF NOT EXISTS `wr_maps_id` (                \
                                                            `id`         INT(11) NOT NULL AUTO_INCREMENT,            \
                                                            `map`         VARCHAR(64) NOT NULL,                        \        
                                                                        PRIMARY KEY (`id`),                             \
                                                                        UNIQUE KEY `map` (`map`)                     \
                                                            )             AUTO_INCREMENT=1;"                            );

    SQL_UnlockDatabase(g_DataBaseWR);
    g_DataBaseWR.SetCharset("utf8mb4");
}

public void SQL_Callback_CheckError(Database hDatabase, DBResultSet results, const char[] szError, any data)
{
    if(szError[0])
    {
        LogError("SQL_Callback_CheckError: %s", szError);
    }
}

проверяю есть ли карта в базе
C-подобный:
public void OnMapStart()
{
    GetCurrentMap(sCurrentMap, sizeof(sCurrentMap));

    char szQuery[256];

    FormatEx(szQuery, sizeof(szQuery), "SELECT `map` FROM `wr_maps_id` WHERE `map` = '%s' LIMIT 1;", sCurrentMap);
    g_DataBaseWR.Query(SQL_MapAdded, szQuery);
}
если нет то создаю
C-подобный:
public void SQL_MapAdded(Database hDatabase, DBResultSet results, const char[] sError, any UserID)
{
    if(sError[0])
    {
        LogError("SQL_MapAdded: %s", sError);
        return;
    }

    if(!(results.FetchRow( )))
    {
        char szQuery[256];

        FormatEx(szQuery, sizeof(szQuery), "INSERT INTO `wr_maps_id` (`map`) VALUES ('%s');", sCurrentMap);
        g_DataBaseWR.Query(SQL_Callback_CheckError, szQuery);
    }
}

Но получаю ошибку в консоли:


C-подобный:
L 05/03/2021 - 21:20:41: [SM] Exception reported: Invalid database Handle 0 (error: 4)
L 05/03/2021 - 21:20:41: [SM] Blaming: SmartWR.smx
L 05/03/2021 - 21:20:41: [SM] Call stack trace:
L 05/03/2021 - 21:20:41: [SM]   [0] Database.Query
L 05/03/2021 - 21:20:41: [SM]   [1] Line 71, SmartWR/events.sp::OnMapStart
 
Последнее редактирование:
Решение
Вы асинхронно подключаетесь к базе. Нет никаких гарантий, что к моменту начала карты, SM завершит подключение к ней.
Или переделайте подключение на синглтред (SQL_Connect()), или просто в OnMapStart() проверяйте наличие хендла, и, если его нет - ничего не делайте, а в каллбеке коннекта - вызывайте OnMapStart() для обработки возможно пропущенного старта карты.

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #2
Гадать по отрывкам будем? Где сам процесс подключения к базе?
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #5
Вы асинхронно подключаетесь к базе. Нет никаких гарантий, что к моменту начала карты, SM завершит подключение к ней.
Или переделайте подключение на синглтред (SQL_Connect()), или просто в OnMapStart() проверяйте наличие хендла, и, если его нет - ничего не делайте, а в каллбеке коннекта - вызывайте OnMapStart() для обработки возможно пропущенного старта карты.
 
Решение

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
Так может OnMapStart вызывается раньше, чем подключение к БД происходит?
 

dvernoff

Добрая душа
Сообщения
638
Реакции
591
Да, реально, спасибо.
Отсрочил чуть проверку мапы и всё стало нормально. Даже не подумал об этом... Пол дня голову ломал.
 
Сверху Снизу