Annotation of embedaddon/php/ext/mysqlnd/mysqlnd_wireprotocol.h, revision 1.1.1.3
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.3 ! misho 5: | Copyright (c) 2006-2013 The PHP Group |
1.1 misho 6: +----------------------------------------------------------------------+
7: | This source file is subject to version 3.01 of the PHP license, |
8: | that is bundled with this package in the file LICENSE, and is |
9: | available through the world-wide-web at the following url: |
10: | http://www.php.net/license/3_01.txt |
11: | If you did not receive a copy of the PHP license and are unable to |
12: | obtain it through the world-wide-web, please send a note to |
13: | license@php.net so we can mail you a copy immediately. |
14: +----------------------------------------------------------------------+
1.1.1.2 misho 15: | Authors: Andrey Hristov <andrey@mysql.com> |
1.1 misho 16: | Ulf Wendel <uwendel@mysql.com> |
1.1.1.2 misho 17: | Georg Richter <georg@mysql.com> |
1.1 misho 18: +----------------------------------------------------------------------+
19: */
20:
1.1.1.2 misho 21: /* $Id$ */
1.1 misho 22:
23: #ifndef MYSQLND_WIREPROTOCOL_H
24: #define MYSQLND_WIREPROTOCOL_H
25:
26: #include "mysqlnd_net.h"
27:
28: #define MYSQLND_HEADER_SIZE 4
29: #define COMPRESSED_HEADER_SIZE 3
30:
31: #define MYSQLND_NULL_LENGTH (unsigned long) ~0
32:
33: /* Used in mysqlnd_debug.c */
34: PHPAPI extern const char mysqlnd_read_header_name[];
35: PHPAPI extern const char mysqlnd_read_body_name[];
36:
37:
38: /* Packet handling */
39: #define PACKET_WRITE(packet, conn) ((packet)->header.m->write_to_net((packet), (conn) TSRMLS_CC))
40: #define PACKET_READ(packet, conn) ((packet)->header.m->read_from_net((packet), (conn) TSRMLS_CC))
41: #define PACKET_FREE(packet) \
42: do { \
43: DBG_INF_FMT("PACKET_FREE(%p)", packet); \
44: if ((packet)) { \
45: ((packet)->header.m->free_mem((packet), FALSE TSRMLS_CC)); \
46: } \
47: } while (0);
48:
49: PHPAPI extern const char * const mysqlnd_command_to_text[COM_END];
50:
51: /* Low-level extraction functionality */
52: typedef struct st_mysqlnd_packet_methods {
53: size_t struct_size;
1.1.1.2 misho 54: enum_func_status (*read_from_net)(void * packet, MYSQLND_CONN_DATA * conn TSRMLS_DC);
55: size_t (*write_to_net)(void * packet, MYSQLND_CONN_DATA * conn TSRMLS_DC);
1.1 misho 56: void (*free_mem)(void *packet, zend_bool stack_allocation TSRMLS_DC);
57: } mysqlnd_packet_methods;
58:
59:
60: typedef struct st_mysqlnd_packet_header {
61: size_t size;
62: mysqlnd_packet_methods *m;
63: zend_uchar packet_no;
64: zend_bool persistent;
65: } MYSQLND_PACKET_HEADER;
66:
67: /* Server greets the client */
68: typedef struct st_mysqlnd_packet_greet {
69: MYSQLND_PACKET_HEADER header;
70: uint8_t protocol_version;
71: char *server_version;
72: uint32_t thread_id;
1.1.1.2 misho 73: zend_uchar intern_auth_plugin_data[SCRAMBLE_LENGTH];
74: zend_uchar * auth_plugin_data;
75: size_t auth_plugin_data_len;
1.1 misho 76: /* 1 byte pad */
1.1.1.2 misho 77: uint32_t server_capabilities;
1.1 misho 78: uint8_t charset_no;
79: uint16_t server_status;
1.1.1.2 misho 80: /* 13 byte pad, in 5.5 first 2 bytes are more capabilities followed by 1 byte scramble_length */
1.1 misho 81: zend_bool pre41;
82: /* If error packet, we use these */
83: char error[MYSQLND_ERRMSG_SIZE+1];
84: char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
1.1.1.2 misho 85: unsigned int error_no;
86: char *auth_protocol;
1.1 misho 87: } MYSQLND_PACKET_GREET;
88:
89:
90: /* Client authenticates */
91: typedef struct st_mysqlnd_packet_auth {
92: MYSQLND_PACKET_HEADER header;
93: uint32_t client_flags;
94: uint32_t max_packet_size;
1.1.1.2 misho 95: uint8_t charset_no;
1.1 misho 96: const char *user;
1.1.1.2 misho 97: const zend_uchar *auth_data;
98: size_t auth_data_len;
1.1 misho 99: const char *db;
1.1.1.2 misho 100: const char *auth_plugin_name;
1.1 misho 101: /* Here the packet ends. This is user supplied data */
1.1.1.2 misho 102: size_t db_len;
103: zend_bool send_auth_data;
104: zend_bool is_change_user_packet;
105: zend_bool silent;
106:
1.1 misho 107: } MYSQLND_PACKET_AUTH;
108:
1.1.1.2 misho 109: /* Auth response packet */
110: typedef struct st_mysqlnd_packet_auth_response {
111: MYSQLND_PACKET_HEADER header;
112: uint8_t response_code;
113: uint64_t affected_rows;
114: uint64_t last_insert_id;
115: uint16_t server_status;
116: uint16_t warning_count;
117: char *message;
118: size_t message_len;
119: /* If error packet, we use these */
120: char error[MYSQLND_ERRMSG_SIZE+1];
121: char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
122: unsigned int error_no;
123:
124: char *new_auth_protocol;
125: size_t new_auth_protocol_len;
126: zend_uchar *new_auth_protocol_data;
127: size_t new_auth_protocol_data_len;
128: } MYSQLND_PACKET_AUTH_RESPONSE;
129:
130:
131: /* Auth response packet */
132: typedef struct st_mysqlnd_packet_change_auth_response {
133: MYSQLND_PACKET_HEADER header;
134: const zend_uchar *auth_data;
135: size_t auth_data_len;
136: } MYSQLND_PACKET_CHANGE_AUTH_RESPONSE;
137:
138:
1.1 misho 139: /* OK packet */
140: typedef struct st_mysqlnd_packet_ok {
141: MYSQLND_PACKET_HEADER header;
142: uint8_t field_count; /* always 0x0 */
143: uint64_t affected_rows;
144: uint64_t last_insert_id;
145: uint16_t server_status;
146: uint16_t warning_count;
147: char *message;
148: size_t message_len;
149: /* If error packet, we use these */
150: char error[MYSQLND_ERRMSG_SIZE+1];
151: char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
152: unsigned int error_no;
153: } MYSQLND_PACKET_OK;
154:
155:
156: /* Command packet */
157: typedef struct st_mysqlnd_packet_command {
158: MYSQLND_PACKET_HEADER header;
159: enum php_mysqlnd_server_command command;
1.1.1.2 misho 160: const zend_uchar *argument;
1.1 misho 161: size_t arg_len;
162: } MYSQLND_PACKET_COMMAND;
163:
164:
165: /* EOF packet */
166: typedef struct st_mysqlnd_packet_eof {
167: MYSQLND_PACKET_HEADER header;
168: uint8_t field_count; /* 0xFE */
169: uint16_t warning_count;
170: uint16_t server_status;
171: /* If error packet, we use these */
172: char error[MYSQLND_ERRMSG_SIZE+1];
173: char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
174: unsigned int error_no;
175: } MYSQLND_PACKET_EOF;
176: /* EOF packet */
177:
178:
179: /* Result Set header*/
180: typedef struct st_mysqlnd_packet_rset_header {
181: MYSQLND_PACKET_HEADER header;
182: /*
183: 0x00 => ok
184: ~0 => LOAD DATA LOCAL
185: error_no != 0 => error
186: others => result set -> Read res_field packets up to field_count
187: */
188: unsigned long field_count;
189: /*
190: These are filled if no SELECT query. For SELECT warning_count
191: and server status are in the last row packet, the EOF packet.
192: */
193: uint16_t warning_count;
194: uint16_t server_status;
195: uint64_t affected_rows;
196: uint64_t last_insert_id;
197: /* This is for both LOAD DATA or info, when no result set */
198: char *info_or_local_file;
199: size_t info_or_local_file_len;
200: /* If error packet, we use these */
201: MYSQLND_ERROR_INFO error_info;
202: } MYSQLND_PACKET_RSET_HEADER;
203:
204:
205: /* Result set field packet */
206: typedef struct st_mysqlnd_packet_res_field {
207: MYSQLND_PACKET_HEADER header;
208: MYSQLND_FIELD *metadata;
209: /* For table definitions, empty for result sets */
210: zend_bool skip_parsing;
211: zend_bool stupid_list_fields_eof;
212: zend_bool persistent_alloc;
213:
214: MYSQLND_ERROR_INFO error_info;
215: } MYSQLND_PACKET_RES_FIELD;
216:
217:
218: /* Row packet */
219: typedef struct st_mysqlnd_packet_row {
220: MYSQLND_PACKET_HEADER header;
221: zval **fields;
222: uint32_t field_count;
223: zend_bool eof;
224: /*
225: These are, of course, only for SELECT in the EOF packet,
226: which is detected by this packet
227: */
228: uint16_t warning_count;
229: uint16_t server_status;
230:
231: struct st_mysqlnd_memory_pool_chunk *row_buffer;
232: MYSQLND_MEMORY_POOL * result_set_memory_pool;
233:
234: zend_bool skip_extraction;
235: zend_bool binary_protocol;
236: zend_bool persistent_alloc;
237: MYSQLND_FIELD *fields_metadata;
238: /* We need this to alloc bigger bufs in non-PS mode */
239: unsigned int bit_fields_count;
240: size_t bit_fields_total_len; /* trailing \0 not counted */
241:
242: /* If error packet, we use these */
243: MYSQLND_ERROR_INFO error_info;
244: } MYSQLND_PACKET_ROW;
245:
246:
247: /* Statistics packet */
248: typedef struct st_mysqlnd_packet_stats {
249: MYSQLND_PACKET_HEADER header;
250: char *message;
251: /* message_len is not part of the packet*/
252: size_t message_len;
253: } MYSQLND_PACKET_STATS;
254:
255:
256: /* COM_PREPARE response packet */
257: typedef struct st_mysqlnd_packet_prepare_response {
258: MYSQLND_PACKET_HEADER header;
259: /* also known as field_count 0x00=OK , 0xFF=error */
260: unsigned char error_code;
261: unsigned long stmt_id;
262: unsigned int field_count;
263: unsigned int param_count;
264: unsigned int warning_count;
265:
266: /* present in case of error */
267: MYSQLND_ERROR_INFO error_info;
268: } MYSQLND_PACKET_PREPARE_RESPONSE;
269:
270:
271: /* Statistics packet */
272: typedef struct st_mysqlnd_packet_chg_user_resp {
273: MYSQLND_PACKET_HEADER header;
1.1.1.2 misho 274: uint32_t response_code;
1.1 misho 275:
276: /* message_len is not part of the packet*/
277: uint16_t server_capabilities;
278: /* If error packet, we use these */
279: MYSQLND_ERROR_INFO error_info;
280: zend_bool server_asked_323_auth;
1.1.1.2 misho 281:
282: char *new_auth_protocol;
283: size_t new_auth_protocol_len;
284: zend_uchar *new_auth_protocol_data;
285: size_t new_auth_protocol_data_len;
1.1 misho 286: } MYSQLND_PACKET_CHG_USER_RESPONSE;
287:
288:
1.1.1.2 misho 289: PHPAPI void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const pass, size_t pass_len);
1.1 misho 290:
291: unsigned long php_mysqlnd_net_field_length(zend_uchar **packet);
292: zend_uchar * php_mysqlnd_net_store_length(zend_uchar *packet, uint64_t length);
293:
294: PHPAPI const extern char * const mysqlnd_empty_string;
295:
296:
297: enum_func_status php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
298: unsigned int field_count, MYSQLND_FIELD *fields_metadata,
299: zend_bool as_unicode, zend_bool as_int_or_float,
300: MYSQLND_STATS * stats TSRMLS_DC);
301:
302:
303: enum_func_status php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
304: unsigned int field_count, MYSQLND_FIELD *fields_metadata,
305: zend_bool as_unicode, zend_bool as_int_or_float,
306: MYSQLND_STATS * stats TSRMLS_DC);
307:
308:
309: PHPAPI MYSQLND_PROTOCOL * mysqlnd_protocol_init(zend_bool persistent TSRMLS_DC);
310: PHPAPI void mysqlnd_protocol_free(MYSQLND_PROTOCOL * const protocol TSRMLS_DC);
311:
312: #endif /* MYSQLND_WIREPROTOCOL_H */
313:
314: /*
315: * Local variables:
316: * tab-width: 4
317: * c-basic-offset: 4
318: * End:
319: * vim600: noet sw=4 ts=4 fdm=marker
320: * vim<600: noet sw=4 ts=4
321: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>