summaryrefslogtreecommitdiff
path: root/plugin/handler_socket/docs-en/protocol.en.txt
blob: ee00ab352d8b8882ea369bb80a4634f3a57ead09 (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

----------------------------------------------------------------------------
The HandlerSocket protocol

----------------------------------------------------------------------------
Basic syntax

- The HandlerSocket protocol is line-based. Each line ends with LF(0x0a).
- Each line consists a concatenation of tokens separated by HT(0x09).
- A token is either NULL or an encoded string. Note that you need to
  distinguish NULL from an empty string, as most DBMs does so.
- NULL is expressed as a single NUL(0x00).
- An encoded string is a string with the following encoding rules.
  	- Characters in the range [0x10 - 0xff] are not encoded.
	- A character in the range [0x00 - 0x0f] is prefixed by 0x01 and
	  shifted by 0x40. For example, 0x03 is encoded as 0x01 0x43.
- Note that a string can be empty. A continuation of 0x09 0x09 means that
  there is an empty string between them. A continuation of 0x09 0x0a means
  that there is an empty string at the end of the line.

----------------------------------------------------------------------------
Request and Response

- The HandlerSocket protocol is a simple request/response protocol. After a
  connection is established, the client side sends a request, and then the
  server side sends a response.
- A request/response consists of a single line.
- Requests can be pipelined; That is, you can send multiple requests (ie.
  lines) at one time, and receive responses for them at one time.

----------------------------------------------------------------------------
'open_index' request

The 'open_index' request has the following syntax.

    P <indexid> <dbname> <tablename> <indexname> <columns>

- <indexid> is a number in decimal.
- <dbname>, <tablename>, and <indexname> are strings. To open the primary
  key, use PRIMARY as <indexname>.
- <columns> is a comma-separated list of column names.

Once an 'open_index' request is issued, the HandlerSocket plugin opens the
specified index and keep it open until the client connection is closed. Each
open index is identified by <indexid>. If <indexid> is already open, the old
open index is closed. You can open the same combination of <dbname>
<tablename> <indexname> multple times, possibly with different <columns>.
For efficiency, keep <indexid> small as far as possible.

----------------------------------------------------------------------------
Getting data

The 'find' request has the following syntax.

    <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset>

- <indexid> is a number. This number must be an <indexid> specified by a
  'open_index' request executed previously on the same connection.
- <op> specifies the comparison operation to use. The current version of
  HandlerSocket supports '=', '>', '>=', '<', and '<='.
- <vlen> indicates the length of the trailing parameters <v1> ... <vn>. This
  must be smaller than or equal to the number of index columns specified by
  specified by the corresponding 'open_index' request.
- <v1> ... <vn> specify the index column values to fetch.
- <limit> and <offset> are numbers. These parameters can be omitted. When
  omitted, it works as if 1 and 0 are specified.

----------------------------------------------------------------------------
Updating/Deleting data

The 'find_modify' request has the following syntax.

    <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <mop> <m1> ... <mk>

- <mop> is either 'U' (update) or 'D' (delete).
- <m1> ... <mk> specifies the column values to set. The length of <m1> ...
  <mk> must be smaller than or equal to the length of <columns> specified by
  the corresponding 'open_index' request. If <mop> is 'D', these parameters
  are ignored.

----------------------------------------------------------------------------
Inserting data

The 'insert' request has the following syntax.

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

- <vlen> indicates the length of the trailing parameters <v1> ... <vn>. This
  must be smaller than or equal to the length of <columns> specified by the
  corresponding 'open_index' request.
- <v1> ... <vn> specify the column values to set. For columns not in
  <columns>, the default values for each column are set.

----------------------------------------------------------------------------
Response syntax

HandlerSocket returns a response of the following syntax for each request.

    <errorcode> <numcolumns> <r1> ... <rn>

- <errorcode> indicates whether the request has successfully executed or not.
  '0' means success. Non-zero means an error.
- <numcolumns> indicates the number of columns of the result set.
- <r1> ... <rn> is the result set. The length of <r1> ... <rn> is always a
  multiple of <numcolumns>. It is possible that <r1> ... <rn> is empty.

If <errorcode> is non-zero, <numcolumns> is always 1 and <r1> indicates a
human-readable error message, though sometimes <r1> is not provided.

----------------------------------------------------------------------------
Response for 'open_index'

If 'open_index' is succeeded, HandlerSocket returns a line of the following
syntax.

    0 1

----------------------------------------------------------------------------
Response for 'find'

If 'find' is succeeded, HandlerSocket returns a line of the following
syntax.

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

- <numcolumns> always equals to the length of <columns> of the corresponding
  'open_index' request.
- <r1> ... <rn> is the result set. If N rows are found, the length of <r1>
  ... <rn> becomes ( <numcolumns> * N ).

----------------------------------------------------------------------------
Response for 'find_modify'

If 'find_modify' is succeeded, HandlerSocket returns a line of the following
syntax.

   0 1 <nummod>

- <nummod> is the number of modified rows.

----------------------------------------------------------------------------
Response for 'insert'

If 'insert' is succeeded, HanderSocket returns a line of the following
syntax.

   0 1