tombo2-progress’s diary

できるだけ毎日1時間を切り取ってここに晒す。誤字脱字気にしない。日本語が崩壊するのも気にしない。最終的にまとめて本ブログに書く

どうもパースがうまく行かない原因がわかった

これまでのルールでほとんど全てのパケットをパースできると思っていたが、どうもうまく行かない。

Network上の1packetごとにMySQLプロトコルのパケットが複数含まれるので、そのMySQLパケットの中身がうまくパースできないことはわかっていた。

よく見るとCOM_QUERY Response, COM_FIELD_LIST Response, ProtocolText::Resultset のパケットはcommand_type = 03で来るけどCOM_QUERYのフィールド定義ではないので、ここでうまく行っていないことがわかった。

COM_QUERY Responseは以下のパケットに含まれ得る

  • ERR_Packet
  • a OK_Packet
  • a Protocol::LOCAL_INFILE_Request
  • a ProtocolText::Resultset

COM_FIELD_LIST Responseは以下。

  • a ERR_Packet or
  • one or more Column Definition packets and a closing EOF_Packet

ProtocolText::ResultsetはA query like SELECT @@version_comment returns:とあって、おそらく最初のパケットは01 (COM_QUIT) でパースしてみる

COM_QUERYに関してはまだ調査不足

f:id:tom__bo:20180814005049p:plain

上のCOM_QUERY Response のリンクの内容見ても、完全にパースするにはまだドキュメントが網羅できてないことがわかる。。。