Привет! Если вы читаете это - вы еще не зарегистрированы. Это займет не больше минуты. Нажмите здесь, чтобы пройти регистрацию в несколько простых шагов, чтобы получить доступ ко всем разделам нашего форума. Удачи!
С тех пор как плагин 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)
Как вы можете заметить в использовании mysql_function_query , "siii" значит "string integer integer integer"(строка число число число), что обозначает данные "Andre 1 2 3", которые заданы в паблике.
Больше не надо использовать глобальные переменные.
* Скриптер сам выбирает в каких запросах стоит использовать кэширование а в каких нет. (3 аргумент функции)
// 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, "", "");
// Кэширование не задаем и паблик не вызываем.
В большинстве случаев, после запросов на выборку, следует вызывать эту функцию(конечно же если в запросе включено кэширование), чтобы узнать точное количество столбцов и строк, полученных из базы
Пример очень прост:
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)
{
printf("%s не зарегистрирован на этом сервере!",name);
}
else
{
printf("%s зарегистрирован (1 строка с %d столбцами)",name, fields);
}
}
cache_get_row(строка, индекс, строка_записи[], ид подключения = 1)
Самая простейшая функция получения данных из запроса. В большинстве случаев она и применяется. Функция берет индекс строки, индекс столбца и записывает данные в строку записи(обязательно string)
Подсчет индексов в базе идет с 0. Т.е.
представим что в базе 3 стобца
1. ID - индекс 0
2. имя - индекс 1
3. уровень - индекс 2
cache_get_field(индекс_столбца, строка_записи[], идподключения = 1)
Ничего интересного. Функция просто записывает в строку записи название столбца.
cache_get_field_content(строка, название столбца[], строка записи[], идподключения = 1)
Функция похожа на cache_get_row, но здесь вместо ида столбца задается его название.
Стоит заметить тот факт, что cache_get_row выполняется чуточку быстрее, однако, он бесполезен в ситуациях, когда мы не знаем необходимые иды столбцов.
Пример
new temp[12];
cache_get_field_content(0, "level", temp);
printf("Уровень - %d", strval(temp));
Конвертация мода с НЕмногопоточных запросов на многопоточные запросы
Так как немногопоточные запросы больше не поддерживаются в плагине, стоит рассказать, как же сделать запросы многопоточными.
Типичный пример СТАРОЙ(!!!) загрузки игрока:
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();
А теперь реализация той же самой загрузки через многопоточный запрос:
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, вам больше не придется отчищать память после запроса, и в итоге вы избегаете утечек памяти.
Гость форума ~ с января 2012
Пользователь с 29.02.2012
VIP пользователь ~ с 1.04.2012
Проверенный ~ с 28.05.2012
Супер-Модератор с 09.07.2013
Проверенный ~ с 24.10.2013
“When you have insomnia, you're never really asleep. And you're really awake.”
“Никогда не указывайте на ошибки, если не знаете, как их исправить.” - Бернард Шоу.
“Если ты способен выдумать что-то, ты можешь и сделать это.” - Уолт Дисней.
“Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.” - Элеонор Рузвельт.