---------------------------------------------------------------------------- handlersocketの通信プロトコル ---------------------------------------------------------------------------- 基本的な構文 ・HandlerSocketのプロトコルは行ベース。各行は改行文字(0x0a)で終わる。 ・各行は複数のトークンからなり、トークン間はTAB文字(0x09)で区切られる。 ・トークンはNULLトークンか、文字列トークンのいずれか。 ・NULLトークンは単一のNUL文字(0x00)であらわされる。 ・文字列トークンは、0バイト以上の文字列であらわされる。ただし0x10未満の文字 については0x01を前置し、0x40を加えたコードであらわされる。それ以外の文字は その文字自身のコードであらわされる。 ---------------------------------------------------------------------------- リクエストとレスポンス ・HandlerSocketのプロトコルは単純なリクエスト・レスポンスプロトコルになって いる。接続が確立した後は、まずクライアントがリクエストを送る。 ・サーバは、クライアントが送ったリクエストと丁度同じ数の行(レスポンス)を返 す。 ・リクエストはパイプライン化してよい。つまりクライアントは前に送ったリクエス トに対する返事(レスポンス)を待たずに次のリクエストを送ってもよい。 ---------------------------------------------------------------------------- インデックスを開く open_index命令は次のような構文を持つ。 P [] - は数字で、同一接続上で後に実行する命令の、対象索引を指定するため に使われる。 - , , は文字列で、それぞれDB名、テーブル名、 索引の名前を指定する。として「PRIMARY」を指定するとプライマリ キーが開かれる。 - はカンマ区切りの列名のリスト。 - はカンマ区切りの列名のリスト。これは省略することができる。 このopen_index命令が実行されると、HandlerSocketプラグインは指定されたDB、 テーブル、索引を開く。開かれた索引は接続が閉じられるまで開かれたままになる。 開かれた索引はの数字で識別される。もし既にに指定された番号 の索引が既に開かれている場合は古いほうが閉じられる。このはなるべく 小さな数字を使ったほうが効率が良い。 ---------------------------------------------------------------------------- データ取得 find命令は次のような構文を持つ。 ... [LIM] [IN] [FILTER ...] LIMは次のようなパラメータの並び INは次のようなパラメータの並び @ ... FILTERは次のようなパラメータの並び - は数字で、これは同じ接続上で過去に実行したopen_index命令に指定さ れた数字でなければならない。 - は比較演算子で、現在のバージョンでは '=', '>', '>=', '<', '<=' をサ ポートしている。 - は後に続くパラメータ ... の長さ。この値は対応するopen_index 命令のパラメータで指定された索引のキー列の数と同じか小さいもの でなければならない。 - ... は取得するべきキーの値を指定するパラメータ。 - LIMは省略できる。は数字で、これはSQLのLIMITと同じように はたらく。省略した場合は1と0を指定した場合と同じ動作をする。FILTERによっ て読み飛ばされたレコードはにカウントされない。 - INは省略できる。指定されると、これはSQLの WHERE ... IN のように動作する。 は対応するopen_index命令のパラメータで指定された索引の キー列の数より小さいものでなければならない。INが指定されたときは、find命 令の ... のうち番目の値は無視される。 - FILTERは省略できる。これは行取得の際のフィルタを指定する。は 'F'(filter)か'W'(while)のいずれかでなければならない。は比較演算子。 は数字で、これは対応するopen_index命令ので指定された列の 数より小さいものでなければならない。複数のフィルタを指定することもでき、 その場合は各フィルタのANDと解釈される。'F'と'W'の違いは、条件にあてはま らない行があったときに'F'は単にそれをスキップするが、'W'はその時点でルー プを抜けるという点。 ---------------------------------------------------------------------------- 更新と削除 find_modify命令は次のような構文を持つ。 ... [LIM] [IN] [FILTER ...] MOD MODは次のようなパラメータの並び ... - は'U', '+', '-', 'D', 'U?', '+?', '-?', 'D?'のいずれか。'?'が付いた ものは付いていないものとほぼ同じ動作をするが、付いていないものがレスポン スとして更新された行の数を返すのに対し、付いているものは更新される前の行 の内容を返す点のみが異なる。'U'は更新、'D'は削除、'+'はインクリメント、 '-'はデクリメントを実行する。 - ... はセットされる各列の値。 ... の長さは対応する open_index命令のの長さと等しいか小さくなければならない。が 'D'のときはこれらのパラメータは無視される。が'+'か'-'のときは、これら の値は数値でなければならない。が'-'で、それが負数から正数、または正数 から負数へ列の値を変更するようなものであった場合は、値は変更されない。 ---------------------------------------------------------------------------- 行の挿入 insert命令は次のような構文を持つ。 + ... - は後に続くパラメータ ... の長さ。これは対応するopen_indexの の長さに等しいか小さくなければならない。 - ... はセットされる各列の値。指定されないかった列についてはその列 のデフォルト値がセットされる。 ---------------------------------------------------------------------------- 認証 auth命令は次のような構文を持つ。 A - は現在のバージョンでは'1'のみが有効。 - 指定されたが、サーバの設定の'handlersocket_plain_secret'や 'handlersocket_plain_secret_wr'に指定された文字列と一致した場合にのみ認証 は成功する。 - HandlerSocketの認証が有効になっているときは、この'auth'が成功しない限りそ れ以外の命令は全て失敗する。 ---------------------------------------------------------------------------- open_indexに対するレスポンス open_index命令が成功したとき、レスポンスは次の構文を持つ。 0 1 ---------------------------------------------------------------------------- findに対するレスポンス find命令が成功したとき、レスポンスは次の構文を持つ。 0 ... - はfind命令の対応するopen_index命令に指定したの長さに 一致する。 - ... は結果セット。もしN行がfind命令で見つかったなら、 ... の長さは ( * N )になる。 ---------------------------------------------------------------------------- find_modifyに対するレスポンス find_modify命令が成功したとき、レスポンスは次の構文を持つ。 0 1 - は変更された行の数。 - 例外として、が'?'の付いたものであった場合には、find命令に対するレスポ ンスと同じ構文のレスポンスを返す。 ---------------------------------------------------------------------------- insertに対するレスポンス insert命令が成功したとき、レスポンスは次の構文を持つ。 0 1 ---------------------------------------------------------------------------- authに対するレスポンス auth命令が成功したとき、レスポンスは次の構文を持つ。 0 1