Spec-Zone .ru
спецификации, руководства, описания, API

15.7.4.8. Управление Результатами с read_query_result()

read_query_result() вызывается для каждого набора результатов, возвращенного сервером, только если Вы вручную ввели запросы в очередь запроса. Если Вы не управляли очередью запроса, эта функция не вызывается. Функция поддерживает единственный параметр, пакет результата, который обеспечивает много свойств:

Получая доступ к информации о результате от сервера 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".