Annotation of embedaddon/php/ext/mysqlnd/mysqlnd_wireprotocol.h, revision 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>