Annotation of embedaddon/php/ext/mysqlnd/mysqlnd_wireprotocol.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:   +----------------------------------------------------------------------+
                      3:   | PHP Version 5                                                        |
                      4:   +----------------------------------------------------------------------+
                      5:   | Copyright (c) 2006-2012 The PHP Group                                |
                      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:   +----------------------------------------------------------------------+
                     15:   | Authors: Georg Richter <georg@mysql.com>                             |
                     16:   |          Andrey Hristov <andrey@mysql.com>                           |
                     17:   |          Ulf Wendel <uwendel@mysql.com>                              |
                     18:   +----------------------------------------------------------------------+
                     19: */
                     20: 
                     21: /* $Id: mysqlnd_wireprotocol.h 321634 2012-01-01 13:15:04Z felipe $ */
                     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;
                     54:        enum_func_status        (*read_from_net)(void *packet, MYSQLND *conn TSRMLS_DC);
                     55:        size_t                          (*write_to_net)(void *packet, MYSQLND *conn TSRMLS_DC);
                     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;
                     73:        zend_uchar      scramble_buf[SCRAMBLE_LENGTH];
                     74:        /* 1 byte pad */
                     75:        uint16_t        server_capabilities;
                     76:        uint8_t         charset_no;
                     77:        uint16_t        server_status;
                     78:        /* 13 byte pad*/
                     79:        zend_bool       pre41;
                     80:        /* If error packet, we use these */
                     81:        char            error[MYSQLND_ERRMSG_SIZE+1];
                     82:        char            sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
                     83:        unsigned int    error_no;
                     84: } MYSQLND_PACKET_GREET;
                     85: 
                     86: 
                     87: /* Client authenticates */
                     88: typedef struct st_mysqlnd_packet_auth {
                     89:        MYSQLND_PACKET_HEADER           header;
                     90:        uint32_t        client_flags;
                     91:        uint32_t        max_packet_size;
                     92:        uint8_t charset_no;
                     93:        /* 23 byte pad */
                     94:        const char      *user;
                     95:        /* 8 byte scramble */
                     96:        const char      *db;
                     97:        /* 12 byte scramble */
                     98: 
                     99:        /* Here the packet ends. This is user supplied data */
                    100:        const char      *password;
                    101:        /* +1 for \0 because of scramble() */
                    102:        unsigned char   *server_scramble_buf;
                    103:        size_t                  db_len;
                    104:        zend_bool               send_half_packet;
                    105: } MYSQLND_PACKET_AUTH;
                    106: 
                    107: /* OK packet */
                    108: typedef struct st_mysqlnd_packet_ok {
                    109:        MYSQLND_PACKET_HEADER           header;
                    110:        uint8_t         field_count; /* always 0x0 */
                    111:        uint64_t        affected_rows;
                    112:        uint64_t        last_insert_id;
                    113:        uint16_t        server_status;
                    114:        uint16_t        warning_count;
                    115:        char            *message;
                    116:        size_t          message_len;
                    117:        /* If error packet, we use these */
                    118:        char            error[MYSQLND_ERRMSG_SIZE+1];
                    119:        char            sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
                    120:        unsigned int    error_no;
                    121: } MYSQLND_PACKET_OK;
                    122: 
                    123: 
                    124: /* Command packet */
                    125: typedef struct st_mysqlnd_packet_command {
                    126:        MYSQLND_PACKET_HEADER                   header;
                    127:        enum php_mysqlnd_server_command command;
                    128:        const char                                              *argument;
                    129:        size_t                                                  arg_len;
                    130: } MYSQLND_PACKET_COMMAND;
                    131: 
                    132: 
                    133: /* EOF packet */
                    134: typedef struct st_mysqlnd_packet_eof {
                    135:        MYSQLND_PACKET_HEADER           header;
                    136:        uint8_t         field_count; /* 0xFE */
                    137:        uint16_t        warning_count;
                    138:        uint16_t        server_status;
                    139:        /* If error packet, we use these */
                    140:        char            error[MYSQLND_ERRMSG_SIZE+1];
                    141:        char            sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
                    142:        unsigned int    error_no;
                    143: } MYSQLND_PACKET_EOF;
                    144: /* EOF packet */
                    145: 
                    146: 
                    147: /* Result Set header*/
                    148: typedef struct st_mysqlnd_packet_rset_header {
                    149:        MYSQLND_PACKET_HEADER           header;
                    150:        /*
                    151:          0x00 => ok
                    152:          ~0   => LOAD DATA LOCAL
                    153:          error_no != 0 => error
                    154:          others => result set -> Read res_field packets up to field_count
                    155:        */
                    156:        unsigned long           field_count;
                    157:        /*
                    158:          These are filled if no SELECT query. For SELECT warning_count
                    159:          and server status are in the last row packet, the EOF packet.
                    160:        */
                    161:        uint16_t        warning_count;
                    162:        uint16_t        server_status;
                    163:        uint64_t        affected_rows;
                    164:        uint64_t        last_insert_id;
                    165:        /* This is for both LOAD DATA or info, when no result set */
                    166:        char            *info_or_local_file;
                    167:        size_t          info_or_local_file_len;
                    168:        /* If error packet, we use these */
                    169:        MYSQLND_ERROR_INFO      error_info;
                    170: } MYSQLND_PACKET_RSET_HEADER;
                    171: 
                    172: 
                    173: /* Result set field packet */
                    174: typedef struct st_mysqlnd_packet_res_field {
                    175:        MYSQLND_PACKET_HEADER   header;
                    176:        MYSQLND_FIELD                   *metadata;
                    177:        /* For table definitions, empty for result sets */
                    178:        zend_bool                               skip_parsing;
                    179:        zend_bool                               stupid_list_fields_eof;
                    180:        zend_bool                               persistent_alloc;
                    181: 
                    182:        MYSQLND_ERROR_INFO              error_info;
                    183: } MYSQLND_PACKET_RES_FIELD;
                    184: 
                    185: 
                    186: /* Row packet */
                    187: typedef struct st_mysqlnd_packet_row {
                    188:        MYSQLND_PACKET_HEADER   header;
                    189:        zval            **fields;
                    190:        uint32_t        field_count;
                    191:        zend_bool       eof;
                    192:        /*
                    193:          These are, of course, only for SELECT in the EOF packet,
                    194:          which is detected by this packet
                    195:        */
                    196:        uint16_t        warning_count;
                    197:        uint16_t        server_status;
                    198: 
                    199:        struct st_mysqlnd_memory_pool_chunk     *row_buffer;
                    200:        MYSQLND_MEMORY_POOL * result_set_memory_pool;
                    201: 
                    202:        zend_bool               skip_extraction;
                    203:        zend_bool               binary_protocol;
                    204:        zend_bool               persistent_alloc;
                    205:        MYSQLND_FIELD   *fields_metadata;
                    206:        /* We need this to alloc bigger bufs in non-PS mode */
                    207:        unsigned int    bit_fields_count;
                    208:        size_t                  bit_fields_total_len; /* trailing \0 not counted */
                    209: 
                    210:        /* If error packet, we use these */
                    211:        MYSQLND_ERROR_INFO      error_info;
                    212: } MYSQLND_PACKET_ROW;
                    213: 
                    214: 
                    215: /* Statistics packet */
                    216: typedef struct st_mysqlnd_packet_stats {
                    217:        MYSQLND_PACKET_HEADER   header;
                    218:        char *message;
                    219:        /* message_len is not part of the packet*/
                    220:        size_t message_len;
                    221: } MYSQLND_PACKET_STATS;
                    222: 
                    223: 
                    224: /* COM_PREPARE response packet */
                    225: typedef struct st_mysqlnd_packet_prepare_response {
                    226:        MYSQLND_PACKET_HEADER   header;
                    227:        /* also known as field_count 0x00=OK , 0xFF=error */
                    228:        unsigned char   error_code;
                    229:        unsigned long   stmt_id;
                    230:        unsigned int    field_count;
                    231:        unsigned int    param_count;
                    232:        unsigned int    warning_count;
                    233: 
                    234:        /* present in case of error */
                    235:        MYSQLND_ERROR_INFO      error_info;
                    236: } MYSQLND_PACKET_PREPARE_RESPONSE;
                    237: 
                    238: 
                    239: /* Statistics packet */
                    240: typedef struct st_mysqlnd_packet_chg_user_resp {
                    241:        MYSQLND_PACKET_HEADER   header;
                    242:        uint32_t                        field_count;
                    243: 
                    244:        /* message_len is not part of the packet*/
                    245:        uint16_t                        server_capabilities;
                    246:        /* If error packet, we use these */
                    247:        MYSQLND_ERROR_INFO      error_info;
                    248:        zend_bool                       server_asked_323_auth;
                    249: } MYSQLND_PACKET_CHG_USER_RESPONSE;
                    250: 
                    251: 
                    252: PHPAPI void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const pass);
                    253: 
                    254: unsigned long  php_mysqlnd_net_field_length(zend_uchar **packet);
                    255: zend_uchar *   php_mysqlnd_net_store_length(zend_uchar *packet, uint64_t length);
                    256: 
                    257: PHPAPI const extern char * const mysqlnd_empty_string;
                    258: 
                    259: 
                    260: enum_func_status php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
                    261:                                                                                 unsigned int field_count, MYSQLND_FIELD *fields_metadata,
                    262:                                                                                 zend_bool persistent,
                    263:                                                                                 zend_bool as_unicode, zend_bool as_int_or_float,
                    264:                                                                                 MYSQLND_STATS * stats TSRMLS_DC);
                    265: 
                    266: 
                    267: enum_func_status php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
                    268:                                                                                 unsigned int field_count, MYSQLND_FIELD *fields_metadata,
                    269:                                                                                 zend_bool persistent,
                    270:                                                                                 zend_bool as_unicode, zend_bool as_int_or_float,
                    271:                                                                                 MYSQLND_STATS * stats TSRMLS_DC);
                    272: 
                    273: 
                    274: PHPAPI MYSQLND_PROTOCOL * mysqlnd_protocol_init(zend_bool persistent TSRMLS_DC);
                    275: PHPAPI void mysqlnd_protocol_free(MYSQLND_PROTOCOL * const protocol TSRMLS_DC);
                    276: PHPAPI struct st_mysqlnd_protocol_methods * mysqlnd_protocol_get_methods();
                    277: 
                    278: #endif /* MYSQLND_WIREPROTOCOL_H */
                    279: 
                    280: /*
                    281:  * Local variables:
                    282:  * tab-width: 4
                    283:  * c-basic-offset: 4
                    284:  * End:
                    285:  * vim600: noet sw=4 ts=4 fdm=marker
                    286:  * vim<600: noet sw=4 ts=4
                    287:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>