summaryrefslogtreecommitdiffstats
path: root/plugin/handler_socket/docs-ja/protocol.ja.txt
blob: 46cc9932e60fb87cd2305093b77ef50e68f6944f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
----------------------------------------------------------------------------
handlersocketの通信プロトコル

----------------------------------------------------------------------------
基本的な構文

・HandlerSocketのプロトコルは行ベース。各行は改行文字(0x0a)で終わる。
・各行は複数のトークンからなり、トークン間はTAB文字(0x09)で区切られる。
・トークンはNULLトークンか、文字列トークンのいずれか。
・NULLトークンは単一のNUL文字(0x00)であらわされる。
・文字列トークンは、0バイト以上の文字列であらわされる。ただし0x10未満の文字
  については0x01を前置し、0x40を加えたコードであらわされる。それ以外の文字は
  その文字自身のコードであらわされる。

----------------------------------------------------------------------------
リクエストとレスポンス

・HandlerSocketのプロトコルは単純なリクエスト・レスポンスプロトコルになって
  いる。接続が確立した後は、まずクライアントがリクエストを送る。
・サーバは、クライアントが送ったリクエストと丁度同じ数の行(レスポンス)を返
  す。
・リクエストはパイプライン化してよい。つまりクライアントは前に送ったリクエス
  トに対する返事(レスポンス)を待たずに次のリクエストを送ってもよい。

----------------------------------------------------------------------------
インデックスを開く

open_index命令は次のような構文を持つ。

    P <indexid> <dbname> <tablename> <indexname> <columns> [<fcolumns>]

- <indexid>は数字で、同一接続上で後に実行する命令の、対象索引を指定するため
  に使われる。
- <dbname>, <tablename>, <indexname>は文字列で、それぞれDB名、テーブル名、
  索引の名前を指定する。<indexname>として「PRIMARY」を指定するとプライマリ
  キーが開かれる。
- <columns>はカンマ区切りの列名のリスト。
- <fcolumns>はカンマ区切りの列名のリスト。これは省略することができる。

このopen_index命令が実行されると、HandlerSocketプラグインは指定されたDB、
テーブル、索引を開く。開かれた索引は接続が閉じられるまで開かれたままになる。
開かれた索引は<indexid>の数字で識別される。もし既に<indexid>に指定された番号
の索引が既に開かれている場合は古いほうが閉じられる。この<indexid>はなるべく
小さな数字を使ったほうが効率が良い。

----------------------------------------------------------------------------
データ取得

find命令は次のような構文を持つ。

    <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...]

LIMは次のようなパラメータの並び

    <limit> <offset>

INは次のようなパラメータの並び

    @ <icol> <ivlen> <iv1> ... <ivn>

FILTERは次のようなパラメータの並び

    <ftyp> <fop> <fcol> <fval>

- <indexid>は数字で、これは同じ接続上で過去に実行したopen_index命令に指定さ
  れた数字でなければならない。
- <op>は比較演算子で、現在のバージョンでは '=', '>', '>=', '<', '<=' をサ
  ポートしている。
- <vlen>は後に続くパラメータ<v1> ... <vn>の長さ。この値は対応するopen_index
  命令の<indexname>パラメータで指定された索引のキー列の数と同じか小さいもの
  でなければならない。
- <v1> ... <vn>は取得するべきキーの値を指定するパラメータ。
- LIMは省略できる。<limit>と<offset>は数字で、これはSQLのLIMITと同じように
  はたらく。省略した場合は1と0を指定した場合と同じ動作をする。FILTERによっ
  て読み飛ばされたレコードは<limit>と<offset>にカウントされない。
- INは省略できる。指定されると、これはSQLの WHERE ... IN のように動作する。
  <icol>は対応するopen_index命令の<indexname>パラメータで指定された索引の
  キー列の数より小さいものでなければならない。INが指定されたときは、find命
  令の<v1> ... <vn>のうち<icol>番目の値は無視される。
- FILTERは省略できる。これは行取得の際のフィルタを指定する。<ftyp>は
  'F'(filter)か'W'(while)のいずれかでなければならない。<fop>は比較演算子。
  <fcol>は数字で、これは対応するopen_index命令の<fcolumns>で指定された列の
  数より小さいものでなければならない。複数のフィルタを指定することもでき、
  その場合は各フィルタのANDと解釈される。'F'と'W'の違いは、条件にあてはま
  らない行があったときに'F'は単にそれをスキップするが、'W'はその時点でルー
  プを抜けるという点。

----------------------------------------------------------------------------
更新と削除

find_modify命令は次のような構文を持つ。

    <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...] MOD

MODは次のようなパラメータの並び

    <mop> <m1> ... <mk>

- <mop>は'U', '+', '-', 'D', 'U?', '+?', '-?', 'D?'のいずれか。'?'が付いた
  ものは付いていないものとほぼ同じ動作をするが、付いていないものがレスポン
  スとして更新された行の数を返すのに対し、付いているものは更新される前の行
  の内容を返す点のみが異なる。'U'は更新、'D'は削除、'+'はインクリメント、
  '-'はデクリメントを実行する。
- <m1> ... <mk>はセットされる各列の値。<m1> ... <mk>の長さは対応する
  open_index命令の<columns>の長さと等しいか小さくなければならない。<mop>が
  'D'のときはこれらのパラメータは無視される。<mop>が'+'か'-'のときは、これら
  の値は数値でなければならない。<mop>が'-'で、それが負数から正数、または正数
  から負数へ列の値を変更するようなものであった場合は、値は変更されない。

----------------------------------------------------------------------------
行の挿入

insert命令は次のような構文を持つ。

    <indexid> + <vlen> <v1> ... <vn>

- <vlen>は後に続くパラメータ<v1> ... <vn>の長さ。これは対応するopen_indexの
  <columns>の長さに等しいか小さくなければならない。
- <v1> ... <vn>はセットされる各列の値。指定されないかった列についてはその列
  のデフォルト値がセットされる。

----------------------------------------------------------------------------
認証

auth命令は次のような構文を持つ。

    A <atyp> <akey>

- <atyp>は現在のバージョンでは'1'のみが有効。
- 指定された<akey>が、サーバの設定の'handlersocket_plain_secret'や
  'handlersocket_plain_secret_wr'に指定された文字列と一致した場合にのみ認証
  は成功する。
- HandlerSocketの認証が有効になっているときは、この'auth'が成功しない限りそ
  れ以外の命令は全て失敗する。

----------------------------------------------------------------------------
open_indexに対するレスポンス

open_index命令が成功したとき、レスポンスは次の構文を持つ。

    0 1

----------------------------------------------------------------------------
findに対するレスポンス

find命令が成功したとき、レスポンスは次の構文を持つ。

    0 <numcolumns> <r1> ... <rn>

- <numcolumns>はfind命令の対応するopen_index命令に指定した<columns>の長さに
  一致する。
- <r1> ... <rn>は結果セット。もしN行がfind命令で見つかったなら、<r1> ...
  <rn>の長さは ( <numcolumns> * N )になる。

----------------------------------------------------------------------------
find_modifyに対するレスポンス

find_modify命令が成功したとき、レスポンスは次の構文を持つ。

    0 1 <nummod>

- <nummod>は変更された行の数。
- 例外として、<mop>が'?'の付いたものであった場合には、find命令に対するレスポ
  ンスと同じ構文のレスポンスを返す。

----------------------------------------------------------------------------
insertに対するレスポンス

insert命令が成功したとき、レスポンスは次の構文を持つ。

    0 1

----------------------------------------------------------------------------
authに対するレスポンス

auth命令が成功したとき、レスポンスは次の構文を持つ。

    0 1