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