• Страница 1 из 1
  • 1
Модератор форума: valych  
Форум | www.SAMP-TEAM.com » Wiki SA-MP » Информация для новичков » BlueG mysql plugin R7
BlueG mysql plugin R7
С тех пор как плагин 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)

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


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

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

Code
// 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)

В большинстве случаев, после запросов на выборку, следует вызывать эту функцию(конечно же если в запросе включено кэширование), чтобы узнать точное количество столбцов и строк, полученных из базы
Пример очень прост:

Code
mysql_function_query(dbHandle, "SELECT * FROM players WHERE name = 'Andre' LIMIT 0,1", true, "OnPlayerDataLoad", "s", "Andre");
forward OnPlayerDataLoad(name[]);
public OnPlayerDataLoad(name[])
{
     new rows, fields;
     cache_get_data(rows, fields);
     if(!rows)
     {
         print(!"%s не зарегистрирован на этом сервере!",name);
     }
     else
     {
         printf("%s зарегистрирован (1 строка с %d столбцами)", fields);
     }
}


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

Code
new temp[12];
cache_get_row(0, 0, temp);
pritnf("ID - %d", strval(temp));
cache_get_row(0, 2, temp);
printf("Уровень - %d", strval(temp));


Так как 3 параметр обязательно должен быть строкой, то для переноса значения в енам игрока(к примеру) следует делать следущее

Code
cache_get_row(0, 2, temp);
PlayerInfo[playerid][pLevel] = strval(temp);


cache_get_field(индекс_столбца, строка_записи[], идподключения = 1)
Ничего интересного. Функция просто записывает в строку записи название столбца.

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

Пример:

Code
new temp[12];
cache_get_field_content(0, "level", temp);
printf("Уровень - %d", strval(temp));


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

Так как немногопоточные запросы больше не поддерживаются в плагине, стоит рассказать, как же сделать запросы многопоточными.
Типичный пример СТАРОЙ(!!!) загрузки игрока:

Code
format(query, sizeof(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", name, level[playerid], kills[playerid], deaths[playerid]);
}
mysql_free_result();


А теперь реализация той же самой загрузки через многопоточный запрос:

Code
format(query, sizeof(query), "SELECT name,level,kills,deaths FROM players WHERE name = '%s' LIMIT 0,1", PlayerName);
mysql_function_query(dbHandle, query, true, "OnPlayerDataLoad", "i", playerid);
   
// Где-нибудь в скрипте
forward OnPlayerDataLoad(playerid);
public OnPlayerDataLoad(playerid)
{
     // получаем количество строк и столбцов, полученных в результате запроса
     new rows, fields;
     cache_get_data(rows, fields);
     if(rows)
     {
         cache_get_row(0, 0, name); // записываем данные из столбца name в строку name
         new temp[12]; // создаем временную строку для перевода числовых значений
         cache_get_row(0, 1, temp); // записываем данные из столбца с уровнем в строку temp
         level[playerid] = strval(temp); // записываем в массив
         // Тоже самое делаем с двумя следующими полями
         cache_get_row(0, 2, temp), kills[playerid] = strval(temp);
         cache_get_row(0, 3, temp), deaths[playerid] = strval(temp);
     }
     return 1;
     // возвращаем 1 для отчистки кэша в плагине.
}


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

Автор:Tracker1
11.07.2012 в 00:35
Форум | www.SAMP-TEAM.com » Wiki SA-MP » Информация для новичков » BlueG mysql plugin R7
  • Страница 1 из 1
  • 1
Поиск: