mysql-proxy のスクリプトで使用できる関数

 mysql-proxy の luaスクリプトにあらかじめ定義されている関数群があります。イベントハンドらになる部分として、接続時に呼ばれるもの、認証時に呼ばれるもの、クエリを投げたときに呼ばれるもの、などがあります。
 以下とりあえずどんなタイミングでどんな関数が呼ばれるのか、およびその受け取りパラメーターにはどんな値が入っているのかを確認するためのサンプルスクリプトです。
このスクリプトをファイルに記録して(仮に simplesample.lua) mysql-proxy を実行します。(実行方法はスクリプトの下に書きました)



--接続時に呼ばれる関数
function connect_server()
  print ("CONNECT_SERVER()")
  print ("-------------")
end

--認証のハンドシェイク時に呼ばれる
function read_handshake( auth )
  print ("READ_HANDSHAKE()")
  table.foreach( auth, print)
  print ("-------------")
end

--認証時に呼ばれる
function read_auth( auth )
  print ("READ_AUTH()")
  table.foreach(auth, print)
  print ("-------------")
end

--認証結果を返すときに呼ばれる
function read_auth_result( auth )
  print ("READ_AUTH_RESULT()")
  table.foreach(auth, print)
  print ("-------------")
end

--クエリを投げたときに呼ばれる
function read_query( packet )
  print ("READ_QUERY()")
  print(string.format("%s (%s)", hexdump(packet), packet ))
  print ("-------------")
  
  proxy.queries:append(1, packet )
  return proxy.PROXY_SEND_QUERY
end

--クエリ結果戻りのときに呼ばれる
function read_query_result( inj )
  print ("READ_QUERY_RESULT()")
  print ("QUERY: " .. inj.query)
  print ("ID: "..inj.id.."  QTIME: "..inj.query_time.."  RTIME: "..inj.response_time)
  --inj.resultset
  print ("-------------")
end

--16進dump用
function hexdump( s )
  local ret = {}
  for i = 1, s:len() do
    ret[i] = string.format("%02X ", s:byte(i))
  end
  return table.concat(ret)
end 


 mysql-proxyの実行:

$ sbin/mysql-proxy --proxy-lua-script=sbin/simplesample.lua


別窓で mysql-proxyを解して mysqld に接続してみます:

$ /usr/local/mysql/bin/mysql -uroot -h127.0.0.1 -P4040
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 5.1.25-rc-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>


実行結果例:

[sakaik@colin mysql-proxy-0.6.1-linux-fc4-x86-32bit]$ sbin/mysql-proxy --proxy-lua-script=sbin/simplesample.lua 
CONNECT_SERVER()
-------------
READ_HANDSHAKE()
scramble        `S_bODGwB$)CSYG5scxS
mysqld_version  50125
server_addr     127.0.0.1:3306
thread_id       44
client_addr     127.0.0.1:6153
-------------
READ_AUTH()
password        
default_db      test
username        root
-------------
READ_AUTH_RESULT()
packet  
-------------
READ_QUERY()
03 73 65 6C 65 63 74 20 40 40 76 65 72 73 69 6F 6E 5F 63 6F 6D 6D 65 6E 74 20 6C 69 6D 69 74 20 31  (select @@version_comment limit 1)
-------------
READ_QUERY_RESULT()
QUERY: select @@version_comment limit 1
ID: 1  QTIME: 635  RTIME: 684
-------------

こんな情報が取れます。結果セットについては場合分けが必要っぽかったので(まだちゃんとパラメータの構造体(?)を把握していない)表示をあきらめました。
注目すべきは、READ_QUERY() の1バイト目。03で始まる場合は通常のクエリです。データベースの選択の場合は 02、終了は 01 のように1バイト目で何の処理かを示しています。
これ、一回ちゃんと調べてまとめましょうかね。


.


.