脚本的例程如下:
--[[
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--]]
--[[
version 0.0.2
Changelog: 4-12-2008
*it was filtering only insert statements, now it will log any warnings from any statement
This is the sql you need to run to create the database and table
to log the errors and warnings
CREATE DATABASE `logs`
CREATE TABLE `logs`.`t_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`err_num` smallint(6) NOT NULL,
`err_type` char(10) NOT NULL,
`err_message` char(255) NOT NULL,
`problem_query` char(255) NOT NULL,
PRIMARY KEY (`id`)
Feel free to add more columns or change it around, then come back and publish your changes.
--]]
---
-- read_query() can rewrite packets
--
-- You can use read_query() to replace the packet sent by the client and rewrite
-- query as you like
--
-- @param packet the mysql-packet sent by the client
--
-- @return
-- * nothing to pass on the packet as is,
-- * proxy.PROXY_SEND_QUERY to send the queries from the proxy.queries queue
-- * proxy.PROXY_SEND_RESULT to send your own result-set
--
function read_query( packet )
if string.byte(packet) == proxy.COM_QUERY then
-- Uncomment the next 3 lines and the
-- matching end to only store if it is an insert statement
-- local query = packet:sub(2)
-- local cmd = query:match('^(%w+)%s+')
-- if cmd and cmd:lower() == 'insert' then
proxy.queries:append(1, packet )
-- Here we add the SHOW WARNINGS and also set a user defined variable to hold the
-- query that gives you the warning
proxy.queries:append(2, string.char(proxy.COM_QUERY) .. "SHOW WARNINGS" )
proxy.queries:append(3, string.char(proxy.COM_QUERY) .. "SET @statement ='" .. string.sub(packet, 2).."'" )
-- end --this is the matching end for the if statement
return proxy.PROXY_SEND_QUERY
end
end
--Here we have a function that inserts the error and/or warnings into
--a table
--
function insert_query(err_t, err_n,err_m )
proxy.queries:append(4, string.char(proxy.COM_QUERY) .. "INSERT INTO logs.t_log(err_num,err_type,err_message, problem_query)" ..
"VALUES(" .. err_n .. "," .. "\"" ..
err_t .."\"" .. "," .. "\"" ..
err_m .. "\"" .. "," ..
"@statement"
.. ")")
return proxy.PROXY_SEND_QUERY
end
--
--
---
-- read_query_result() is called when we receive a query result
-- from the server
--
-- we can analyze the response, drop the response and pass it on (default)
--
-- as we injected a SELECT NOW() above, we don't want to tell the client about it
-- and drop the result with proxy.PROXY_IGNORE_RESULT
--
-- @return
-- * nothing or proxy.PROXY_SEND_RESULT to pass the result-set to the client
-- * proxy.PROXY_IGNORE_RESULT to drop the result-set
--
function read_query_result(inj)
-- we injected the SHOW WARNINGS with the id = 2
if (inj.type == 2) then
for row in inj.resultset.rows do
--print("injected query returned: " .. row[1] .. ":" .. row[2] .. ":" .. row[3] )
-- Log errors and warnings here
insert_query(row[1],row[2],row[3])
end
return proxy.PROXY_IGNORE_RESULT
end
end