Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 4 из 4
  1. #1
    Аватар для Tracker1
    Проверенный

    Статус
    Оффлайн
    Регистрация
    30.07.2013
    Сообщений
    54
    Репутация:
    84 ±

    Использование BlueG MySQL plugin R7\R8

    Йо

    С тех пор как плагин Mysql BlueG обновился до версии R7 в начале февраля, оказалось много людей, которые не смогли понять смысл новых запросов и как использовать кэш-функции.

    Итак изменения в R7:
    *Однопотоковые запросы больше не поддерживаются
    *Реализация кэша через функции cache_get_row, cache_get_field, cache_get_data, cache_get_field_content.
    *Новая фукнция mysql_function_query которая, в отличии от старой mysql_query_callback, позволяет скриптерам задавать переменные как параметры коллбека

    Преимущества использования кэша:
    * Он быстрее! Кэш функции заметно работают быстрее чем реализация через mysql_fetch_row.
    * Больше не придется сохранять/отчищать результат выполнения запроса mysql_store_result() mysql_free_result() больше не нужны. Стоит заметить что эти функции вызывали множество проблем
    у новичков

    Функции:

    mysql_function_query(ид_подключения, запрос[], bool:кэширование, паблик_для_обработки[], формат[], Параметры... )
    * Заменяет mysql_query и mysql_query_callback из старых версий
    * Позволяет скриптерам пускать в паблик_для_обработки с форматом[] параметров (очень похоже на CallRemoteFunction)

    PHP код:
    mysql_function_query(dbHandle"SELECT ... FROM ..."true"OnQueryFinished""siii""Andre"123);
    forward OnQueryFinished(name[], number_1number_2number_3);
    public 
    OnQueryFinished(name[], number_1number_2number_3)
    {
        
    printf("Data: %s %i %i %i"namenumber_1number_2number_3);
        
    // выведет в консоль: Data: Andre 1 2 3

    Как вы можете заметить в использовании mysql_function_query , "siii" значит "string integer integer integer"(строка число число число), что обозначает данные "Andre 1 2 3", которые заданы в паблике.
    Больше не надо использовать глобальные переменные.

    * Скриптер сам выбирает в каких запросах стоит использовать кэширование а в каких нет. (3 аргумент функции)

    PHP код:
    // SELECT запросы
    mysql_function_query(dbHandle"SELECT * FROM players"true"OnPlayerListLoad""");
    // Мы задаем кэширование этому запросу и выполняем паблик "OnPlayerListLoad" после выполнения - этот паблик вызовется без параметров (пустые кавычки сигнализируют об этом)

    // Остальные (UPDATE и другие) запросы
    mysql_function_query(dbHandle"UPDATE players SET kills = 10 WHERE id = 1"false"""");
    // Кэширование не задаем и паблик не вызываем. 
    cache_get_data(переменная_количества_строк, переменная_количества_столбцов, ид_подключения = 1)

    В большинстве случаев, после запросов на выборку, следует вызывать эту функцию(конечно же если в запросе включено кэширование), чтобы узнать точное количество столбцов и строк, полученных из базы
    Пример очень прост:
    PHP код:
    mysql_function_query(dbHandle"SELECT * FROM players WHERE name = 'Andre' LIMIT 0,1"true"OnPlayerDataLoad""s""Andre");
    forward OnPlayerDataLoad(name[]);
    public 
    OnPlayerDataLoad(name[])
    {
        new 
    rowsfields;
        
    cache_get_data(rowsfields);
        if(!
    rows)
        {
            
    printf("%s не зарегистрирован на этом сервере!",name);
        }
        else
        {
            
    printf("%s зарегистрирован (1 строка с %d столбцами)",namefields);
        }

    cache_get_row(строка, индекс, строка_записи[], ид подключения = 1)
    Самая простейшая функция получения данных из запроса. В большинстве случаев она и применяется. Функция берет индекс строки, индекс столбца и записывает данные в строку записи(обязательно string)
    Подсчет индексов в базе идет с 0. Т.е.
    представим что в базе 3 стобца
    1. ID - индекс 0
    2. имя - индекс 1
    3. уровень - индекс 2

    PHP код:
    new temp[12];
    cache_get_row(00temp);
    pritnf("ID - %d"strval(temp));
    cache_get_row(02temp);
    printf("Уровень - %d"strval(temp)); 
    Так как 3 параметр обязательно должен быть строкой, то для переноса значения в енам игрока(к примеру) следует делать следущее
    PHP код:
    cache_get_row(02temp);
    PlayerInfo[playerid][pLevel] = strval(temp); 
    cache_get_field(индекс_столбца, строка_записи[], ид_подключения = 1)
    Ничего интересного. Функция просто записывает в строку записи название столбца.


    cache_get_field_content(строка, название столбца[], строка записи[], ид_подключения = 1)
    Функция похожа на cache_get_row, но здесь вместо ида столбца задается его название.
    Стоит заметить тот факт, что cache_get_row выполняется чуточку быстрее, однако, он бесполезен в ситуациях, когда мы не знаем необходимые иды столбцов.

    Пример
    PHP код:
    new temp[12];
    cache_get_field_content(0"level"temp);
    printf("Уровень - %d"strval(temp)); 

    Конвертация мода с НЕмногопоточных запросов на многопоточные запросы

    Так как немногопоточные запросы больше не поддерживаются в плагине, стоит рассказать, как же сделать запросы многопоточными.
    Типичный пример СТАРОЙ(!!!) загрузки игрока:
    PHP код:
    format(querysizeof(query), "SELECT name,level,kills,deaths FROM players WHERE name = %s LIMIT 0,1"PlayerName);
    mysql_query(query);
    mysql_store_result();
    if(
    mysql_num_rows())
    {
        
    mysql_fetch_row(data);
        
    sscanf(data"p<|>s[24]iii"namelevel[playerid], kills[playerid], deaths[playerid]);
    }
    mysql_free_result(); 
    А теперь реализация той же самой загрузки через многопоточный запрос:
    PHP код:
    format(querysizeof(query), "SELECT name,level,kills,deaths FROM players WHERE name = '%s' LIMIT 0,1"PlayerName);
    mysql_function_query(dbHandlequerytrue"OnPlayerDataLoad""i"playerid);

    // Где-нибудь в скрипте
    forward OnPlayerDataLoad(playerid);
    public 
    OnPlayerDataLoad(playerid)
    {
        
    // получаем количество строк и столбцов, полученных в результате запроса
        
    new rowsfields;
        
    cache_get_data(rowsfields);
        if(
    rows)
        {
            
    cache_get_row(00name); // записываем данные из столбца name в строку name
            
    new temp[12]; // создаем временную строку для перевода числовых значений
            
    cache_get_row(01temp); // записываем данные из столбца с уровнем в строку temp
            
    level[playerid] = strval(temp); // записываем в массив 
            // Тоже самое делаем с двумя следующими полями
            
    cache_get_row(02temp), kills[playerid] = strval(temp);
            
    cache_get_row(03temp), deaths[playerid] = strval(temp);
        }
        return 
    1
        
    // возвращаем 1 для отчистки кэша в плагине.

    Самый большой плюс от многопоточности заключается в том, что ваш сервер больше не зависает во время выполнения запроса. Это значит
    пока идет запрос, сервер будет заниматься другими делами. Благодаря возможностям R7, вам больше не придется отчищать память после запроса, и в итоге вы избегаете утечек памяти.

    На этом всё.

  2. 10 пользователя(ей) сказали cпасибо:
    Airon007 (04.08.2013) DeimoS (06.05.2014) Hidden (26.11.2013) Osetin (04.08.2013) Salvacore (01.02.2014) semen7907 (21.03.2014) Skuba_Lo (14.04.2014) wAx (06.03.2014) [ForD] (18.11.2013)
  3. #2
    Аватар для Airon007
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.03.2013
    Адрес
    Республика Мордовия г.Саранск
    Сообщений
    484
    Репутация:
    46 ±
    полезно :)
    Пробыл модератором на портале Pro-Pawn.Ru 3 месяца и 13 дней
    Ровно 105 дней провёл на посту СуперМодератора

  4. #3
    Аватар для Will_Winston
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2013
    Сообщений
    120
    Репутация:
    3 ±
    Цитата Сообщение от Netrox Посмотреть сообщение
    полезно :)
    +

  5. #4
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Thank u!

 

 

Информация о теме

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

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •