- Регистрация
- 1 Июл 2011
- Сообщения
- 1,752
- Лучшие ответы
- 0
- Репутация
- 871
Йо
С тех пор как плагин 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 из старых версий
* Позволяет скриптерам пускать в паблик_для_обработки с форматом[] параметров (очень похоже на
Как вы можете заметить в использовании mysql_function_query , "siii" значит "string integer integer integer"(строка число число число), что обозначает данные "Andre 1 2 3", которые заданы в паблике.
Больше не надо использовать глобальные переменные.
* Скриптер сам выбирает в каких запросах стоит использовать кэширование а в каких нет. (3 аргумент функции)
cache_get_data(&переменная_количества_строк, &переменная_количества_стобцов, ид подключения = 1)
В большинстве случаев, после запросов на выборку, следует вызывать эту функцию(конечно же если в запросе включено кэширование), чтобы узнать точное количество столбцов и строк, полученных из базы
Пример очень прост:
cache_get_row(строка, индекс, строка_записи[], ид подключения = 1)
Самая простейшая функция получения данных из запроса. В большинстве случаев она и применяется. Функция берет индекс строки, индекс столбца и записывает данные в строку записи(обязательно string)
Подсчет индексов в базе идет с 0. Т.е.
представим что в базе 3 стобца
1. ID - индекс 0
2. имя - индекс 1
3. уровень - индекс 2
Так как 3 параметр обязательно должен быть строкой, то для переноса значения в енам игрока(к примеру) следует делать следущее
cache_get_field(индекс_столбца, строка_записи[], идподключения = 1)
Ничего интересного. Функция просто записывает в строку записи название столбца.
cache_get_field_content(строка, название столбца[], строка записи[], идподключения = 1)
Функция похожа на cache_get_row, но здесь вместо ида столбца задается его название.
Стоит заметить тот факт, что cache_get_row выполняется чуточку быстрее, однако, он бесполезен в ситуациях, когда мы не знаем необходимые иды столбцов.
Пример
Конвертация мода с НЕмногопоточных запросов на многопоточные запросы
Так как немногопоточные запросы больше не поддерживаются в плагине, стоит рассказать, как же сделать запросы многопоточными.
Типичный пример СТАРОЙ(!!!) загрузки игрока:
А теперь реализация той же самой загрузки через многопоточный запрос:
Самый большой плюс от многопоточности заключается в том, что ваш сервер больше не зависает во время выполнения запроса. Это значит
пока идет запрос, сервер будет заниматься другими делами. Благодаря возможностям 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 из старых версий
* Позволяет скриптерам пускать в паблик_для_обработки с форматом[] параметров (очень похоже на
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
)
PHP:
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
}
Больше не надо использовать глобальные переменные.
* Скриптер сам выбирает в каких запросах стоит использовать кэширование а в каких нет. (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, "", "");
// Кэширование не задаем и паблик не вызываем.
В большинстве случаев, после запросов на выборку, следует вызывать эту функцию(конечно же если в запросе включено кэширование), чтобы узнать точное количество столбцов и строк, полученных из базы
Пример очень прост:
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 rows, fields;
cache_get_data(rows, fields);
if(!rows)
{
printf("%s не зарегистрирован на этом сервере!",name);
}
else
{
printf("%s зарегистрирован (1 строка с %d столбцами)",name, fields);
}
}
Самая простейшая функция получения данных из запроса. В большинстве случаев она и применяется. Функция берет индекс строки, индекс столбца и записывает данные в строку записи(обязательно string)
Подсчет индексов в базе идет с 0. Т.е.
представим что в базе 3 стобца
1. ID - индекс 0
2. имя - индекс 1
3. уровень - индекс 2
PHP:
new temp[12];
cache_get_row(0, 0, temp);
pritnf("ID - %d", strval(temp));
cache_get_row(0, 2, temp);
printf("Уровень - %d", strval(temp));
PHP:
cache_get_row(0, 2, temp);
PlayerInfo[playerid][pLevel] = strval(temp);
Ничего интересного. Функция просто записывает в строку записи название столбца.
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(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();
PHP:
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, вам больше не придется отчищать память после запроса, и в итоге вы избегаете утечек памяти.
На этом всё.
Последнее редактирование модератором: