2013年8月30日金曜日

mysqladmin.ccのコードリーディングのさわり

みんなmysqladminが大好きっぽいのでおいておきますね。

まずはソースコード取ってきて解凍します。全部解凍するの面倒なので、mysqladmin.ccだけ取り出しますかね。

$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.13.tar.gz/from/http://cdn.mysql.com/
$ tar xzf mysql-5.6.13.tar.gz mysql-5.6.13/client/mysqladmin.cc
$ vim mysql-5.6.13/client/mysqladmin.cc

はい。
頭の方から、GPLv2のライセンス表記(1~16), 各種変数の定義(35~68)くらい眺めておくと良いかも知れません。72~92に関数の定義があるのは、MySQL同梱のクライアントは個別にヘッダーファイルが作られていないからです。
98行目からcommandsとcommand_namesが定義されていて、command_namesが引数から受け取るコマンド、commandsがそれを内部で参照するときのマップです。まあ名前見れば何にマップされてるか判りますね。

124行目からのmy_long_optionsが受け取れるオプションを入れた構造体です。自分でオプション作る時にはここにも追加します。my_option構造体のプロトタイプはinclude/my_getopt.hに入っていますので、パラメータがよく判らない時は見ますが、似ている引数のやつをコピペしてテキトーに直せば動きます。

1つ飛ばして312行目からがmain関数です。322行目~343行目あたりでオプションを解釈してopt_*変数に突っ込み、350行目からmysql_option関数を使ってMySQLへのコネクション構造体(mysql)にオプションとして設定していきます。397行目までそんな感じです。

399行目、sql_connectでついにMySQLに接続しに行きます。400~422行目はMySQLへの接続に失敗した時の処理で、渡されたコマンドがpingだけなら接続エラーであっても0を返すような処理(エラーコードが返ってくる= mysqldは生きている、だから)が入ってます。

434行目からが接続に成功した時の処理で、先日の-iオプションとかついてる時はここをループします。438行目のexecute_commandsが実際に接続してゴニョゴニョしているところです。execute_commands関数は623行目から定義されています。

あとは丁寧に見ていけばいけると思います。
SQLにマッピングされているコマンドはsprintfでbuffにSQLを突っ込んでmysql_queryでクエリーとして投げる、マッピングされてないpingとかshutdownに関しては、libmysql/libmysql.cに定義された関数を呼んで処理しています。

これでみんなmysqladminのforkが作れますね!
Have fun!!

0 件のコメント :

コメントを投稿