MySQLパケット続き
結局パケットはMySQL_Packet_interfaceみたいなインターフェースの構造体にデシリアライズして、typeフィールドみたいなもので、どのcommand_typeか判断してフィールドを判断してもらうようにする。
handshake時の情報とか、ステートマシンがpacketを解釈することを前提にパケット構造の設計がされているから、全て独立にパケットを解釈しようとしたり、途中からpcap使って読み出そうとすると結構大変。
特に圧縮パケット使っているかどうかを判断するのは厳しい気がしていて、それは実行時にオプションで指定してもらうようにしようかと思っている。 暗号化について考える必用もあるし、完璧なでシリアライザを作るのはこの規模でも結構面倒くさそう。
O'reillyの詳解MySQLを読んでみたら結構通信プロトコルに関してもしっかり書いてあった。(さすが詳解というだけはある。)
結構面白いのは4.1が出たてと思われるこの本ですら結構なコマンドタイプがobsoletedになっている。 あとはクライアントが叩くことはなく、内部的に利用されるコマンドタイプがいくつかあって、レプリケーション用ではないしなんだこれ?感はあるけど、調べるほどでもない。
暗号化なしの場合でも圧縮の有無によって5byte目だけでコマンドタイプ判断は無理ということがわかったけど、ここはすべての構造をパースしなくてもできるように非圧縮を前提に進めてみる。
- やはりハンドシェイク時にフラグ設定する
- my.cnfにデフォルト有効無効の設定はなさそう
という感じ、どのくらい使われているかわからないけど、5byte目がCOM_QUERY である0x03を出力するようにして試すのが早い気はする。