Spec-Zone .ru
спецификации, руководства, описания, API
|
read_query()
функция вызывается однажды для каждого запроса, представленного
клиентом, и принимает единственный параметр, пакет запроса, который был обеспечен. Чтобы получить доступ к
контенту пакета, следует проанализировать пакетное содержание вручную.
Например, можно прервать пакет запроса и распечатать содержание, используя следующее функциональное определение:
function read_query( packet ) if packet:byte() == proxy.COM_QUERY then print("we got a normal query: " .. packet:sub(2)) endend
Этот пример проверяет первый байт пакета, чтобы определить тип. Если тип COM_QUERY
(см. Константы
Команды Сервера), мы извлекаем запрос из пакета и печатаем это. Структура пакетного предоставленного
типа важна. В случае a COM_QUERY
пакет, остающееся содержание пакета является
текстом строки запроса. В этом примере никакие изменения не были произведены в запросе или списке запросов,
которые будут в конечном счете отправлены серверу MySQL.
Чтобы изменить запрос, или добавить новые запросы, следует заполнить очередь запроса (proxy.queries
),
затем выполните запросы, которые Вы поместили в очередь. Если Вы не изменяете исходный запрос или очередь,
запрос, полученный от клиента, отправляется серверу MySQL дословно.
Добавляя запросы к очереди, следует следовать за этими направляющими линиями:
Пакеты, вставленные в очередь, должны быть допустимыми пакетами запроса. Для каждого пакета следует установить начальный байт в пакетный тип. Если Вы добавляете запрос, можно добавить оператор запроса к остальной части пакета.
Как только Вы добавляете запрос к очереди, очередь используется в качестве источника для запросов, отправленных серверу. Если Вы добавляете запрос к очереди, чтобы добавить больше информации, следует также добавить исходный запрос к очереди, или это не будет выполняться.
Как только очередь была заполнена, следует установить возвращаемое значение от
read_query()
указать, должна ли очередь запроса быть отправлена серверу.
Когда Вы добавляете запросы к очереди, следует добавить ID. ID, который Вы определяете, возвращается с набором результатов так, чтобы Вы идентифицировали каждый запрос и соответствующий набор результатов. У ID нет никакой другой цели чем как идентификатор для того, чтобы коррелировать запрос и набор результатов. Работая в пассивном режиме, во время профилирования например, Вы идентифицируете исходный запрос и соответствующий набор результатов так, чтобы результаты, ожидаемые клиентом, могли быть возвращены правильно.
Если Ваш клиент не разрабатывается, чтобы справиться с большим количеством наборов результатов чем запросы, следует гарантировать, что число запросов от клиента соответствует число наборов результатов, возвращенных клиенту. Используя уникальный ID и удаляющий наборы результатов Вы вставили, поможет.
Обычно, read_query()
и read_query_result()
функция
используется в соединении друг с другом, чтобы ввести дополнительные запросы и удалить дополнительные наборы
результатов. Однако, read_query_result()
только вызывается, если Вы заполняете
очередь запроса в пределах read_query()
.