9.1. GQTP¶
GQTPはGroonga Query Transfer Protocolの頭文字です。GQTPはgroonga用の独自プロトコルです。
9.1.1. プロトコル¶
GQTPはステートフルなクライアント・サーバーモデルのプロトコルです。以下の流れが1つの処理単位です:
クライアントがリクエストを送る
サーバーがリクエストを受け取る
サーバーがリクエストを処理する
サーバーがレスポンスを返す
クライアントがレスポンスを受け取る
1つのセッション内で0個以上の処理単位を実行できます。
リクエストもレスポンスもGQTPヘッダーとボディから成ります。GQTPヘッダーは固定長のデータです。ボディは可変長サイズのデータです。ボディのサイズはGQTPヘッダーの中に入っています。GQTPではボディの中身については何も定義しません。
9.1.1.1. GQTPヘッダー¶
GQTPヘッダーは以下の符号なし整数値から成ります:
名前 |
サイズ |
説明 |
---|---|---|
protocol | 1byte | プロトコルの種類。 |
query_type | 1byte | ボディのコンテントタイプ。 |
key_length | 2byte | 未使用。 |
level | 1byte | 未使用。 |
flags | 1byte | フラグ。 |
status | 2byte | リターンコード。 |
size | 4byte | ボディのサイズ。 |
opaque | 4byte | 未使用。 |
cas | 8byte | 未使用。 |
ヘッダーのすべての値はネットワークバイトオーダーを使っています。
以下のセクションではそれぞれのヘッダーの値で利用可能な値について説明します。
GQTPヘッダーは全部で24byteになります。
9.1.1.1.1. protocol¶
リクエストのGQTPヘッダーでもレスポンスのGQTPヘッダーでも、この値は常に 0xc7 になります。
9.1.1.1.2. query_type¶
この値は以下のいずれかの値です:
名前 |
値 |
説明 |
---|---|---|
NONE | 0 | 自由形式。 |
TSV | 1 | 値をタブで区切った形式。 |
JSON | 2 | JSON。 |
XML | 3 | XML。 |
MSGPACK | 4 | MessagePack。 |
リクエストGQTPヘッダーでは使われません。
レスポンスGQTPヘッダーで使われます。ボディは指定した形式にします。
9.1.1.1.3. flags¶
この値は以下の値をビット単位ORしたものになります:
名前 |
値 |
説明 |
---|---|---|
MORE | 0x01 | まだデータがあります。 |
TAIL | 0x02 | これ以上データはありません。 |
HEAD | 0x04 | 未使用。 |
QUIET | 0x08 | レスポンスを出力しません。 |
QUIT | 0x10 | 終了します。 |
MORE あるいは TAIL フラグは必ず指定しないといけません。
MORE フラグを使うときは QUIET フラグも使うべきです。リクエストが途中のときはレスポンスを出力する必要がないからです。
セッションを終了するときは QUIT フラグを使ってください。
9.1.1.1.4. status¶
利用可能な値です。将来的に新しいステータスが追加される可能性があります。
- 0: SUCCESS
- 1: END_OF_DATA
- 65535: UNKNOWN_ERROR
- 65534: OPERATION_NOT_PERMITTED
- 65533: NO_SUCH_FILE_OR_DIRECTORY
- 65532: NO_SUCH_PROCESS
- 65531: INTERRUPTED_FUNCTION_CALL
- 65530: INPUT_OUTPUT_ERROR
- 65529: NO_SUCH_DEVICE_OR_ADDRESS
- 65528: ARG_LIST_TOO_LONG
- 65527: EXEC_FORMAT_ERROR
- 65526: BAD_FILE_DESCRIPTOR
- 65525: NO_CHILD_PROCESSES
- 65524: RESOURCE_TEMPORARILY_UNAVAILABLE
- 65523: NOT_ENOUGH_SPACE
- 65522: PERMISSION_DENIED
- 65521: BAD_ADDRESS
- 65520: RESOURCE_BUSY
- 65519: FILE_EXISTS
- 65518: IMPROPER_LINK
- 65517: NO_SUCH_DEVICE
- 65516: NOT_A_DIRECTORY
- 65515: IS_A_DIRECTORY
- 65514: INVALID_ARGUMENT
- 65513: TOO_MANY_OPEN_FILES_IN_SYSTEM
- 65512: TOO_MANY_OPEN_FILES
- 65511: INAPPROPRIATE_I_O_CONTROL_OPERATION
- 65510: FILE_TOO_LARGE
- 65509: NO_SPACE_LEFT_ON_DEVICE
- 65508: INVALID_SEEK
- 65507: READ_ONLY_FILE_SYSTEM
- 65506: TOO_MANY_LINKS
- 65505: BROKEN_PIPE
- 65504: DOMAIN_ERROR
- 65503: RESULT_TOO_LARGE
- 65502: RESOURCE_DEADLOCK_AVOIDED
- 65501: NO_MEMORY_AVAILABLE
- 65500: FILENAME_TOO_LONG
- 65499: NO_LOCKS_AVAILABLE
- 65498: FUNCTION_NOT_IMPLEMENTED
- 65497: DIRECTORY_NOT_EMPTY
- 65496: ILLEGAL_BYTE_SEQUENCE
- 65495: SOCKET_NOT_INITIALIZED
- 65494: OPERATION_WOULD_BLOCK
- 65493: ADDRESS_IS_NOT_AVAILABLE
- 65492: NETWORK_IS_DOWN
- 65491: NO_BUFFER
- 65490: SOCKET_IS_ALREADY_CONNECTED
- 65489: SOCKET_IS_NOT_CONNECTED
- 65488: SOCKET_IS_ALREADY_SHUTDOWNED
- 65487: OPERATION_TIMEOUT
- 65486: CONNECTION_REFUSED
- 65485: RANGE_ERROR
- 65484: TOKENIZER_ERROR
- 65483: FILE_CORRUPT
- 65482: INVALID_FORMAT
- 65481: OBJECT_CORRUPT
- 65480: TOO_MANY_SYMBOLIC_LINKS
- 65479: NOT_SOCKET
- 65478: OPERATION_NOT_SUPPORTED
- 65477: ADDRESS_IS_IN_USE
- 65476: ZLIB_ERROR
- 65475: LZO_ERROR
- 65474: STACK_OVER_FLOW
- 65473: SYNTAX_ERROR
- 65472: RETRY_MAX
- 65471: INCOMPATIBLE_FILE_FORMAT
- 65470: UPDATE_NOT_ALLOWED
- 65469: TOO_SMALL_OFFSET
- 65468: TOO_LARGE_OFFSET
- 65467: TOO_SMALL_LIMIT
- 65466: CAS_ERROR
- 65465: UNSUPPORTED_COMMAND_VERSION
9.1.1.1.5. size¶
ボディのサイズです。ボディの最大サイズは4GiBです。これは size が4byteの符号なし整数だからです。4GiB以上のサイズのデータを送りたい場合は MORE フラグを使ってください。
9.1.2. 例¶
TODO
9.1.3. 参照¶
TODO