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

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±

    Вопросы по MySQL

    Много читал википедию по MySQL, довольно-таки долго пользуюсь самим MySQL. Но все-таки хотелось бы разобраться в функциях, которые я ранее не использовал... Возможно, они окажутся очень даже полезными для меня. Буду рад любой помощи.


    1. В функции mysql_set_options есть параметр MULTI_STATEMENTS ("Allow/Disallow executing multiple SQL statements in one query"). Я правильно понял, это позволяет использовать запросы следующего вида?
    1. SELECT * FROM table; UPDATE table SET column = 1
    Т.е. использовать несколько запросов в одной строке. Я когда-то пробовал так делать, но выполнялся только первый запрос (или не выполнялось ни одного - не помню уже, если честно).

    2. mysql_tquery, mysql_pquery и mysql_query. Чтобы не было много текста, составил вот такую вот табличку. Все ли правильно в ней?
      Открыть/закрыть

    Функция Кэширование Обработка запроса Обработка результата
    mysql_query + отсутствует отдельный поток, сервер ждет ответа от MySQL в той функции, где использовалась mysql_query
    mysql_tquery - в отдельном потоке в отдельной public-функции
    mysql_pquery + в отдельных потоках, работающих параллельно в отдельной public-функции




    3. Не понял что за функции cache_set_result и cache_get_result... Не могли бы, пожалуйста, прояснить их сущность?
    4. Последнее связано с кэшированием.. Ранее моя регистрация имела следующую структуру:
    Код HTML:
    1. По имени игрока получить его пароль.
    2. Сверять полученный пароль с введенным.
    3. Если пароли идентичны, загружать аккаунт полностью.
    Сейчас же я перешел к кэшированию:
    Код HTML:
    1. Получить всю информацию об игроке.
    2. Из полученных данных записать сразу пароль игрока в переменную. Потом сохранить кэш: cache_save(gPlayer[playerid][pCache]).
    3. После успешного ввода пароля использовать:
    [PAWN]
    gPlayer[playerid][pCache] = cache_set_active(); // переключиться на другой (поток?)
    // получить и сразу записать в переменные все данные игрока
    cache_delete(gPlayer[playerid][pCache]); // очистить содержимое (потока?)
    cache_unset_active(); // возвращаемся к первоначальному (основному) (потоку?)
    _:gPlayer[playerid][pCache] = INVALID_CACHE_ID;// INVALID_CACHE_ID - моя константа со значением -1
    [/PAWN]
    
    Ну, и на всякий случай в OnPlayerDisconnect:
    [PAWN]
    if(_:gPlayer[playerid][pCache] != INVAlID_CACHE_ID) cache_delete(gPlayer[playerid][pCache]);
    [/PAWN]
    Будет ли таковой код нормальный и не должны ли теоретически возникнуть с ним проблемы? Сколько тестировал, не замечал, но мало ли что-то работает на самом деле неправильно...

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1) А как ты определял, что выполняется только первый запрос?
    Да, параметр именно это и позволяет.

    2) Не совсем верно. У плагина есть отдельный поток для запросов, в которые попадают запросы, отправленные через mysql_tquery. Соответственно, все отправленные запросы, грубо говоря, сначала будут "закэшированы" в памяти плагина, а после будут по очереди отправляться в базу, когда та освободиться. А mysql_pquery отправляет запрос немедленно, обходя "кэширование". Там механизм немного другой, как я помню, но общая суть такая.

    3) Они как раз и нужны для переключения между результатами при отправке нескольких запросов в одной функции с параметром MULTI_STATEMENTS. Через них ты переключаешься между полученными результатами.
      Открыть/закрыть


    4) Во-первых, это не поток, а кэш. То бишь, данные просто хранятся в памяти плагина.
    Во-вторых, главное просто не забывать удалять сохранённый кэш, например, если игрок не авторизировался и вышел с сервера. В общем, во всех ситуациях, когда кэш уже не нужен. Иначе можно словить переполнение памяти и краш.
    В-третьих, ты, видимо, опечатался, ибо кэш сохраняется через cache_save, а не через cache_set_active.
    И тут можно всё через pVar сделать:

    1. // Если аккаунт найден
    2. SetPVarInt(playerid, "AccountCache", _:cache_save());
    3.  
    4. //При загрузке
    5. new Cache:result = Cache:GetPVarInt(playerid, "AccountCache");
    6. DeletePVar(playerid, "AccountCache");
    7. cache_set_active(result);
    8. // Загрузка данных
    9. cache_delete(result);
    10.  
    11. //При выходе с сервера
    12. if(GetPVarType(playerid, "AccountCache") && cache_is_valid(Cache:GetPVarInt(playerid, "AccountCache")))
    13. {
    14. cache_delete(Cache:GetPVarInt(playerid, "AccountCache"));
    15. }
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (29.12.2018)
  4. #3
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    То есть не следует переключаться на другой кэш через cache_unset_active?

  5. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, что?

    Сохранение кэша - cache_save
    Переключение на нужный кэш - cache_set_active
    Удалить кэш - cache_delete
    Прекратить работу с кэшем - cache_unset_active
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (29.12.2018)
  7. #5
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    А, все, понял)

 

 

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

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

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

Ваши права

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