Spec-Zone .ru
спецификации, руководства, описания, API
|
The following figure gives an example of how the proxy might be used when injecting queries into the query queue. Because the proxy sits between the client and MySQL server, what the proxy sends to the server, and the information that the proxy ultimately returns to the client, need not match or correlate. Once the client has connected to the proxy, the sequence shown in the following diagram occurs for each individual query sent by the client.
When the client submits one query to the proxy, the read_query()
function within the proxy is triggered. The function adds the query to the query queue.
Once manipulation by read_query()
has completed, the
queries are submitted, sequentially, to the MySQL server.
The MySQL server returns the results from each query, one result set for each query
submitted. The read_query_result()
function is triggered for each result
set, and each invocation can decide which result set to return to the client
For example, you can queue additional queries into the global query queue to be processed by the server. This can be used to add statistical information by adding queries before and after the original query, changing the original query:
SELECT * FROM City;
Into a sequence of queries:
SELECT NOW();SELECT * FROM City;SELECT NOW();
You can also modify the original statement; for example, to add EXPLAIN
to each statement executed to get information on how the statement was
processed, again altering our original SQL statement into a number of statements:
SELECT * FROM City;EXPLAIN SELECT * FROM City;
In both of these examples, the client would have received more result sets than expected. Regardless of how you manipulate the incoming query and the returned result, the number of queries returned by the proxy must match the number of original queries sent by the client.
You could adjust the client to handle the multiple result sets sent by the proxy, but in most cases you will
want the existence of the proxy to remain transparent. To ensure that the number of queries and result sets
match, you can use the MySQL Proxy read_query_result()
to extract the additional
result set information and return only the result set the client originally requested back to the client. You
can achieve this by giving each query that you add to the query queue a unique ID, then filter out queries that
do not match the original query ID when processing them with read_query_result()
.