1 #ifndef   PHP_TNT_PROTO_H
2 #define   PHP_TNT_PROTO_H
3 
4 #define SALT64_SIZE      44
5 #define SALT_SIZE        64
6 // #define SCRAMBLE_SIZE    20
7 #define GREETING_SIZE    128
8 #define SALT_PREFIX_SIZE 64
9 
10 #define GREETING_PROTOCOL_LEN_MAX 32
11 
12 #define SPACE_SPACE 281
13 #define SPACE_INDEX 289
14 
15 #define INDEX_SPACE_NAME    2
16 #define INDEX_INDEX_NAME    2
17 
18 #include <stdint.h>
19 
20 #include <php_tarantool.h>
21 
22 /**
23  * Pack version into uint32_t.
24  * The highest byte or result means major version, next - minor,
25  * middle - patch, last - revision.
26  */
27 static inline uint32_t
version_id(unsigned major,unsigned minor,unsigned patch)28 version_id(unsigned major, unsigned minor, unsigned patch)
29 {
30 	return (((major << 8) | minor) << 8) | patch;
31 }
32 
33 static inline unsigned
version_id_major(uint32_t version_id)34 version_id_major(uint32_t version_id)
35 {
36 	return (version_id >> 16) & 0xff;
37 }
38 
39 static inline unsigned
version_id_minor(uint32_t version_id)40 version_id_minor(uint32_t version_id)
41 {
42 	return (version_id >> 8) & 0xff;
43 }
44 
45 static inline unsigned
version_id_patch(uint32_t version_id)46 version_id_patch(uint32_t version_id)
47 {
48 	return version_id & 0xff;
49 }
50 
51 
52 /* header */
53 enum tnt_header_key_t {
54 	TNT_CODE      = 0x00,
55 	TNT_SYNC      = 0x01,
56 	TNT_SCHEMA_ID = 0x05
57 };
58 
59 /* request body */
60 enum tnt_body_key_t {
61 	TNT_SPACE      = 0x10,
62 	TNT_INDEX      = 0x11,
63 	TNT_LIMIT      = 0x12,
64 	TNT_OFFSET     = 0x13,
65 	TNT_ITERATOR   = 0x14,
66 	TNT_KEY        = 0x20,
67 	TNT_TUPLE      = 0x21,
68 	TNT_FUNCTION   = 0x22,
69 	TNT_USERNAME   = 0x23,
70 	TNT_EXPRESSION = 0x27,
71 	TNT_OPS        = 0x28
72 };
73 
74 /* response body */
75 enum tnt_response_key_t {
76 	TNT_DATA  = 0x30,
77 	TNT_ERROR = 0x31
78 };
79 
80 /* request types */
81 enum tnt_request_type {
82 	TNT_OK      = 0x00,
83 	TNT_SELECT  = 0x01,
84 	TNT_INSERT  = 0x02,
85 	TNT_REPLACE = 0x03,
86 	TNT_UPDATE  = 0x04,
87 	TNT_DELETE  = 0x05,
88 	TNT_CALL    = 0x06,
89 	TNT_AUTH    = 0x07,
90 	TNT_EVAL    = 0x08,
91 	TNT_UPSERT  = 0x09,
92 	TNT_PING    = 0x40
93 };
94 
95 enum tnt_iterator_type {
96 	ITERATOR_EQ                 = 0,
97 	ITERATOR_REQ                = 1,
98 	ITERATOR_ALL                = 2,
99 	ITERATOR_LT                 = 3,
100 	ITERATOR_LE                 = 4,
101 	ITERATOR_GE                 = 5,
102 	ITERATOR_GT                 = 6,
103 	ITERATOR_BITS_ALL_SET       = 7,
104 	ITERATOR_BITSET_ALL_SET     = 7,
105 	ITERATOR_BITS_ANY_SET       = 8,
106 	ITERATOR_BITSET_ANY_SET     = 8,
107 	ITERATOR_BITS_ALL_NOT_SET   = 9,
108 	ITERATOR_BITSET_ALL_NOT_SET = 9,
109 	ITERATOR_OVERLAPS           = 10,
110 	ITERATOR_NEIGHBOR           = 11,
111 };
112 
113 struct tnt_response {
114 	uint64_t    bitmap;
115 	const char *buf;
116 	uint32_t    code;
117 	uint32_t    sync;
118 	const char *error;
119 	size_t      error_len;
120 	const char *data;
121 	size_t      data_len;
122 };
123 
124 int64_t php_tp_response(struct tnt_response *r, char *buf, size_t size);
125 
126 void php_tp_encode_auth(smart_string *str, uint32_t sync, char * const username,
127 			size_t username_len, char * const scramble);
128 void php_tp_encode_ping(smart_string *str, uint32_t sync);
129 void php_tp_encode_select(smart_string *str, uint32_t sync, uint32_t space_no,
130 			  uint32_t index_no, uint32_t limit, uint32_t offset,
131 			  uint32_t iterator, zval *key);
132 void php_tp_encode_insert_or_replace(smart_string *str, uint32_t sync,
133 				     uint32_t space_no, zval *tuple,
134 				     uint32_t type);
135 void php_tp_encode_delete(smart_string *str, uint32_t sync, uint32_t space_no,
136 			  uint32_t index_no, zval *tuple);
137 void php_tp_encode_call(smart_string *str, uint32_t sync, char *proc,
138 			uint32_t proc_len, zval *tuple);
139 void php_tp_encode_eval(smart_string *str, uint32_t sync, char *proc,
140 			uint32_t proc_len, zval *tuple);
141 
142 char *php_tp_encode_update(smart_string *str, uint32_t sync,
143 			   uint32_t space_no, uint32_t index_no,
144 			   zval *key);
145 char *php_tp_encode_upsert(smart_string *str, uint32_t sync,
146 			   uint32_t space_no, zval *tuple);
147 void php_tp_encode_uheader(smart_string *str, size_t op_count);
148 void php_tp_encode_uother(smart_string *str, char type, uint32_t fieldno,
149 			  zval *value);
150 void php_tp_encode_usplice(smart_string *str, uint32_t fieldno,
151 			   uint32_t position, uint32_t offset,
152 			   const char *buffer, size_t buffer_len);
153 void php_tp_reencode_length(smart_string *str, size_t orig_len);
154 
155 int convert_iter_str(const char *i, size_t i_len);
156 
157 uint32_t php_tp_verify_greetings(char *greetingbuf);
158 
159 #endif /* PHP_TNT_PROTO_H */
160