Spec-Zone .ru
спецификации, руководства, описания, API
|
read_query_result()
вызывается для каждого набора результатов, возвращенного
сервером, только если Вы вручную ввели запросы в очередь запроса. Если Вы не управляли очередью запроса, эта
функция не вызывается. Функция поддерживает единственный параметр, пакет результата, который обеспечивает много
свойств:
id
: ID набора результатов, который соответствует ID,
который был установлен, когда пакет запроса был представлен серверу при использовании append(id)
на очереди запроса. Вы, должно быть, установили resultset_is_needed
флаг к append
прерывать
набор результатов прежде, чем это будет возвращено клиенту. См. proxy.queries.
query
: Текст исходного запроса.
query_time
: Число микросекунд, требуемых получить
первую строку набора результатов начиная с запроса, было отправлено серверу.
response_time
: Число микросекунд, требуемых получить
последнюю строку набора результатов начиная с запроса, было отправлено серверу.
resultset
: Контент данных набора результатов.
Получая доступ к информации о результате от сервера MySQL, можно извлечь результаты, которые соответствуют запросы, которые Вы вводили, возвратите различные наборы результатов (например, от измененного запроса), и даже создайте Ваши собственные наборы результатов.
Следующий сценарий Lua, например, выведет запрос, сопровождаемый временем запроса и временем отклика (то есть, время, чтобы выполнить запрос и время, чтобы возвратить данные для запроса) для каждого запроса, отправленного серверу:
function read_query( packet ) if packet:byte() == proxy.COM_QUERY then print("we got a normal query: " .. packet:sub(2)) proxy.queries:append(1, packet ) return proxy.PROXY_SEND_QUERY endendfunction read_query_result(inj) print("query-time: " .. (inj.query_time / 1000) .. "ms") print("response-time: " .. (inj.response_time / 1000) .. "ms")end
Можно получить доступ к строкам возвращенных следствий набора результатов, получая доступ rows
свойство resultset
свойство результата, который представляется через read_query_result()
. Например, можно выполнить итерации по результатам,
показывая первый столбец от каждой строки, используя этот фрагмент Lua:
for row in inj.resultset.rows do print("injected query returned: " .. row[1])end
Точно так же как read_query()
, read_query_result()
может возвратить различные значения для каждого результата согласно возвращенному результату. Если Вы ввели
дополнительные запросы в очередь запроса, например, удалите результаты, возвращенные из тех дополнительных
запросов, и возвратите только следствия запроса, первоначально представленного клиентом.
Следующий пример вводит дополнительный SELECT NOW()
операторы в очередь запроса,
давая им различный ID ID исходного запроса. В пределах read_query_result()
, если
ID для введенных запросов идентифицируется, мы выводим на экран строку результата, и возвращаемся proxy.PROXY_IGNORE_RESULT
от функции так, чтобы результат не был возвращен
клиенту. Если результат от запроса, мы распечатываем информацию времени запроса для запроса и возвращаем
значение по умолчанию, которое передает неизменный набор результатов. Мы, возможно, также явно возвратились
proxy.PROXY_IGNORE_RESULT
клиенту MySQL.
function read_query( packet ) if packet:byte() == proxy.COM_QUERY then proxy.queries:append(2, string.char(proxy.COM_QUERY) .. "SELECT NOW()", {resultset_is_needed = true} ) proxy.queries:append(1, packet, {resultset_is_needed = true}) proxy.queries:append(2, string.char(proxy.COM_QUERY) .. "SELECT NOW()", {resultset_is_needed = true} ) return proxy.PROXY_SEND_QUERY endendfunction read_query_result(inj) if inj.id == 2 then for row in inj.resultset.rows do print("injected query returned: " .. row[1]) end return proxy.PROXY_IGNORE_RESULT else print("query-time: " .. (inj.query_time / 1000) .. "ms") print("response-time: " .. (inj.response_time / 1000) .. "ms") endend
Для дальнейших примеров см. Раздел 15.7.5, "Используя MySQL Proxy".