read_query() 函數會在用戶端送出每一個 query 後被調用一次,其具有一個單獨的參數,即 query 包内容本身。為了通路包的内容,你必須手動解析包内容。
例如,你能夠攔截一個 query 包并将其内容列印出來,函數定義如下:
該例子檢查了包的第一個位元組以确定包中内容的類型。如果其類型為 com_query(參閱 server command constants),我們就可以從包中提取 query 資訊并将其列印。提供包類型這個結構是非常重要的。對于 com_query 包,類型後的剩餘内容是 query 字串的文本内容。在該例子中,沒有對最終發送到 mysql 伺服器的 query 和 query 清單進行任何形式的改變,
如果想要修改一個 query ,或者添加新的 query ,你必須将其填入 query 隊列中,然後才能執行你之前放入隊列中的那些 query 。如果你沒有修改原始的 query 或者 隊列,那麼從用戶端處發送來的 query 将原封不動的發送到伺服器。
當向隊列中添加 query 時,你應該遵循下面的規則:
a.插入到隊列中的包必須是有效的 query 包。對于每一個包,你必須在包的第一個位元組中設定包類型。如果你是再隊列尾部添加的 query ,你可以将該 query 語句附加到其餘包的後面。
b.一旦你向隊列中添加了 query ,該隊列将被用作向伺服器發送 query 的源。如果你是為了獲得更多可供使用的資訊而向隊列中添加 query ,你同樣必須将原始 query 也添加到隊列中,否則原始的 query 将得不到執行。
c.一旦隊列被填入了内容,你必須設定 read_query() 的傳回值以表明 query 隊列是否應該被發送到伺服器。
d.當你向隊列中添加 query 時,你應該同時添加一個 id 。你指定的這個 id 會伴随結果集傳回回來,故你可以通過它将每一個 query 和相應的結果集對應起來。該 id 除了作為關聯 query 和結果集的辨別符為沒有其他用途。當運作于被動模式時,例如在 profiling 中,你可以标示出相應的原始 query 和相應的結果集,故用戶端能夠擷取到所期望的結果集。
除非你的用戶端設計成能夠處理傳回結果集數量多于原始 query 數量,你應該確定來自用戶端的 query 的數量和傳回給用戶端的結果集數量是相同的。通過使用唯一的 id ,然後移除你自己插入的 query 對應的結果集将會滿足上述功能。
通常來講,read_query() 函數和 read_query_result() 函數會在一起配合使用,以提供注入額外 query 和移除額外結果集的功能。然而,read_query_result() 函數隻有在你在 read_query() 函數内向 query 隊列中填入了 query 的前提下才會被調用。