[SQL] Core

[SQL] Core 1.2 BETA

Нет прав для скачивания
Сообщения
84
Реакции
8
На днях поставлю. Отключил из за ботов. Если что то еще будет. Отпишусь.
По соображениям тоже.
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Код:
// Поиск пользователя по стим ид
format(g_szQuery, charsmax(g_szQuery), "\
SELECT `%s`.*\
FROM `%s`\
WHERE `%s`.`ip` = '%s' OR `%s`.`steam_id` = '%s'\
",
Таким запросом лучше не идентифицировать пользователя, по IP. Так вы осчастливите всех соседей из подсетей с динамическими IP адресами.

Глядя на работу с SqlX прямо кровь из глаз... Если вы тоже пытаетесь писать высоконагруженный SQL-код, может быть попробуете мой турбо-SQL? И сможете дать какую-то обратную связь по его работе и функционалу... Он, примерно, в (100 * число ядер) раз производительнее штатного AMXX, с очередями и приоритезацией, автоматически определяет типы полей и т.п.. Если вам интересно, я дам вам модуль, инклуд и примеры работы с ним.
 
Сообщения
3
Реакции
0
Поставил 1.1 Бету
Код:
L 11/01/2024 - 10:36:33: [AMXX] Displaying debug trace (plugin "SQL_Core.amxx", version "1.1 BETA")
L 11/01/2024 - 10:36:33: [AMXX] Run time error 4: index out of bounds
L 11/01/2024 - 10:36:33: [AMXX]    [0] SQL_Core.sma::SQL_QueryConnection_Service (line 86)
id сервера -1
[ 5] [SQL] Core 1.1 BETA Mittu SQL_Core.amxx debug
 
Сообщения
137
Реакции
23
Помог
2 раз(а)
Kolorado2024 update SQL_QueryConnection_Service function like this


C++:
public SQL_QueryConnection_Service(iState, Handle:hQuery, const szError[], iErrorCode, const szData[], iDataSize) // Получает список всех привилегий
{
    if(iState == TQUERY_CONNECT_FAILED || iState == TQUERY_QUERY_FAILED)
        return MySQL_connection_failed(iState, szError, iErrorCode, szData, iDataSize);

    if(SQL_NumResults(hQuery))
    {
        new iResults = SQL_NumResults(hQuery), Coll = 0;
        new iStrSize[] = {255, 32};
        g_iResultService = iResults;
        
        while(iResults && Coll < sizeof(g_BDServiceInfo)) // Bounds check for Coll
        {
            g_BDServiceInfo[Coll][SERVICE_ID] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "id"));
            SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "name"), g_BDServiceInfo[Coll][SERVICE_NAME], iStrSize[0] - 1);  // size = 255
            SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "rights"), g_BDServiceInfo[Coll][SERVICE_FLAGS], iStrSize[1] - 1);  // size = 32
            g_BDServiceInfo[Coll][TRIM] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "trim"));
            g_BDServiceInfo[Coll][IMMUNITY] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "immunity"));
            g_BDServiceInfo[Coll][SALE] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "sale"));
            g_BDServiceInfo[Coll][USERS_GROUP] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "users_group"));
            g_BDServiceInfo[Coll][SHOW_ADM] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "show_adm"));
            g_BDServiceInfo[Coll][SERVER_SERVICE] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "service"));
            g_BDServiceInfo[Coll][SERVER_PRICE] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "price"));
            g_BDServiceInfo[Coll][PRICE_RENEWAL] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "price_renewal"));
            g_BDServiceInfo[Coll][TIME] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "time"));
            g_BDServiceInfo[Coll][DISCOUNT] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "discount"));

            SQL_NextRow(hQuery);
            Coll++;
            iResults--;
        }
    }
    return PLUGIN_HANDLED;
}
 
Сообщения
211
Реакции
335
Помог
3 раз(а)
Refresh, там нет и намёка на высоконагруженный SQL код.
было бы интересно увидеть исходный код и API, это было бы хорошо сделать перед тем как разрабатывать какой-то публичный плагин, который будет опираться на эту реализацию mysql клиента
1 Ноя 2024
Код:
new szName[250];
get_user_name(id, szName, charsmax(szName));

while(replace(g_BDUserInfo[id][NAME], charsmax(szName), "&#039;", "'")) {}

if(!equali(g_BDUserInfo[id][NAME], szName) && g_BDUserInfo[id][ID] && UserId)
{
    while(replace(szName, charsmax(szName), "'", "&#039;")) {}
    new iParams[1];
    iParams[0] = UserId;
    format(g_szQuery, charsmax(g_szQuery), "UPDATE `%s` SET `nick` = '%s' WHERE `id` = %d", g_szDataBase[TABLE_USERS],
    szName, g_BDUserInfo[id][ID]);
    SQL_ThreadQuery(g_SqlTuple, "SQL_QueryConnection_Users_AutoNick", g_szQuery, iParams, sizeof iParams);
}
Здесь szName не экранируется, возможна sql-инъекция
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Xelson, ну это не финальный результат, а скорее мой "черновик", который я делал из обертки ReAPI... Тем не менее, он работоспособный и после замены API дал нужный мне результат... все что есть в инклуде - работоспособно. С буферизацией я еще играюсь, поскольку в клиенте mariadb (3.3.12+) есть некоторые баги, при дропах соединений на стороне сервера или сетевого оборудования ограничивающего соединения (pps). А 3.4 и тестовая 3.5 не собираются без TLS. А с TLS пока невозможно понизить версию GLIBC (на Ubunte 16.04 нет нужной версии GCC для сборки C++17, а там где есть нужная версия GCC - GLIBC уже слишком большая) у получаемого модуля, чтобы это было работоспособно на древнем софте хостинга Арены.
 

Вложения

Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу