jmr连接mysql_【原创】MySQL Proxy - read_query()

read_query() 函数会在客户端提交每一个 query 后被调用一次,其具有一个单独的参数,即 query 包内容本身。为了访问包的内容,你必须手动解析包内容。

例如,你能够拦截一个 query 包并将其内容打印出来,函数定义如下:

function read_query( packet )

if packet:byte() == proxy.COM_QUERY then

print("we got a normal query: " .. packet:sub(2))

end

end

该例子检查了包的第一个字节以确定包中内容的类型。如果其类型为 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 的前提下才会被调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值