MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
protocol_binary.h
1 /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /*
3  * Copyright (c) <2008>, Sun Microsystems, Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  * * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * * Neither the name of the nor the
14  * names of its contributors may be used to endorse or promote products
15  * derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY SUN MICROSYSTEMS, INC. ``AS IS'' AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 /*
29  * Summary: Constants used by to implement the binary protocol.
30  *
31  * Copy: See Copyright for the status of this software.
32  *
33  * Author: Trond Norbye <trond.norbye@sun.com>
34  */
35 
36 #ifndef PROTOCOL_BINARY_H
37 #define PROTOCOL_BINARY_H
38 
39 #include <stdint.h>
40 #include <memcached/vbucket.h>
41 
53 #ifdef __cplusplus
54 extern "C"
55 {
56 #endif
57 
62  typedef enum {
63  PROTOCOL_BINARY_REQ = 0x80,
64  PROTOCOL_BINARY_RES = 0x81
66 
71  typedef enum {
72  PROTOCOL_BINARY_RESPONSE_SUCCESS = 0x00,
73  PROTOCOL_BINARY_RESPONSE_KEY_ENOENT = 0x01,
74  PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS = 0x02,
75  PROTOCOL_BINARY_RESPONSE_E2BIG = 0x03,
76  PROTOCOL_BINARY_RESPONSE_EINVAL = 0x04,
77  PROTOCOL_BINARY_RESPONSE_NOT_STORED = 0x05,
78  PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL = 0x06,
79  PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET = 0x07,
80  PROTOCOL_BINARY_RESPONSE_AUTH_ERROR = 0x20,
81  PROTOCOL_BINARY_RESPONSE_AUTH_CONTINUE = 0x21,
82  PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND = 0x81,
83  PROTOCOL_BINARY_RESPONSE_ENOMEM = 0x82,
84  PROTOCOL_BINARY_RESPONSE_NOT_SUPPORTED = 0x83,
85  PROTOCOL_BINARY_RESPONSE_EINTERNAL = 0x84,
86  PROTOCOL_BINARY_RESPONSE_EBUSY = 0x85,
87  PROTOCOL_BINARY_RESPONSE_ETMPFAIL = 0x86
89 
94  typedef enum {
95  PROTOCOL_BINARY_CMD_GET = 0x00,
96  PROTOCOL_BINARY_CMD_SET = 0x01,
97  PROTOCOL_BINARY_CMD_ADD = 0x02,
98  PROTOCOL_BINARY_CMD_REPLACE = 0x03,
99  PROTOCOL_BINARY_CMD_DELETE = 0x04,
100  PROTOCOL_BINARY_CMD_INCREMENT = 0x05,
101  PROTOCOL_BINARY_CMD_DECREMENT = 0x06,
102  PROTOCOL_BINARY_CMD_QUIT = 0x07,
103  PROTOCOL_BINARY_CMD_FLUSH = 0x08,
104  PROTOCOL_BINARY_CMD_GETQ = 0x09,
105  PROTOCOL_BINARY_CMD_NOOP = 0x0a,
106  PROTOCOL_BINARY_CMD_VERSION = 0x0b,
107  PROTOCOL_BINARY_CMD_GETK = 0x0c,
108  PROTOCOL_BINARY_CMD_GETKQ = 0x0d,
109  PROTOCOL_BINARY_CMD_APPEND = 0x0e,
110  PROTOCOL_BINARY_CMD_PREPEND = 0x0f,
111  PROTOCOL_BINARY_CMD_STAT = 0x10,
112  PROTOCOL_BINARY_CMD_SETQ = 0x11,
113  PROTOCOL_BINARY_CMD_ADDQ = 0x12,
114  PROTOCOL_BINARY_CMD_REPLACEQ = 0x13,
115  PROTOCOL_BINARY_CMD_DELETEQ = 0x14,
116  PROTOCOL_BINARY_CMD_INCREMENTQ = 0x15,
117  PROTOCOL_BINARY_CMD_DECREMENTQ = 0x16,
118  PROTOCOL_BINARY_CMD_QUITQ = 0x17,
119  PROTOCOL_BINARY_CMD_FLUSHQ = 0x18,
120  PROTOCOL_BINARY_CMD_APPENDQ = 0x19,
121  PROTOCOL_BINARY_CMD_PREPENDQ = 0x1a,
122  PROTOCOL_BINARY_CMD_VERBOSITY = 0x1b,
123  PROTOCOL_BINARY_CMD_TOUCH = 0x1c,
124  PROTOCOL_BINARY_CMD_GAT = 0x1d,
125  PROTOCOL_BINARY_CMD_GATQ = 0x1e,
126 
127  PROTOCOL_BINARY_CMD_SASL_LIST_MECHS = 0x20,
128  PROTOCOL_BINARY_CMD_SASL_AUTH = 0x21,
129  PROTOCOL_BINARY_CMD_SASL_STEP = 0x22,
130 
131  /* These commands are used for range operations and exist within
132  * this header for use in other projects. Range operations are
133  * not expected to be implemented in the memcached server itself.
134  */
135  PROTOCOL_BINARY_CMD_RGET = 0x30,
136  PROTOCOL_BINARY_CMD_RSET = 0x31,
137  PROTOCOL_BINARY_CMD_RSETQ = 0x32,
138  PROTOCOL_BINARY_CMD_RAPPEND = 0x33,
139  PROTOCOL_BINARY_CMD_RAPPENDQ = 0x34,
140  PROTOCOL_BINARY_CMD_RPREPEND = 0x35,
141  PROTOCOL_BINARY_CMD_RPREPENDQ = 0x36,
142  PROTOCOL_BINARY_CMD_RDELETE = 0x37,
143  PROTOCOL_BINARY_CMD_RDELETEQ = 0x38,
144  PROTOCOL_BINARY_CMD_RINCR = 0x39,
145  PROTOCOL_BINARY_CMD_RINCRQ = 0x3a,
146  PROTOCOL_BINARY_CMD_RDECR = 0x3b,
147  PROTOCOL_BINARY_CMD_RDECRQ = 0x3c,
148  /* End Range operations */
149 
150  /* VBucket commands */
151  PROTOCOL_BINARY_CMD_SET_VBUCKET = 0x3d,
152  PROTOCOL_BINARY_CMD_GET_VBUCKET = 0x3e,
153  PROTOCOL_BINARY_CMD_DEL_VBUCKET = 0x3f,
154  /* End VBucket commands */
155 
156  /* TAP commands */
157  PROTOCOL_BINARY_CMD_TAP_CONNECT = 0x40,
158  PROTOCOL_BINARY_CMD_TAP_MUTATION = 0x41,
159  PROTOCOL_BINARY_CMD_TAP_DELETE = 0x42,
160  PROTOCOL_BINARY_CMD_TAP_FLUSH = 0x43,
161  PROTOCOL_BINARY_CMD_TAP_OPAQUE = 0x44,
162  PROTOCOL_BINARY_CMD_TAP_VBUCKET_SET = 0x45,
163  PROTOCOL_BINARY_CMD_TAP_CHECKPOINT_START = 0x46,
164  PROTOCOL_BINARY_CMD_TAP_CHECKPOINT_END = 0x47,
165  /* End TAP */
166 
167  PROTOCOL_BINARY_CMD_LAST_RESERVED = 0x8f,
168 
169  /* Scrub the data */
170  PROTOCOL_BINARY_CMD_SCRUB = 0xf0
172 
177  typedef enum {
178  PROTOCOL_BINARY_RAW_BYTES = 0x00
180 
185  typedef union {
186  struct {
187  uint8_t magic;
188  uint8_t opcode;
189  uint16_t keylen;
190  uint8_t extlen;
191  uint8_t datatype;
192  uint16_t vbucket;
193  uint32_t bodylen;
194  uint32_t opaque;
195  uint64_t cas;
196  } request;
197  uint8_t bytes[24];
199 
204  typedef union {
205  struct {
206  uint8_t magic;
207  uint8_t opcode;
208  uint16_t keylen;
209  uint8_t extlen;
210  uint8_t datatype;
211  uint16_t status;
212  uint32_t bodylen;
213  uint32_t opaque;
214  uint64_t cas;
215  } response;
216  uint8_t bytes[24];
218 
222  typedef union {
223  struct {
225  } message;
226  uint8_t bytes[sizeof(protocol_binary_request_header)];
228 
232  typedef union {
233  struct {
235  } message;
236  uint8_t bytes[sizeof(protocol_binary_response_header)];
238 
247 
253  typedef union {
254  struct {
256  struct {
257  uint32_t flags;
258  } body;
259  } message;
260  uint8_t bytes[sizeof(protocol_binary_response_header) + 4];
262 
266 
272 
278 
285  typedef union {
286  struct {
288  struct {
289  uint32_t expiration;
290  } body;
291  } message;
292  uint8_t bytes[sizeof(protocol_binary_request_header) + 4];
294 
300 
305  typedef union {
306  struct {
308  struct {
309  uint32_t flags;
310  uint32_t expiration;
311  } body;
312  } message;
313  uint8_t bytes[sizeof(protocol_binary_request_header) + 8];
317 
325 
331 
337 
343  typedef union {
344  struct {
346  struct {
347  uint64_t delta;
348  uint64_t initial;
349  uint32_t expiration;
350  } body;
351  } message;
352  uint8_t bytes[sizeof(protocol_binary_request_header) + 20];
355 
361  typedef union {
362  struct {
364  struct {
365  uint64_t value;
366  } body;
367  } message;
368  uint8_t bytes[sizeof(protocol_binary_response_header) + 8];
371 
377 
383 
390 
397 
403 
409 
410 
416 
422 
426  typedef union {
427  struct {
429  struct {
430  uint32_t level;
431  } body;
432  } message;
433  uint8_t bytes[sizeof(protocol_binary_request_header) + 4];
435 
440 
444  typedef union {
445  struct {
447  struct {
448  uint32_t expiration;
449  } body;
450  } message;
451  uint8_t bytes[sizeof(protocol_binary_request_header) + 4];
453 
458 
462  typedef union {
463  struct {
465  struct {
466  uint32_t expiration;
467  } body;
468  } message;
469  uint8_t bytes[sizeof(protocol_binary_request_header) + 4];
471 
473 
479 
480 
489  typedef union {
490  struct {
492  struct {
493  uint16_t size;
494  uint8_t reserved;
495  uint8_t flags;
496  uint32_t max_results;
497  } body;
498  } message;
499  uint8_t bytes[sizeof(protocol_binary_request_header) + 4];
501 
515 
516 
523  typedef union {
524  struct {
526  struct {
540  uint32_t flags;
541 
555 #define TAP_CONNECT_FLAG_BACKFILL 0x01
556 
561 #define TAP_CONNECT_FLAG_DUMP 0x02
562 
568 #define TAP_CONNECT_FLAG_LIST_VBUCKETS 0x04
569 
573 #define TAP_CONNECT_FLAG_TAKEOVER_VBUCKETS 0x08
574 
577 #define TAP_CONNECT_SUPPORT_ACK 0x10
578 
584 #define TAP_CONNECT_REQUEST_KEYS_ONLY 0x20
585 
591 #define TAP_CONNECT_CHECKPOINT 0x40
592 
596 #define TAP_CONNECT_REGISTERED_CLIENT 0x80
597  } body;
598  } message;
599  uint8_t bytes[sizeof(protocol_binary_request_header) + 4];
601 
602  typedef union {
603  struct {
605  struct {
606  struct {
607  uint16_t enginespecific_length;
608  /*
609  * The flag section support the following flags
610  */
616 #define TAP_FLAG_ACK 0x01
617 
620 #define TAP_FLAG_NO_VALUE 0x02
621  uint16_t flags;
622  uint8_t ttl;
623  uint8_t res1;
624  uint8_t res2;
625  uint8_t res3;
626  } tap;
627  struct {
628  uint32_t flags;
629  uint32_t expiration;
630  } item;
631  } body;
632  } message;
633  uint8_t bytes[sizeof(protocol_binary_request_header) + 16];
635 
636  typedef union {
637  struct {
639  struct {
640  struct {
641  uint16_t enginespecific_length;
647  uint16_t flags;
648  uint8_t ttl;
649  uint8_t res1;
650  uint8_t res2;
651  uint8_t res3;
652  } tap;
653  } body;
654  } message;
655  uint8_t bytes[sizeof(protocol_binary_request_header) + 8];
657 
662 
663 
668 
673 
674 
678  typedef union {
679  struct {
681  struct {
682  vbucket_state_t state;
683  } body;
684  } message;
685  uint8_t bytes[sizeof(protocol_binary_request_header) + sizeof(vbucket_state_t)];
699 
704 
708  typedef union {
709  struct {
711  struct {
712  vbucket_state_t state;
713  } body;
714  } message;
715  uint8_t bytes[sizeof(protocol_binary_response_header) + sizeof(vbucket_state_t)];
717 
718 
723 #ifdef __cplusplus
724 }
725 #endif
726 #endif /* PROTOCOL_BINARY_H */