
Kruzya
27.02.2016
12:44:31
Вообщем, такая трабла. Некий скрипт составляет запрос и отправляет в БД
А Мускл отвергает
INSERT INTO sb_comms (authid, name, created, ends, length, reason, aid, adminIp, sid, type) VALUES ('STEAM_0:1:29959866', 'test user', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() + -60, -60, 'Неадекватное поведение', IFNULL((SELECT aid FROM sb_admins WHERE authid = 'STEAM_0:1:29959866' OR authid REGEXP '^STEAM_[0-9]:1:29959866$'), 0), '85.140.2.10', 3, 1)
Из логов:
L 02/27/2016 - 13:34:54: [sourcecomms.smx] Query_AddBlockInsert failed: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '???\?Kxzz~HK?:`x\\?[^HC ??[?S' at line 1
Уже шесть часов копаю исходник.
Пытаюсь пофиксить
Но нихера
>......<
if (SBEngine.IsMySQLConnected)
{
// Accepts length in minutes, writes to db in seconds! In all over places in plugin - length is in minutes.
decl String:banName[MAX_NAME_LENGTH * 2 + 1];
new String:banReason[256 * 2 + 1];
decl String:sAuthidEscaped[64 * 2 + 1];
decl String:sAdminAuthIdEscaped[64 * 2 + 1];
decl String:sAdminAuthIdYZEscaped[64 * 2 + 1];
decl String:sQuery[4096], String:sQueryAdm[512], String:sQueryVal[1024];
decl String:sQueryMute[1024], String:sQueryGag[1024];
// escaping everything
SQL_EscapeString(g_hDatabase, sName, banName, sizeof(banName));
SQL_EscapeString(g_hDatabase, reason, banReason, sizeof(banReason));
SQL_EscapeString(g_hDatabase, targetAuth, sAuthidEscaped, sizeof(sAuthidEscaped));
SQL_EscapeString(g_hDatabase, adminAuth, sAdminAuthIdEscaped, sizeof(sAdminAuthIdEscaped));
SQL_EscapeString(g_hDatabase, adminAuth[8], sAdminAuthIdYZEscaped, sizeof(sAdminAuthIdYZEscaped));
// bid authid name created ends lenght reason aid adminip sid removedBy removedType removedon type ureason
FormatEx(sQueryAdm, sizeof(sQueryAdm),
"IFNULL((SELECT aid FROM %s_admins WHERE authid = '%s' OR authid REGEXP '^STEAM_[0-9]:%s$'), 0)",
DatabasePrefix, sAdminAuthIdEscaped, sAdminAuthIdYZEscaped);
// authid name, created, ends, length, reason, aid, adminIp, sid
FormatEx(sQueryVal, sizeof(sQueryVal),
"'%s', '%s', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() + %d, %d, '%s', %s, '%s', %d",
sAuthidEscaped, banName, length * 60, length * 60, banReason, sQueryAdm, adminIp, serverID);
switch (type)
{
case TYPE_GAG:Format(sQueryGag, sizeof(sQueryGag), "(%s, %d)", sQueryVal, type);
case TYPE_MUTE:Format(sQueryMute, sizeof(sQueryMute), "(%s, %d)", sQueryVal, type);
case TYPE_SILENCE:
{
Format(sQueryMute, sizeof(sQueryMute), "(%s, %d)", sQueryVal, TYPE_MUTE);
Format(sQueryGag, sizeof(sQueryGag), "(%s, %d)", sQueryVal, TYPE_GAG);
}
}
// litle magic - one query for all actions (mute, gag or silence)
FormatEx(sQuery, sizeof(sQuery),
"INSERT INTO %s_comms (authid, name, created, ends, length, reason, aid, adminIp, sid, type) VALUES %s%s%s",
DatabasePrefix, sQueryMute, type == TYPE_SILENCE ? ", " : "", sQueryGag);
#if defined LOG_QUERIES
LogToFile(logQuery, "SavePunishment. QUERY: %s", sQuery);
#endif
// all data cached before calling asynchronous functions
new Handle:dataPack = CreateDataPack();
WritePackCell(dataPack, length);
WritePackCell(dataPack, type);
WritePackString(dataPack, sName);
WritePackString(dataPack, targetAuth);
WritePackString(dataPack, reason);
WritePackString(dataPack, adminAuth);
WritePackString(dataPack, adminIp);
SQL_TQuery(g_hDatabase, Query_AddBlockInsert, sQuery, dataPack, DBPrio_High);
}
Прикол в том, что периодически MySQL запрос таки жрёт.
Из сотни таких запросов он сожрал пять точно.