Annotation of embedaddon/php/ext/mysqli/mysqli.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:   +----------------------------------------------------------------------+
                      3:   | PHP Version 5                                                        |
                      4:   +----------------------------------------------------------------------+
                      5:   | Copyright (c) 1997-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@php.net>                               |
                     16:   |          Andrey Hristov <andrey@php.net>                             |
                     17:   |          Ulf Wendel <uw@php.net>                                     |
                     18:   +----------------------------------------------------------------------+
                     19: 
                     20:   $Id: mysqli.c 321634 2012-01-01 13:15:04Z felipe $
                     21: */
                     22: 
                     23: #ifdef HAVE_CONFIG_H
                     24: #include "config.h"
                     25: #endif
                     26: 
                     27: #include <signal.h>
                     28: 
                     29: #include "php.h"
                     30: #include "php_ini.h"
                     31: #include "ext/standard/info.h"
                     32: #include "ext/standard/php_string.h"
                     33: #include "php_mysqli_structs.h"
                     34: #include "mysqli_priv.h"
                     35: #include "zend_exceptions.h"
                     36: 
                     37: ZEND_DECLARE_MODULE_GLOBALS(mysqli)
                     38: static PHP_GINIT_FUNCTION(mysqli);
                     39: 
                     40: #define MYSQLI_ADD_PROPERTIES(a,b) \
                     41: { \
                     42:        int i = 0; \
                     43:        while (b[i].pname != NULL) { \
                     44:                mysqli_add_property((a), (b)[i].pname, (b)[i].pname_length, \
                     45:                                                        (mysqli_read_t)(b)[i].r_func, (mysqli_write_t)(b)[i].w_func TSRMLS_CC); \
                     46:                i++; \
                     47:        }\
                     48: }
                     49: 
                     50: #define MYSQLI_ADD_PROPERTIES_INFO(a,b) \
                     51: { \
                     52:        int i = 0; \
                     53:        while (b[i].name != NULL) { \
                     54:                zend_declare_property_null((a), (b)[i].name, (b)[i].name_length, ZEND_ACC_PUBLIC TSRMLS_CC); \
                     55:                i++; \
                     56:        }\
                     57: }
                     58: 
                     59: 
                     60: 
                     61: static zend_object_handlers mysqli_object_handlers;
                     62: static HashTable classes;
                     63: static HashTable mysqli_driver_properties;
                     64: static HashTable mysqli_link_properties;
                     65: static HashTable mysqli_result_properties;
                     66: static HashTable mysqli_stmt_properties;
                     67: static HashTable mysqli_warning_properties;
                     68: 
                     69: zend_class_entry *mysqli_link_class_entry;
                     70: zend_class_entry *mysqli_stmt_class_entry;
                     71: zend_class_entry *mysqli_result_class_entry;
                     72: zend_class_entry *mysqli_driver_class_entry;
                     73: zend_class_entry *mysqli_warning_class_entry;
                     74: zend_class_entry *mysqli_exception_class_entry;
                     75: 
                     76: 
                     77: typedef int (*mysqli_read_t)(mysqli_object *obj, zval **retval TSRMLS_DC);
                     78: typedef int (*mysqli_write_t)(mysqli_object *obj, zval *newval TSRMLS_DC);
                     79: 
                     80: typedef struct _mysqli_prop_handler {
                     81:        char *name;
                     82:        size_t name_len;
                     83:        mysqli_read_t read_func;
                     84:        mysqli_write_t write_func;
                     85: } mysqli_prop_handler;
                     86: 
                     87: static int le_pmysqli;
                     88: 
                     89: 
                     90: /* Destructor for mysqli entries in free_links/used_links */
                     91: void php_mysqli_dtor_p_elements(void *data)
                     92: {
                     93:        MYSQL *mysql = (MYSQL *) data;
                     94:        TSRMLS_FETCH();
                     95:        mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT);
                     96: }
                     97: 
                     98: 
                     99: ZEND_RSRC_DTOR_FUNC(php_mysqli_dtor)
                    100: {
                    101:        if (rsrc->ptr) {
                    102:                mysqli_plist_entry *plist = (mysqli_plist_entry *) rsrc->ptr;
                    103:                zend_ptr_stack_clean(&plist->free_links, php_mysqli_dtor_p_elements, 0);
                    104:                zend_ptr_stack_destroy(&plist->free_links);
                    105:                free(plist);
                    106:        }
                    107: }
                    108: 
                    109: 
                    110: int php_le_pmysqli(void)
                    111: {
                    112:        return le_pmysqli;
                    113: }
                    114: 
                    115: #ifndef MYSQLI_USE_MYSQLND
                    116: /* {{{ php_free_stmt_bind_buffer */
                    117: void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type)
                    118: {
                    119:        unsigned int i;
                    120: 
                    121:        if (!bbuf.var_cnt) {
                    122:                return;
                    123:        }
                    124: 
                    125:        for (i=0; i < bbuf.var_cnt; i++) {
                    126: 
                    127:                /* free temporary bind buffer */
                    128:                if (type == FETCH_RESULT && bbuf.buf[i].val) {
                    129:                        efree(bbuf.buf[i].val);
                    130:                }
                    131: 
                    132:                if (bbuf.vars[i]) {
                    133:                        zval_ptr_dtor(&bbuf.vars[i]);
                    134:                }
                    135:        }
                    136: 
                    137:        if (bbuf.vars) {
                    138:                efree(bbuf.vars);
                    139:        }
                    140: 
                    141:        /*
                    142:          Don't free bbuf.is_null for FETCH_RESULT since we have allocated
                    143:          is_null and buf in one block so we free only buf, which is the beginning
                    144:          of the block. When FETCH_SIMPLE then buf wasn't allocated together with
                    145:          buf and we have to free it.
                    146:        */
                    147:        if (type == FETCH_RESULT) {
                    148:                efree(bbuf.buf);
                    149:        } else if (type == FETCH_SIMPLE){
                    150:                efree(bbuf.is_null);
                    151:        }
                    152: 
                    153:        bbuf.var_cnt = 0;
                    154: }
                    155: /* }}} */
                    156: #endif
                    157: 
                    158: /* {{{ php_clear_stmt_bind */
                    159: void php_clear_stmt_bind(MY_STMT *stmt TSRMLS_DC)
                    160: {
                    161:        if (stmt->stmt) {
                    162:                if (mysqli_stmt_close(stmt->stmt, TRUE)) {
                    163:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error occured while closing statement");
                    164:                        return;
                    165:                }
                    166:        }
                    167: 
                    168:        /*
                    169:          mysqlnd keeps track of the binding and has freed its
                    170:          structures in stmt_close() above
                    171:        */
                    172: #ifndef MYSQLI_USE_MYSQLND
                    173:        /* Clean param bind */
                    174:        php_free_stmt_bind_buffer(stmt->param, FETCH_SIMPLE);
                    175:        /* Clean output bind */
                    176:        php_free_stmt_bind_buffer(stmt->result, FETCH_RESULT);
                    177: #endif
                    178: 
                    179:        if (stmt->query) {
                    180:                efree(stmt->query);
                    181:        }
                    182:        efree(stmt);
                    183: }
                    184: /* }}} */
                    185: 
                    186: /* {{{ php_clear_mysql */
                    187: void php_clear_mysql(MY_MYSQL *mysql) {
                    188:        if (mysql->hash_key) {
                    189:                efree(mysql->hash_key);
                    190:                mysql->hash_key = NULL;
                    191:        }
                    192:        if (mysql->li_read) {
                    193:                zval_ptr_dtor(&(mysql->li_read));
                    194:                mysql->li_read = NULL;
                    195:        }
                    196: }
                    197: /* }}} */
                    198: 
                    199: /* {{{ mysqli_objects_free_storage
                    200:  */
                    201: static void mysqli_objects_free_storage(void *object TSRMLS_DC)
                    202: {
                    203:        zend_object *zo = (zend_object *)object;
                    204:        mysqli_object   *intern = (mysqli_object *)zo;
                    205:        MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
                    206: 
                    207:        my_efree(my_res);
                    208:        zend_object_std_dtor(&intern->zo TSRMLS_CC);
                    209:        efree(intern);
                    210: }
                    211: /* }}} */
                    212: 
                    213: /* mysqli_link_free_storage partly doubles the work of PHP_FUNCTION(mysqli_close) */
                    214: 
                    215: /* {{{ mysqli_link_free_storage
                    216:  */
                    217: static void mysqli_link_free_storage(void *object TSRMLS_DC)
                    218: {
                    219:        zend_object *zo = (zend_object *)object;
                    220:        mysqli_object   *intern = (mysqli_object *)zo;
                    221:        MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
                    222: 
                    223:        if (my_res && my_res->ptr) {
                    224:                MY_MYSQL *mysql = (MY_MYSQL *)my_res->ptr;
                    225:                if (mysql->mysql) {
                    226:                        php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT, my_res->status TSRMLS_CC);
                    227:                }
                    228:                php_clear_mysql(mysql);
                    229:                efree(mysql);
                    230:                my_res->status = MYSQLI_STATUS_UNKNOWN;
                    231:        }
                    232:        mysqli_objects_free_storage(object TSRMLS_CC);
                    233: }
                    234: /* }}} */
                    235: 
                    236: /* {{{ mysql_driver_free_storage */
                    237: static void mysqli_driver_free_storage(void *object TSRMLS_DC)
                    238: {
                    239:        mysqli_objects_free_storage(object TSRMLS_CC);
                    240: }
                    241: /* }}} */
                    242: 
                    243: /* {{{ mysqli_stmt_free_storage
                    244:  */
                    245: static void mysqli_stmt_free_storage(void *object TSRMLS_DC)
                    246: {
                    247:        zend_object *zo = (zend_object *)object;
                    248:        mysqli_object   *intern = (mysqli_object *)zo;
                    249:        MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
                    250: 
                    251:        if (my_res && my_res->ptr) {
                    252:                MY_STMT *stmt = (MY_STMT *)my_res->ptr;
                    253:                php_clear_stmt_bind(stmt TSRMLS_CC);
                    254:        }
                    255:        mysqli_objects_free_storage(object TSRMLS_CC);
                    256: }
                    257: /* }}} */
                    258: 
                    259: /* {{{ mysqli_result_free_storage
                    260:  */
                    261: static void mysqli_result_free_storage(void *object TSRMLS_DC)
                    262: {
                    263:        zend_object *zo = (zend_object *)object;
                    264:        mysqli_object   *intern = (mysqli_object *)zo;
                    265:        MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
                    266: 
                    267:        if (my_res && my_res->ptr) {
                    268:                mysql_free_result(my_res->ptr);
                    269:        }
                    270:        mysqli_objects_free_storage(object TSRMLS_CC);
                    271: }
                    272: /* }}} */
                    273: 
                    274: /* {{{ mysqli_warning_free_storage
                    275:  */
                    276: static void mysqli_warning_free_storage(void *object TSRMLS_DC)
                    277: {
                    278:        zend_object *zo = (zend_object *)object;
                    279:        mysqli_object   *intern = (mysqli_object *)zo;
                    280:        MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
                    281: 
                    282:        if (my_res && my_res->ptr) {
                    283:                php_clear_warnings((MYSQLI_WARNING *)my_res->info);
                    284:                my_res->ptr = NULL;
                    285:        }
                    286:        mysqli_objects_free_storage(object TSRMLS_CC);
                    287: }
                    288: /* }}} */
                    289: 
                    290: /* {{{ mysqli_read_na */
                    291: static int mysqli_read_na(mysqli_object *obj, zval **retval TSRMLS_DC)
                    292: {
                    293:        *retval = NULL;
                    294:        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot read property");
                    295:        return FAILURE;
                    296: }
                    297: /* }}} */
                    298: 
                    299: /* {{{ mysqli_write_na */
                    300: static int mysqli_write_na(mysqli_object *obj, zval *newval TSRMLS_DC)
                    301: {
                    302:        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot write property");
                    303:        return FAILURE;
                    304: }
                    305: /* }}} */
                    306: 
                    307: #ifndef Z_ADDREF_P
                    308: /* PHP 5.2, old GC */
                    309: #define Z_ADDREF_P(pz)                         (++(pz)->refcount)
                    310: #define Z_REFCOUNT_P(pz)                       ((pz)->refcount)
                    311: #define Z_SET_REFCOUNT_P(pz, rc)       ((pz)->refcount = rc)
                    312: #endif
                    313: 
                    314: 
                    315: /* {{{ mysqli_read_property */
                    316: zval *mysqli_read_property(zval *object, zval *member, int type TSRMLS_DC)
                    317: {
                    318:        zval tmp_member;
                    319:        zval *retval;
                    320:        mysqli_object *obj;
                    321:        mysqli_prop_handler *hnd;
                    322:        int ret;
                    323: 
                    324:        ret = FAILURE;
                    325:        obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
                    326: 
                    327:        if (member->type != IS_STRING) {
                    328:                tmp_member = *member;
                    329:                zval_copy_ctor(&tmp_member);
                    330:                convert_to_string(&tmp_member);
                    331:                member = &tmp_member;
                    332:        }
                    333: 
                    334:        if (obj->prop_handler != NULL) {
                    335:                ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
                    336:        }
                    337: 
                    338:        if (ret == SUCCESS) {
                    339:                ret = hnd->read_func(obj, &retval TSRMLS_CC);
                    340:                if (ret == SUCCESS) {
                    341:                        /* ensure we're creating a temporary variable */
                    342:                        Z_SET_REFCOUNT_P(retval, 0);
                    343:                } else {
                    344:                        retval = EG(uninitialized_zval_ptr);
                    345:                }
                    346:        } else {
                    347:                zend_object_handlers * std_hnd = zend_get_std_object_handlers();
                    348:                retval = std_hnd->read_property(object, member, type TSRMLS_CC);
                    349:        }
                    350: 
                    351:        if (member == &tmp_member) {
                    352:                zval_dtor(member);
                    353:        }
                    354:        return(retval);
                    355: }
                    356: /* }}} */
                    357: 
                    358: /* {{{ mysqli_write_property */
                    359: void mysqli_write_property(zval *object, zval *member, zval *value TSRMLS_DC)
                    360: {
                    361:        zval tmp_member;
                    362:        mysqli_object *obj;
                    363:        mysqli_prop_handler *hnd;
                    364:        int ret;
                    365: 
                    366:        if (member->type != IS_STRING) {
                    367:                tmp_member = *member;
                    368:                zval_copy_ctor(&tmp_member);
                    369:                convert_to_string(&tmp_member);
                    370:                member = &tmp_member;
                    371:        }
                    372: 
                    373:        ret = FAILURE;
                    374:        obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
                    375: 
                    376:        if (obj->prop_handler != NULL) {
                    377:                ret = zend_hash_find((HashTable *)obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
                    378:        }
                    379:        if (ret == SUCCESS) {
                    380:                hnd->write_func(obj, value TSRMLS_CC);
                    381:                if (! PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) == 0) {
                    382:                        Z_ADDREF_P(value);
                    383:                        zval_ptr_dtor(&value);
                    384:                }
                    385:        } else {
                    386:                zend_object_handlers * std_hnd = zend_get_std_object_handlers();
                    387:                std_hnd->write_property(object, member, value TSRMLS_CC);
                    388:        }
                    389: 
                    390:        if (member == &tmp_member) {
                    391:                zval_dtor(member);
                    392:        }
                    393: }
                    394: /* }}} */
                    395: 
                    396: /* {{{ void mysqli_add_property(HashTable *h, char *pname, mysqli_read_t r_func, mysqli_write_t w_func TSRMLS_DC) */
                    397: void mysqli_add_property(HashTable *h, const char *pname, size_t pname_len, mysqli_read_t r_func, mysqli_write_t w_func TSRMLS_DC) {
                    398:        mysqli_prop_handler             p;
                    399: 
                    400:        p.name = (char*) pname;
                    401:        p.name_len = pname_len;
                    402:        p.read_func = (r_func) ? r_func : mysqli_read_na;
                    403:        p.write_func = (w_func) ? w_func : mysqli_write_na;
                    404:        zend_hash_add(h, pname, pname_len + 1, &p, sizeof(mysqli_prop_handler), NULL);
                    405: }
                    406: /* }}} */
                    407: 
                    408: static int mysqli_object_has_property(zval *object, zval *member, int has_set_exists TSRMLS_DC) /* {{{ */
                    409: {
                    410:        mysqli_object *obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
                    411:        mysqli_prop_handler     p;
                    412:        int ret = 0;
                    413: 
                    414:        if (zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member) + 1, (void **)&p) == SUCCESS) {
                    415:                switch (has_set_exists) {
                    416:                        case 2:
                    417:                                ret = 1;
                    418:                                break;
                    419:                        case 1: {
                    420:                                zval *value = mysqli_read_property(object, member, BP_VAR_IS TSRMLS_CC);
                    421:                                if (value != EG(uninitialized_zval_ptr)) {
                    422:                                        convert_to_boolean(value);
                    423:                                        ret = Z_BVAL_P(value)? 1:0;
                    424:                                        /* refcount is 0 */
                    425:                                        Z_ADDREF_P(value);
                    426:                                        zval_ptr_dtor(&value);
                    427:                                }
                    428:                                break;
                    429:                        }
                    430:                        case 0:{
                    431:                                zval *value = mysqli_read_property(object, member, BP_VAR_IS TSRMLS_CC);
                    432:                                if (value != EG(uninitialized_zval_ptr)) {
                    433:                                        ret = Z_TYPE_P(value) != IS_NULL? 1:0;
                    434:                                        /* refcount is 0 */
                    435:                                        Z_ADDREF_P(value);
                    436:                                        zval_ptr_dtor(&value);
                    437:                                }
                    438:                                break;
                    439:                        }
                    440:                        default:
                    441:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value for has_set_exists");
                    442:                }
                    443:        } else {
                    444:                zend_object_handlers * std_hnd = zend_get_std_object_handlers();
                    445:                ret = std_hnd->has_property(object, member, has_set_exists TSRMLS_CC);
                    446:        }
                    447:        return ret;
                    448: } /* }}} */
                    449: 
                    450: 
                    451: #if PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3
                    452: HashTable * mysqli_object_get_debug_info(zval *object, int *is_temp TSRMLS_DC)
                    453: {
                    454:        mysqli_object *obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
                    455:        HashTable *retval, *props = obj->prop_handler;
                    456:        HashPosition pos;
                    457:        mysqli_prop_handler *entry;
                    458: 
                    459:        ALLOC_HASHTABLE(retval);
                    460:        ZEND_INIT_SYMTABLE_EX(retval, zend_hash_num_elements(props) + 1, 0);
                    461: 
                    462:        zend_hash_internal_pointer_reset_ex(props, &pos);
                    463:        while (zend_hash_get_current_data_ex(props, (void **)&entry, &pos) == SUCCESS) {
                    464:                zval member;
                    465:                zval *value;
                    466:                INIT_ZVAL(member);
                    467:                ZVAL_STRINGL(&member, entry->name, entry->name_len, 0);
                    468:                value = mysqli_read_property(object, &member, BP_VAR_IS TSRMLS_CC);
                    469:                if (value != EG(uninitialized_zval_ptr)) {
                    470:                        Z_ADDREF_P(value);
                    471:                        zend_hash_add(retval, entry->name, entry->name_len + 1, &value, sizeof(zval *), NULL);
                    472:                }
                    473:                zend_hash_move_forward_ex(props, &pos);
                    474:        }
                    475: 
                    476:        *is_temp = 1;
                    477:        return retval;
                    478: }
                    479: #endif
                    480: 
                    481: /* {{{ mysqli_objects_new
                    482:  */
                    483: PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_type TSRMLS_DC)
                    484: {
                    485:        zend_object_value retval;
                    486:        mysqli_object *intern;
                    487:        zval *tmp;
                    488:        zend_class_entry *mysqli_base_class;
                    489:        zend_objects_free_object_storage_t free_storage;
                    490: 
                    491:        intern = emalloc(sizeof(mysqli_object));
                    492:        memset(intern, 0, sizeof(mysqli_object));
                    493:        intern->ptr = NULL;
                    494:        intern->prop_handler = NULL;
                    495: 
                    496:        mysqli_base_class = class_type;
                    497:        while (mysqli_base_class->type != ZEND_INTERNAL_CLASS &&
                    498:                   mysqli_base_class->parent != NULL) {
                    499:                mysqli_base_class = mysqli_base_class->parent;
                    500:        }
                    501:        zend_hash_find(&classes, mysqli_base_class->name, mysqli_base_class->name_length + 1,
                    502:                                        (void **) &intern->prop_handler);
                    503: 
                    504:        zend_object_std_init(&intern->zo, class_type TSRMLS_CC);
                    505:        zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref,
                    506:                                        (void *) &tmp, sizeof(zval *));
                    507: 
                    508:        /* link object */
                    509:        if (instanceof_function(class_type, mysqli_link_class_entry TSRMLS_CC)) {
                    510:                free_storage = mysqli_link_free_storage;
                    511:        } else if (instanceof_function(class_type, mysqli_driver_class_entry TSRMLS_CC)) { /* driver object */
                    512:                free_storage = mysqli_driver_free_storage;
                    513:        } else if (instanceof_function(class_type, mysqli_stmt_class_entry TSRMLS_CC)) { /* stmt object */
                    514:                free_storage = mysqli_stmt_free_storage;
                    515:        } else if (instanceof_function(class_type, mysqli_result_class_entry TSRMLS_CC)) { /* result object */
                    516:                free_storage = mysqli_result_free_storage;
                    517:        } else if (instanceof_function(class_type, mysqli_warning_class_entry TSRMLS_CC)) { /* warning object */
                    518:                free_storage = mysqli_warning_free_storage;
                    519:        } else {
                    520:                free_storage = mysqli_objects_free_storage;
                    521:        }
                    522: 
                    523:        retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t) zend_objects_destroy_object, free_storage, NULL TSRMLS_CC);
                    524:        retval.handlers = &mysqli_object_handlers;
                    525: 
                    526:        return retval;
                    527: }
                    528: /* }}} */
                    529: 
                    530: 
                    531: /* {{{ PHP_INI_BEGIN
                    532: */
                    533: PHP_INI_BEGIN()
                    534:        STD_PHP_INI_ENTRY_EX("mysqli.max_links",                        "-1",   PHP_INI_SYSTEM,         OnUpdateLong,           max_links,                      zend_mysqli_globals,            mysqli_globals, display_link_numbers)
                    535:        STD_PHP_INI_ENTRY_EX("mysqli.max_persistent",           "-1",   PHP_INI_SYSTEM,         OnUpdateLong,           max_persistent,         zend_mysqli_globals,            mysqli_globals, display_link_numbers)
                    536:        STD_PHP_INI_BOOLEAN("mysqli.allow_persistent",          "1",    PHP_INI_SYSTEM,         OnUpdateLong,           allow_persistent,       zend_mysqli_globals,            mysqli_globals)
                    537:        STD_PHP_INI_ENTRY("mysqli.default_host",                        NULL,   PHP_INI_ALL,            OnUpdateString,         default_host,           zend_mysqli_globals,            mysqli_globals)
                    538:        STD_PHP_INI_ENTRY("mysqli.default_user",                        NULL,   PHP_INI_ALL,            OnUpdateString,         default_user,           zend_mysqli_globals,            mysqli_globals)
                    539:        STD_PHP_INI_ENTRY("mysqli.default_pw",                          NULL,   PHP_INI_ALL,            OnUpdateString,         default_pw,                     zend_mysqli_globals,            mysqli_globals)
                    540:        STD_PHP_INI_ENTRY("mysqli.default_port",                        "3306", PHP_INI_ALL,            OnUpdateLong,           default_port,           zend_mysqli_globals,            mysqli_globals)
                    541: #ifdef PHP_MYSQL_UNIX_SOCK_ADDR
                    542:        STD_PHP_INI_ENTRY("mysqli.default_socket",                      MYSQL_UNIX_ADDR,PHP_INI_ALL,OnUpdateStringUnempty,      default_socket, zend_mysqli_globals,            mysqli_globals)
                    543: #else
                    544:        STD_PHP_INI_ENTRY("mysqli.default_socket",                      NULL,   PHP_INI_ALL,            OnUpdateStringUnempty,  default_socket, zend_mysqli_globals,            mysqli_globals)
                    545: #endif
                    546:        STD_PHP_INI_BOOLEAN("mysqli.reconnect",                         "0",    PHP_INI_SYSTEM,         OnUpdateLong,           reconnect,                      zend_mysqli_globals,            mysqli_globals)
                    547:        STD_PHP_INI_BOOLEAN("mysqli.allow_local_infile",        "1",    PHP_INI_SYSTEM,         OnUpdateLong,           allow_local_infile,     zend_mysqli_globals,            mysqli_globals)
                    548: PHP_INI_END()
                    549: /* }}} */
                    550: 
                    551: 
                    552: /* {{{ PHP_GINIT_FUNCTION
                    553:  */
                    554: static PHP_GINIT_FUNCTION(mysqli)
                    555: {
                    556:        mysqli_globals->num_links = 0;
                    557:        mysqli_globals->num_active_persistent = 0;
                    558:        mysqli_globals->num_inactive_persistent = 0;
                    559:        mysqli_globals->max_links = -1;
                    560:        mysqli_globals->max_persistent = -1;
                    561:        mysqli_globals->allow_persistent = 1;
                    562:        mysqli_globals->default_port = 0;
                    563:        mysqli_globals->default_host = NULL;
                    564:        mysqli_globals->default_user = NULL;
                    565:        mysqli_globals->default_pw = NULL;
                    566:        mysqli_globals->default_socket = NULL;
                    567:        mysqli_globals->reconnect = 0;
                    568:        mysqli_globals->report_mode = 0;
                    569:        mysqli_globals->report_ht = 0;
                    570:        mysqli_globals->allow_local_infile = 1;
                    571: #ifdef HAVE_EMBEDDED_MYSQLI
                    572:        mysqli_globals->embedded = 1;
                    573: #else
                    574:        mysqli_globals->embedded = 0;
                    575: #endif
                    576: }
                    577: /* }}} */
                    578: 
                    579: /* {{{ PHP_MINIT_FUNCTION
                    580:  */
                    581: PHP_MINIT_FUNCTION(mysqli)
                    582: {
                    583:        zend_class_entry *ce,cex;
                    584:        zend_object_handlers *std_hnd = zend_get_std_object_handlers();
                    585: 
                    586:        REGISTER_INI_ENTRIES();
                    587: #ifndef MYSQLI_USE_MYSQLND
                    588: #if MYSQL_VERSION_ID >= 40000
                    589:        if (mysql_server_init(0, NULL, NULL)) {
                    590:                return FAILURE;
                    591:        }
                    592: #endif
                    593: #endif
                    594: 
                    595:        memcpy(&mysqli_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
                    596:        mysqli_object_handlers.clone_obj = NULL;
                    597:        mysqli_object_handlers.read_property = mysqli_read_property;
                    598:        mysqli_object_handlers.write_property = mysqli_write_property;
                    599:        mysqli_object_handlers.get_property_ptr_ptr = std_hnd->get_property_ptr_ptr;
                    600:        mysqli_object_handlers.has_property = mysqli_object_has_property;
                    601: #if PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3
                    602:        mysqli_object_handlers.get_debug_info = mysqli_object_get_debug_info;
                    603: #endif
                    604: 
                    605:        zend_hash_init(&classes, 0, NULL, NULL, 1);
                    606: 
                    607:        /* persistent connections */
                    608:        le_pmysqli = zend_register_list_destructors_ex(NULL, php_mysqli_dtor,
                    609:                "MySqli persistent connection", module_number);
                    610: 
                    611:        INIT_CLASS_ENTRY(cex, "mysqli_sql_exception", mysqli_exception_methods);
                    612: #ifdef HAVE_SPL
                    613:        mysqli_exception_class_entry = zend_register_internal_class_ex(&cex, spl_ce_RuntimeException, NULL TSRMLS_CC);
                    614: #else
                    615:        mysqli_exception_class_entry = zend_register_internal_class_ex(&cex, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);
                    616: #endif
                    617:        mysqli_exception_class_entry->ce_flags |= ZEND_ACC_FINAL;
                    618:        zend_declare_property_long(mysqli_exception_class_entry, "code", sizeof("code")-1, 0, ZEND_ACC_PROTECTED TSRMLS_CC);
                    619:        zend_declare_property_string(mysqli_exception_class_entry, "sqlstate", sizeof("sqlstate")-1, "00000", ZEND_ACC_PROTECTED TSRMLS_CC);
                    620: 
                    621:        REGISTER_MYSQLI_CLASS_ENTRY("mysqli_driver", mysqli_driver_class_entry, mysqli_driver_methods);
                    622:        ce = mysqli_driver_class_entry;
                    623:        zend_hash_init(&mysqli_driver_properties, 0, NULL, NULL, 1);
                    624:        MYSQLI_ADD_PROPERTIES(&mysqli_driver_properties, mysqli_driver_property_entries);
                    625:        MYSQLI_ADD_PROPERTIES_INFO(ce, mysqli_driver_property_info_entries);
                    626:        zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_driver_properties, sizeof(mysqli_driver_properties), NULL);
                    627:        ce->ce_flags |= ZEND_ACC_FINAL_CLASS;
                    628: 
                    629:        REGISTER_MYSQLI_CLASS_ENTRY("mysqli", mysqli_link_class_entry, mysqli_link_methods);
                    630:        ce = mysqli_link_class_entry;
                    631:        zend_hash_init(&mysqli_link_properties, 0, NULL, NULL, 1);
                    632:        MYSQLI_ADD_PROPERTIES(&mysqli_link_properties, mysqli_link_property_entries);
                    633:        MYSQLI_ADD_PROPERTIES_INFO(ce, mysqli_link_property_info_entries);
                    634:        zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_link_properties, sizeof(mysqli_link_properties), NULL);
                    635: 
                    636:        REGISTER_MYSQLI_CLASS_ENTRY("mysqli_warning", mysqli_warning_class_entry, mysqli_warning_methods);
                    637:        ce = mysqli_warning_class_entry;
                    638:        ce->ce_flags |= ZEND_ACC_FINAL_CLASS | ZEND_ACC_PROTECTED;
                    639:        zend_hash_init(&mysqli_warning_properties, 0, NULL, NULL, 1);
                    640:        MYSQLI_ADD_PROPERTIES(&mysqli_warning_properties, mysqli_warning_property_entries);
                    641:        MYSQLI_ADD_PROPERTIES_INFO(ce, mysqli_warning_property_info_entries);
                    642:        zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_warning_properties, sizeof(mysqli_warning_properties), NULL);
                    643: 
                    644:        REGISTER_MYSQLI_CLASS_ENTRY("mysqli_result", mysqli_result_class_entry, mysqli_result_methods);
                    645:        ce = mysqli_result_class_entry;
                    646:        zend_hash_init(&mysqli_result_properties, 0, NULL, NULL, 1);
                    647:        MYSQLI_ADD_PROPERTIES(&mysqli_result_properties, mysqli_result_property_entries);
                    648:        MYSQLI_ADD_PROPERTIES_INFO(ce, mysqli_result_property_info_entries);
                    649:        zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_result_properties, sizeof(mysqli_result_properties), NULL);
                    650: 
                    651:        REGISTER_MYSQLI_CLASS_ENTRY("mysqli_stmt", mysqli_stmt_class_entry, mysqli_stmt_methods);
                    652:        ce = mysqli_stmt_class_entry;
                    653:        zend_hash_init(&mysqli_stmt_properties, 0, NULL, NULL, 1);
                    654:        MYSQLI_ADD_PROPERTIES(&mysqli_stmt_properties, mysqli_stmt_property_entries);
                    655:        MYSQLI_ADD_PROPERTIES_INFO(ce, mysqli_stmt_property_info_entries);
                    656:        zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_stmt_properties, sizeof(mysqli_stmt_properties), NULL);
                    657: 
                    658:        /* mysqli_options */
                    659:        REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_GROUP", MYSQL_READ_DEFAULT_GROUP, CONST_CS | CONST_PERSISTENT);
                    660:        REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_FILE", MYSQL_READ_DEFAULT_FILE, CONST_CS | CONST_PERSISTENT);
                    661:        REGISTER_LONG_CONSTANT("MYSQLI_OPT_CONNECT_TIMEOUT", MYSQL_OPT_CONNECT_TIMEOUT, CONST_CS | CONST_PERSISTENT);
                    662:        REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOCAL_INFILE", MYSQL_OPT_LOCAL_INFILE, CONST_CS | CONST_PERSISTENT);
                    663:        REGISTER_LONG_CONSTANT("MYSQLI_INIT_COMMAND", MYSQL_INIT_COMMAND, CONST_CS | CONST_PERSISTENT);
                    664: #if defined(MYSQLI_USE_MYSQLND)
                    665:        REGISTER_LONG_CONSTANT("MYSQLI_OPT_NET_CMD_BUFFER_SIZE", MYSQLND_OPT_NET_CMD_BUFFER_SIZE, CONST_CS | CONST_PERSISTENT);
                    666:        REGISTER_LONG_CONSTANT("MYSQLI_OPT_NET_READ_BUFFER_SIZE", MYSQLND_OPT_NET_READ_BUFFER_SIZE, CONST_CS | CONST_PERSISTENT);
                    667: #endif
                    668: #ifdef MYSQLND_STRING_TO_INT_CONVERSION
                    669:        REGISTER_LONG_CONSTANT("MYSQLI_OPT_INT_AND_FLOAT_NATIVE", MYSQLND_OPT_INT_AND_FLOAT_NATIVE, CONST_CS | CONST_PERSISTENT);
                    670: #endif
                    671: #if MYSQL_VERSION_ID > 50110 || defined(MYSQLI_USE_MYSQLND)
                    672:        REGISTER_LONG_CONSTANT("MYSQLI_OPT_SSL_VERIFY_SERVER_CERT", MYSQL_OPT_SSL_VERIFY_SERVER_CERT, CONST_CS | CONST_PERSISTENT);
                    673: #endif
                    674: 
                    675:        /* mysqli_real_connect flags */
                    676:        REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT);
                    677:        REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_COMPRESS",CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT);
                    678:        REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT);
                    679:        REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT);
                    680:        REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_NO_SCHEMA", CLIENT_NO_SCHEMA, CONST_CS | CONST_PERSISTENT);
                    681:        REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_FOUND_ROWS", CLIENT_FOUND_ROWS, CONST_CS | CONST_PERSISTENT);
                    682: 
                    683:        /* for mysqli_query */
                    684:        REGISTER_LONG_CONSTANT("MYSQLI_STORE_RESULT", MYSQLI_STORE_RESULT, CONST_CS | CONST_PERSISTENT);
                    685:        REGISTER_LONG_CONSTANT("MYSQLI_USE_RESULT", MYSQLI_USE_RESULT, CONST_CS | CONST_PERSISTENT);
                    686: #if defined (MYSQLI_USE_MYSQLND)
                    687:        REGISTER_LONG_CONSTANT("MYSQLI_ASYNC", MYSQLI_ASYNC, CONST_CS | CONST_PERSISTENT);
                    688: #endif
                    689: 
                    690:        /* for mysqli_fetch_assoc */
                    691:        REGISTER_LONG_CONSTANT("MYSQLI_ASSOC", MYSQLI_ASSOC, CONST_CS | CONST_PERSISTENT);
                    692:        REGISTER_LONG_CONSTANT("MYSQLI_NUM", MYSQLI_NUM, CONST_CS | CONST_PERSISTENT);
                    693:        REGISTER_LONG_CONSTANT("MYSQLI_BOTH", MYSQLI_BOTH, CONST_CS | CONST_PERSISTENT);
                    694: 
                    695:        /* for mysqli_stmt_set_attr */
                    696:        REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH", STMT_ATTR_UPDATE_MAX_LENGTH, CONST_CS | CONST_PERSISTENT);
                    697: 
                    698: #if MYSQL_VERSION_ID > 50003 || defined(MYSQLI_USE_MYSQLND)
                    699:        REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_CURSOR_TYPE", STMT_ATTR_CURSOR_TYPE, CONST_CS | CONST_PERSISTENT);
                    700:        REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_NO_CURSOR", CURSOR_TYPE_NO_CURSOR, CONST_CS | CONST_PERSISTENT);
                    701:        REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_READ_ONLY", CURSOR_TYPE_READ_ONLY, CONST_CS | CONST_PERSISTENT);
                    702:        REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_FOR_UPDATE", CURSOR_TYPE_FOR_UPDATE, CONST_CS | CONST_PERSISTENT);
                    703:        REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_SCROLLABLE", CURSOR_TYPE_SCROLLABLE, CONST_CS | CONST_PERSISTENT);
                    704: #endif
                    705: 
                    706: #if MYSQL_VERSION_ID > 50007 || defined(MYSQLI_USE_MYSQLND)
                    707:        REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_PREFETCH_ROWS", STMT_ATTR_PREFETCH_ROWS, CONST_CS | CONST_PERSISTENT);
                    708: #endif
                    709: 
                    710:        /* column information */
                    711:        REGISTER_LONG_CONSTANT("MYSQLI_NOT_NULL_FLAG", NOT_NULL_FLAG, CONST_CS | CONST_PERSISTENT);
                    712:        REGISTER_LONG_CONSTANT("MYSQLI_PRI_KEY_FLAG", PRI_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
                    713:        REGISTER_LONG_CONSTANT("MYSQLI_UNIQUE_KEY_FLAG", UNIQUE_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
                    714:        REGISTER_LONG_CONSTANT("MYSQLI_MULTIPLE_KEY_FLAG", MULTIPLE_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
                    715:        REGISTER_LONG_CONSTANT("MYSQLI_BLOB_FLAG", BLOB_FLAG, CONST_CS | CONST_PERSISTENT);
                    716:        REGISTER_LONG_CONSTANT("MYSQLI_UNSIGNED_FLAG", UNSIGNED_FLAG, CONST_CS | CONST_PERSISTENT);
                    717:        REGISTER_LONG_CONSTANT("MYSQLI_ZEROFILL_FLAG", ZEROFILL_FLAG, CONST_CS | CONST_PERSISTENT);
                    718:        REGISTER_LONG_CONSTANT("MYSQLI_AUTO_INCREMENT_FLAG", AUTO_INCREMENT_FLAG, CONST_CS | CONST_PERSISTENT);
                    719:        REGISTER_LONG_CONSTANT("MYSQLI_TIMESTAMP_FLAG", TIMESTAMP_FLAG, CONST_CS | CONST_PERSISTENT);
                    720:        REGISTER_LONG_CONSTANT("MYSQLI_SET_FLAG", SET_FLAG, CONST_CS | CONST_PERSISTENT);
                    721:        REGISTER_LONG_CONSTANT("MYSQLI_NUM_FLAG", NUM_FLAG, CONST_CS | CONST_PERSISTENT);
                    722:        REGISTER_LONG_CONSTANT("MYSQLI_PART_KEY_FLAG", PART_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
                    723:        REGISTER_LONG_CONSTANT("MYSQLI_GROUP_FLAG", GROUP_FLAG, CONST_CS | CONST_PERSISTENT);
                    724:        REGISTER_LONG_CONSTANT("MYSQLI_ENUM_FLAG", ENUM_FLAG, CONST_CS | CONST_PERSISTENT);
                    725:        REGISTER_LONG_CONSTANT("MYSQLI_BINARY_FLAG", BINARY_FLAG, CONST_CS | CONST_PERSISTENT);
                    726: #if MYSQL_VERSION_ID > 50001 || defined(MYSQLI_USE_MYSQLND)
                    727:        REGISTER_LONG_CONSTANT("MYSQLI_NO_DEFAULT_VALUE_FLAG", NO_DEFAULT_VALUE_FLAG, CONST_CS | CONST_PERSISTENT);
                    728: #endif
                    729: 
                    730: #if (MYSQL_VERSION_ID > 51122 && MYSQL_VERSION_ID < 60000) || (MYSQL_VERSION_ID > 60003) || defined(MYSQLI_USE_MYSQLND)
                    731:        REGISTER_LONG_CONSTANT("MYSQLI_ON_UPDATE_NOW_FLAG", ON_UPDATE_NOW_FLAG, CONST_CS | CONST_PERSISTENT);
                    732: #endif
                    733: 
                    734:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DECIMAL", FIELD_TYPE_DECIMAL, CONST_CS | CONST_PERSISTENT);
                    735:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TINY", FIELD_TYPE_TINY, CONST_CS | CONST_PERSISTENT);
                    736:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_SHORT", FIELD_TYPE_SHORT, CONST_CS | CONST_PERSISTENT);
                    737:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_LONG", FIELD_TYPE_LONG, CONST_CS | CONST_PERSISTENT);
                    738:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_FLOAT", FIELD_TYPE_FLOAT, CONST_CS | CONST_PERSISTENT);
                    739:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DOUBLE", FIELD_TYPE_DOUBLE, CONST_CS | CONST_PERSISTENT);
                    740:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_NULL", FIELD_TYPE_NULL, CONST_CS | CONST_PERSISTENT);
                    741:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TIMESTAMP", FIELD_TYPE_TIMESTAMP, CONST_CS | CONST_PERSISTENT);
                    742:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_LONGLONG", FIELD_TYPE_LONGLONG, CONST_CS | CONST_PERSISTENT);
                    743:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_INT24", FIELD_TYPE_INT24, CONST_CS | CONST_PERSISTENT);
                    744:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DATE", FIELD_TYPE_DATE, CONST_CS | CONST_PERSISTENT);
                    745:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TIME", FIELD_TYPE_TIME, CONST_CS | CONST_PERSISTENT);
                    746:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DATETIME", FIELD_TYPE_DATETIME      , CONST_CS | CONST_PERSISTENT);
                    747:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_YEAR", FIELD_TYPE_YEAR, CONST_CS | CONST_PERSISTENT);
                    748:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_NEWDATE", FIELD_TYPE_NEWDATE, CONST_CS | CONST_PERSISTENT);
                    749:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_ENUM", FIELD_TYPE_ENUM, CONST_CS | CONST_PERSISTENT);
                    750:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_SET", FIELD_TYPE_SET, CONST_CS | CONST_PERSISTENT);
                    751:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TINY_BLOB", FIELD_TYPE_TINY_BLOB, CONST_CS | CONST_PERSISTENT);
                    752:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_MEDIUM_BLOB", FIELD_TYPE_MEDIUM_BLOB, CONST_CS | CONST_PERSISTENT);
                    753:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_LONG_BLOB", FIELD_TYPE_LONG_BLOB, CONST_CS | CONST_PERSISTENT);
                    754:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_BLOB", FIELD_TYPE_BLOB, CONST_CS | CONST_PERSISTENT);
                    755:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_VAR_STRING", FIELD_TYPE_VAR_STRING, CONST_CS | CONST_PERSISTENT);
                    756:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_STRING", FIELD_TYPE_STRING, CONST_CS | CONST_PERSISTENT);
                    757:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_CHAR", FIELD_TYPE_CHAR, CONST_CS | CONST_PERSISTENT);
                    758:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_INTERVAL", FIELD_TYPE_INTERVAL, CONST_CS | CONST_PERSISTENT);
                    759:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_GEOMETRY", FIELD_TYPE_GEOMETRY, CONST_CS | CONST_PERSISTENT);
                    760: 
                    761: #if MYSQL_VERSION_ID > 50002 || defined(MYSQLI_USE_MYSQLND)
                    762:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_NEWDECIMAL", FIELD_TYPE_NEWDECIMAL, CONST_CS | CONST_PERSISTENT);
                    763:        REGISTER_LONG_CONSTANT("MYSQLI_TYPE_BIT", FIELD_TYPE_BIT, CONST_CS | CONST_PERSISTENT);
                    764: #endif
                    765: 
                    766:        REGISTER_LONG_CONSTANT("MYSQLI_SET_CHARSET_NAME", MYSQL_SET_CHARSET_NAME, CONST_CS | CONST_PERSISTENT);
                    767:        REGISTER_LONG_CONSTANT("MYSQLI_SET_CHARSET_DIR", MYSQL_SET_CHARSET_DIR, CONST_CS | CONST_PERSISTENT);
                    768: 
                    769:        /* bind support */
                    770:        REGISTER_LONG_CONSTANT("MYSQLI_NO_DATA", MYSQL_NO_DATA, CONST_CS | CONST_PERSISTENT);
                    771: #ifdef MYSQL_DATA_TRUNCATED
                    772:        REGISTER_LONG_CONSTANT("MYSQLI_DATA_TRUNCATED", MYSQL_DATA_TRUNCATED, CONST_CS | CONST_PERSISTENT);
                    773: #endif
                    774: 
                    775:        /* reporting */
                    776:        REGISTER_LONG_CONSTANT("MYSQLI_REPORT_INDEX", MYSQLI_REPORT_INDEX, CONST_CS | CONST_PERSISTENT);
                    777:        REGISTER_LONG_CONSTANT("MYSQLI_REPORT_ERROR", MYSQLI_REPORT_ERROR, CONST_CS | CONST_PERSISTENT);
                    778:        REGISTER_LONG_CONSTANT("MYSQLI_REPORT_STRICT", MYSQLI_REPORT_STRICT, CONST_CS | CONST_PERSISTENT);
                    779:        REGISTER_LONG_CONSTANT("MYSQLI_REPORT_ALL", MYSQLI_REPORT_ALL, CONST_CS | CONST_PERSISTENT);
                    780:        REGISTER_LONG_CONSTANT("MYSQLI_REPORT_OFF", 0, CONST_CS | CONST_PERSISTENT);
                    781: 
                    782:        /* We use non-nested macros with expansion, as VC has problems */
                    783: #ifdef MYSQLI_USE_MYSQLND
                    784:        REGISTER_LONG_CONSTANT("MYSQLI_DEBUG_TRACE_ENABLED", MYSQLND_DBG_ENABLED, CONST_CS | CONST_PERSISTENT);
                    785: #else
                    786: #ifndef DBUG_OFF
                    787:        REGISTER_LONG_CONSTANT("MYSQLI_DEBUG_TRACE_ENABLED", 0, CONST_CS | CONST_PERSISTENT);
                    788: #else
                    789:        REGISTER_LONG_CONSTANT("MYSQLI_DEBUG_TRACE_ENABLED", 1, CONST_CS | CONST_PERSISTENT);
                    790: #endif
                    791: #endif
                    792: 
                    793:        REGISTER_LONG_CONSTANT("MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED", SERVER_QUERY_NO_GOOD_INDEX_USED, CONST_CS | CONST_PERSISTENT);
                    794:        REGISTER_LONG_CONSTANT("MYSQLI_SERVER_QUERY_NO_INDEX_USED", SERVER_QUERY_NO_INDEX_USED, CONST_CS | CONST_PERSISTENT);
                    795: #ifdef SERVER_QUERY_WAS_SLOW
                    796:        REGISTER_LONG_CONSTANT("MYSQLI_SERVER_QUERY_WAS_SLOW", SERVER_QUERY_WAS_SLOW, CONST_CS | CONST_PERSISTENT);
                    797: #endif
                    798: #ifdef SERVER_PS_OUT_PARAMS
                    799:        REGISTER_LONG_CONSTANT("MYSQLI_SERVER_PS_OUT_PARAMS", SERVER_PS_OUT_PARAMS, CONST_CS | CONST_PERSISTENT);
                    800: #endif
                    801: 
                    802:        REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_GRANT",      REFRESH_GRANT, CONST_CS | CONST_PERSISTENT);
                    803:        REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_LOG",        REFRESH_LOG, CONST_CS | CONST_PERSISTENT);
                    804:        REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_TABLES",     REFRESH_TABLES, CONST_CS | CONST_PERSISTENT);
                    805:        REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_HOSTS",      REFRESH_HOSTS, CONST_CS | CONST_PERSISTENT);
                    806:        REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_STATUS",     REFRESH_STATUS, CONST_CS | CONST_PERSISTENT);
                    807:        REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_THREADS",    REFRESH_THREADS, CONST_CS | CONST_PERSISTENT);
                    808:        REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_SLAVE",      REFRESH_SLAVE, CONST_CS | CONST_PERSISTENT);
                    809:        REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_MASTER",     REFRESH_MASTER, CONST_CS | CONST_PERSISTENT);
                    810: #ifdef REFRESH_BACKUP_LOG
                    811:        REGISTER_LONG_CONSTANT("MYSQLI_REFRESH_BACKUP_LOG", REFRESH_BACKUP_LOG, CONST_CS | CONST_PERSISTENT);
                    812: #endif
                    813: 
                    814:        return SUCCESS;
                    815: }
                    816: /* }}} */
                    817: 
                    818: /* {{{ PHP_MSHUTDOWN_FUNCTION
                    819:  */
                    820: PHP_MSHUTDOWN_FUNCTION(mysqli)
                    821: {
                    822: #ifndef MYSQLI_USE_MYSQLND
                    823: #if MYSQL_VERSION_ID >= 40000
                    824: #ifdef PHP_WIN32
                    825:        unsigned long client_ver = mysql_get_client_version();
                    826:        /*
                    827:          Can't call mysql_server_end() multiple times prior to 5.0.46 on Windows.
                    828:          PHP bug#41350 MySQL bug#25621
                    829:        */
                    830:        if ((client_ver >= 50046 && client_ver < 50100) || client_ver > 50122) {
                    831:                mysql_server_end();
                    832:        }
                    833: #else
                    834:        mysql_server_end();
                    835: #endif
                    836: #endif
                    837: #endif
                    838: 
                    839:        zend_hash_destroy(&mysqli_driver_properties);
                    840:        zend_hash_destroy(&mysqli_result_properties);
                    841:        zend_hash_destroy(&mysqli_stmt_properties);
                    842:        zend_hash_destroy(&mysqli_warning_properties);
                    843:        zend_hash_destroy(&mysqli_link_properties);
                    844:        zend_hash_destroy(&classes);
                    845: 
                    846:        UNREGISTER_INI_ENTRIES();
                    847:        return SUCCESS;
                    848: }
                    849: /* }}} */
                    850: 
                    851: /* {{{ PHP_RINIT_FUNCTION
                    852:  */
                    853: PHP_RINIT_FUNCTION(mysqli)
                    854: {
                    855: #if !defined(MYSQLI_USE_MYSQLND) && defined(ZTS) && MYSQL_VERSION_ID >= 40000
                    856:        if (mysql_thread_init()) {
                    857:                return FAILURE;
                    858:        }
                    859: #endif
                    860:        MyG(error_msg) = NULL;
                    861:        MyG(error_no) = 0;
                    862:        MyG(report_mode) = 0;
                    863: 
                    864:        return SUCCESS;
                    865: }
                    866: /* }}} */
                    867: 
                    868: #if defined(A0) && defined(MYSQLI_USE_MYSQLND)
                    869: static void php_mysqli_persistent_helper_for_every(void *p)
                    870: {
                    871:        TSRMLS_FETCH();
                    872:        mysqlnd_end_psession((MYSQLND *) p);
                    873: } /* }}} */
                    874: 
                    875: 
                    876: static int php_mysqli_persistent_helper_once(zend_rsrc_list_entry *le TSRMLS_DC)
                    877: {
                    878:        if (le->type == php_le_pmysqli()) {
                    879:                mysqli_plist_entry *plist = (mysqli_plist_entry *) le->ptr;
                    880:                zend_ptr_stack_apply(&plist->free_links, php_mysqli_persistent_helper_for_every);
                    881:        }
                    882:        return ZEND_HASH_APPLY_KEEP;
                    883: } /* }}} */
                    884: #endif
                    885: 
                    886: 
                    887: /* {{{ PHP_RSHUTDOWN_FUNCTION
                    888:  */
                    889: PHP_RSHUTDOWN_FUNCTION(mysqli)
                    890: {
                    891:        /* check persistent connections, move used to free */
                    892: 
                    893: #if !defined(MYSQLI_USE_MYSQLND) && defined(ZTS) && MYSQL_VERSION_ID >= 40000
                    894:        mysql_thread_end();
                    895: #endif
                    896:        if (MyG(error_msg)) {
                    897:                efree(MyG(error_msg));
                    898:        }
                    899: #if defined(A0) && defined(MYSQLI_USE_MYSQLND)
                    900:        /* psession is being called when the connection is freed - explicitly or implicitly */
                    901:        zend_hash_apply(&EG(persistent_list), (apply_func_t) php_mysqli_persistent_helper_once TSRMLS_CC);
                    902: #endif
                    903:        return SUCCESS;
                    904: }
                    905: /* }}} */
                    906: 
                    907: 
                    908: /* {{{ PHP_MINFO_FUNCTION
                    909:  */
                    910: PHP_MINFO_FUNCTION(mysqli)
                    911: {
                    912:        char buf[32];
                    913: 
                    914:        php_info_print_table_start();
                    915:        php_info_print_table_header(2, "MysqlI Support", "enabled");
                    916:        php_info_print_table_row(2, "Client API library version", mysql_get_client_info());
                    917:        snprintf(buf, sizeof(buf), "%ld", MyG(num_active_persistent));
                    918:        php_info_print_table_row(2, "Active Persistent Links", buf);
                    919:        snprintf(buf, sizeof(buf), "%ld", MyG(num_inactive_persistent));
                    920:        php_info_print_table_row(2, "Inactive Persistent Links", buf);
                    921:        snprintf(buf, sizeof(buf), "%ld", MyG(num_links));
                    922:        php_info_print_table_row(2, "Active Links", buf);
                    923: #if !defined(MYSQLI_USE_MYSQLND)
                    924:        php_info_print_table_row(2, "Client API header version", MYSQL_SERVER_VERSION);
                    925:        php_info_print_table_row(2, "MYSQLI_SOCKET", MYSQL_UNIX_ADDR);
                    926: #endif
                    927:        php_info_print_table_end();
                    928: 
                    929:        DISPLAY_INI_ENTRIES();
                    930: }
                    931: /* }}} */
                    932: 
                    933: 
                    934: /* Dependancies */
                    935: static const  zend_module_dep mysqli_deps[] = {
                    936: #if defined(HAVE_SPL) && ((PHP_MAJOR_VERSION > 5) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 1))
                    937:        ZEND_MOD_REQUIRED("spl")
                    938: #endif
                    939: #if defined(MYSQLI_USE_MYSQLND)
                    940:        ZEND_MOD_REQUIRED("mysqlnd")
                    941: #endif
                    942:        ZEND_MOD_END
                    943: };
                    944: 
                    945: /* {{{ mysqli_module_entry
                    946:  */
                    947: zend_module_entry mysqli_module_entry = {
                    948: #if ZEND_MODULE_API_NO >= 20050922
                    949:        STANDARD_MODULE_HEADER_EX, NULL,
                    950:        mysqli_deps,
                    951: #elif ZEND_MODULE_API_NO >= 20010901
                    952:        STANDARD_MODULE_HEADER,
                    953: #endif
                    954:        "mysqli",
                    955:        mysqli_functions,
                    956:        PHP_MINIT(mysqli),
                    957:        PHP_MSHUTDOWN(mysqli),
                    958:        PHP_RINIT(mysqli),
                    959:        PHP_RSHUTDOWN(mysqli),
                    960:        PHP_MINFO(mysqli),
                    961:        "0.1", /* Replace with version number for your extension */
                    962:        PHP_MODULE_GLOBALS(mysqli),
                    963:        PHP_GINIT(mysqli),
                    964:        NULL,
                    965:        NULL,
                    966:        STANDARD_MODULE_PROPERTIES_EX
                    967: };
                    968: /* }}} */
                    969: 
                    970: #ifdef COMPILE_DL_MYSQLI
                    971: ZEND_GET_MODULE(mysqli)
                    972: #endif
                    973: 
                    974: 
                    975: /* {{{ mixed mysqli_stmt_construct()
                    976: constructor for statement object.
                    977: Parameters:
                    978:   object -> mysqli_stmt_init
                    979:   object, query -> mysqli_prepare
                    980: */
                    981: PHP_FUNCTION(mysqli_stmt_construct)
                    982: {
                    983:        MY_MYSQL                        *mysql;
                    984:        zval                            *mysql_link;
                    985:        MY_STMT                         *stmt;
                    986:        MYSQLI_RESOURCE         *mysqli_resource;
                    987:        char                            *statement;
                    988:        int                                     statement_len;
                    989: 
                    990:        switch (ZEND_NUM_ARGS())
                    991:        {
                    992:                case 1:  /* mysql_stmt_init */
                    993:                        if (zend_parse_parameters(1 TSRMLS_CC, "O", &mysql_link, mysqli_link_class_entry)==FAILURE) {
                    994:                                return;
                    995:                        }
                    996:                        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                    997: 
                    998:                        stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
                    999: 
                   1000:                        stmt->stmt = mysql_stmt_init(mysql->mysql);
                   1001:                break;
                   1002:                case 2:
                   1003:                        if (zend_parse_parameters(2 TSRMLS_CC, "Os", &mysql_link, mysqli_link_class_entry, &statement, &statement_len)==FAILURE) {
                   1004:                                return;
                   1005:                        }
                   1006:                        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                   1007: 
                   1008:                        stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
                   1009: 
                   1010:                        if ((stmt->stmt = mysql_stmt_init(mysql->mysql))) {
                   1011:                                mysql_stmt_prepare(stmt->stmt, (char *)statement, statement_len);
                   1012:                        }
                   1013:                break;
                   1014:                default:
                   1015:                        WRONG_PARAM_COUNT;
                   1016:                break;
                   1017:        }
                   1018: 
                   1019:        if (!stmt->stmt) {
                   1020:                efree(stmt);
                   1021:                RETURN_FALSE;
                   1022:        }
                   1023: 
                   1024:        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
                   1025:        mysqli_resource->ptr = (void *)stmt;
                   1026:        mysqli_resource->status = (ZEND_NUM_ARGS() == 1) ? MYSQLI_STATUS_INITIALIZED : MYSQLI_STATUS_VALID;
                   1027: 
                   1028:        ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
                   1029: }
                   1030: /* }}} */
                   1031: 
                   1032: /* {{{ mixed mysqli_result_construct()
                   1033: constructor for result object.
                   1034: Parameters:
                   1035:   object [, mode] -> mysqli_store/use_result
                   1036: */
                   1037: PHP_FUNCTION(mysqli_result_construct)
                   1038: {
                   1039:        MY_MYSQL                        *mysql;
                   1040:        MYSQL_RES                       *result = NULL;
                   1041:        zval                            *mysql_link;
                   1042:        MYSQLI_RESOURCE         *mysqli_resource;
                   1043:        long                            resmode = MYSQLI_STORE_RESULT;
                   1044: 
                   1045:        switch (ZEND_NUM_ARGS()) {
                   1046:                case 1:
                   1047:                        if (zend_parse_parameters(1 TSRMLS_CC, "O", &mysql_link, mysqli_link_class_entry)==FAILURE) {
                   1048:                                return;
                   1049:                        }
                   1050:                        break;
                   1051:                case 2:
                   1052:                        if (zend_parse_parameters(2 TSRMLS_CC, "Ol", &mysql_link, mysqli_link_class_entry, &resmode)==FAILURE) {
                   1053:                                return;
                   1054:                        }
                   1055:                        break;
                   1056:                default:
                   1057:                        WRONG_PARAM_COUNT;
                   1058:        }
                   1059: 
                   1060:        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                   1061: 
                   1062:        switch (resmode) {
                   1063:                case MYSQLI_STORE_RESULT:
                   1064:                        result = mysql_store_result(mysql->mysql);
                   1065:                        break;
                   1066:                case MYSQLI_USE_RESULT:
                   1067:                        result = mysql_use_result(mysql->mysql);
                   1068:                        break;
                   1069:                default:
                   1070:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value for resultmode");
                   1071:        }
                   1072: 
                   1073:        if (!result) {
                   1074:                RETURN_FALSE;
                   1075:        }
                   1076: 
                   1077:        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
                   1078:        mysqli_resource->ptr = (void *)result;
                   1079:        mysqli_resource->status = MYSQLI_STATUS_VALID;
                   1080: 
                   1081:        ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
                   1082: 
                   1083: }
                   1084: /* }}} */
                   1085: 
                   1086: /* {{{ php_mysqli_fetch_into_hash
                   1087:  */
                   1088: void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags, int into_object)
                   1089: {
                   1090:        MYSQL_RES               *result;
                   1091:        zval                    *mysql_result;
                   1092:        long                    fetchtype;
                   1093:        zval                    *ctor_params = NULL;
                   1094:        zend_class_entry *ce = NULL;
                   1095: #if !defined(MYSQLI_USE_MYSQLND)
                   1096:        unsigned int    i;
                   1097:        MYSQL_FIELD             *fields;
                   1098:        MYSQL_ROW               row;
                   1099:        unsigned long   *field_len;
                   1100:        zend_bool magic_quotes_warning_sent = FALSE;
                   1101: #endif
                   1102: 
                   1103:        if (into_object) {
                   1104:                char *class_name;
                   1105:                int class_name_len;
                   1106: 
                   1107:                if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|sz", &mysql_result, mysqli_result_class_entry, &class_name, &class_name_len, &ctor_params) == FAILURE) {
                   1108:                        return;
                   1109:                }
                   1110:                if (ZEND_NUM_ARGS() < (getThis() ? 1 : 2)) {
                   1111:                        ce = zend_standard_class_def;
                   1112:                } else {
                   1113:                        ce = zend_fetch_class(class_name, class_name_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC);
                   1114:                }
                   1115:                if (!ce) {
                   1116:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not find class '%s'", class_name);
                   1117:                        return;
                   1118:                }
                   1119:                fetchtype = MYSQLI_ASSOC;
                   1120:        } else {
                   1121:                if (override_flags) {
                   1122:                        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
                   1123:                                return;
                   1124:                        }
                   1125:                        fetchtype = override_flags;
                   1126:                } else {
                   1127:                        fetchtype = MYSQLI_BOTH;
                   1128:                        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &fetchtype) == FAILURE) {
                   1129:                                return;
                   1130:                        }
                   1131:                }
                   1132:        }
                   1133:        MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
                   1134: 
                   1135:        if (fetchtype < MYSQLI_ASSOC || fetchtype > MYSQLI_BOTH) {
                   1136:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQLI_NUM, MYSQLI_ASSOC or MYSQLI_BOTH");
                   1137:                RETURN_FALSE;
                   1138:        }
                   1139: 
                   1140: #if !defined(MYSQLI_USE_MYSQLND)
                   1141:        if (!(row = mysql_fetch_row(result))) {
                   1142:                RETURN_NULL();
                   1143:        }
                   1144: 
                   1145:        if (fetchtype & MYSQLI_ASSOC) {
                   1146:                fields = mysql_fetch_fields(result);
                   1147:        }
                   1148: 
                   1149:        array_init(return_value);
                   1150:        field_len = mysql_fetch_lengths(result);
                   1151: 
                   1152:        for (i = 0; i < mysql_num_fields(result); i++) {
                   1153:                if (row[i]) {
                   1154:                        zval *res;
                   1155: 
                   1156:                        MAKE_STD_ZVAL(res);
                   1157: 
                   1158: #if MYSQL_VERSION_ID > 50002
                   1159:                        if (mysql_fetch_field_direct(result, i)->type == MYSQL_TYPE_BIT) {
                   1160:                                my_ulonglong llval;
                   1161:                                char tmp[22];
                   1162:                                switch (field_len[i]) {
                   1163:                                        case 8:llval = (my_ulonglong)  bit_uint8korr(row[i]);break;
                   1164:                                        case 7:llval = (my_ulonglong)  bit_uint7korr(row[i]);break;
                   1165:                                        case 6:llval = (my_ulonglong)  bit_uint6korr(row[i]);break;
                   1166:                                        case 5:llval = (my_ulonglong)  bit_uint5korr(row[i]);break;
                   1167:                                        case 4:llval = (my_ulonglong)  bit_uint4korr(row[i]);break;
                   1168:                                        case 3:llval = (my_ulonglong)  bit_uint3korr(row[i]);break;
                   1169:                                        case 2:llval = (my_ulonglong)  bit_uint2korr(row[i]);break;
                   1170:                                        case 1:llval = (my_ulonglong)  uint1korr(row[i]);break;
                   1171:                                }
                   1172:                                /* even though lval is declared as unsigned, the value
                   1173:                                 * may be negative. Therefor we cannot use MYSQLI_LLU_SPEC and must
                   1174:                                 * use MYSQLI_LL_SPEC.
                   1175:                                 */
                   1176:                                snprintf(tmp, sizeof(tmp), (mysql_fetch_field_direct(result, i)->flags & UNSIGNED_FLAG)? MYSQLI_LLU_SPEC : MYSQLI_LL_SPEC, llval);
                   1177:                                ZVAL_STRING(res, tmp, 1);
                   1178:                        } else
                   1179: #endif
                   1180:                        {
                   1181: 
                   1182:                                /* check if we need magic quotes */
                   1183:                                if (PG(magic_quotes_runtime)) {
                   1184:                                        if (magic_quotes_warning_sent == FALSE) {
                   1185:                                                magic_quotes_warning_sent = TRUE;
                   1186:                                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "magic_quotes_runtime are deprecated since PHP 5.3");
                   1187:                                        }
                   1188:                                        Z_TYPE_P(res) = IS_STRING;
                   1189:                                        Z_STRVAL_P(res) = php_addslashes(row[i], field_len[i], &Z_STRLEN_P(res), 0 TSRMLS_CC);
                   1190:                                } else {
                   1191:                                        ZVAL_STRINGL(res, row[i], field_len[i], 1);
                   1192:                                }
                   1193:                        }
                   1194: 
                   1195:                        if (fetchtype & MYSQLI_NUM) {
                   1196:                                add_index_zval(return_value, i, res);
                   1197:                        }
                   1198:                        if (fetchtype & MYSQLI_ASSOC) {
                   1199:                                if (fetchtype & MYSQLI_NUM) {
                   1200:                                        Z_ADDREF_P(res);
                   1201:                                }
                   1202:                                add_assoc_zval(return_value, fields[i].name, res);
                   1203:                        }
                   1204:                } else {
                   1205:                        if (fetchtype & MYSQLI_NUM) {
                   1206:                                add_index_null(return_value, i);
                   1207:                        }
                   1208:                        if (fetchtype & MYSQLI_ASSOC) {
                   1209:                                add_assoc_null(return_value, fields[i].name);
                   1210:                        }
                   1211:                }
                   1212:        }
                   1213: #else
                   1214:        if (PG(magic_quotes_runtime)) {
                   1215:                HashPosition pos_values;
                   1216:                zval **entry_values;
                   1217:                zval new_return_value;
                   1218:                char * string_key;
                   1219:                uint   string_key_len;
                   1220:                ulong  num_key;
                   1221: 
                   1222:                mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), &new_return_value, MYSQLND_MYSQLI);
                   1223:                if (Z_TYPE(new_return_value) == IS_ARRAY) {
                   1224:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "magic_quotes_runtime are deprecated since PHP 5.3");
                   1225:                        array_init(return_value);
                   1226:                        zend_hash_internal_pointer_reset_ex(Z_ARRVAL(new_return_value), &pos_values);
                   1227:                        while (zend_hash_get_current_data_ex(Z_ARRVAL(new_return_value), (void **)&entry_values, &pos_values) == SUCCESS) {
                   1228:                                if (Z_TYPE_PP(entry_values) == IS_STRING) {
                   1229:                                        int new_str_len;
                   1230:                                        char * new_str = php_addslashes(Z_STRVAL_PP(entry_values), Z_STRLEN_PP(entry_values), &new_str_len, 0 TSRMLS_CC);
                   1231:                                        switch (zend_hash_get_current_key_ex(Z_ARRVAL(new_return_value), &string_key, &string_key_len, &num_key, 0, &pos_values)) {
                   1232:                                                case HASH_KEY_IS_LONG:
                   1233:                                                        add_index_stringl(return_value, num_key, new_str, new_str_len, 0);
                   1234:                                                        break;
                   1235:                                                case HASH_KEY_IS_STRING:
                   1236:                                                        add_assoc_stringl_ex(return_value, string_key, string_key_len, new_str, new_str_len, 0);
                   1237:                                                        break;
                   1238:                                        }
                   1239:                                } else {
                   1240:                                        zval_add_ref(entry_values);
                   1241:                                        switch (zend_hash_get_current_key_ex(Z_ARRVAL(new_return_value), &string_key, &string_key_len, &num_key, 0, &pos_values)) {
                   1242:                                                case HASH_KEY_IS_LONG:
                   1243:                                                        add_index_zval(return_value, num_key, *entry_values);
                   1244:                                                        break;
                   1245:                                                case HASH_KEY_IS_STRING:
                   1246:                                                        add_assoc_zval_ex(return_value, string_key, string_key_len, *entry_values);
                   1247:                                                        break;
                   1248:                                        }
                   1249:                                }
                   1250:                                zend_hash_move_forward_ex(Z_ARRVAL(new_return_value), &pos_values);
                   1251:                        }
                   1252:                } else {
                   1253:                        RETVAL_NULL();
                   1254:                }
                   1255:                zval_dtor(&new_return_value);
                   1256:        } else {
                   1257:                mysqlnd_fetch_into(result, ((fetchtype & MYSQLI_NUM)? MYSQLND_FETCH_NUM:0) | ((fetchtype & MYSQLI_ASSOC)? MYSQLND_FETCH_ASSOC:0), return_value, MYSQLND_MYSQLI);
                   1258:        }
                   1259: 
                   1260: #endif
                   1261: 
                   1262:        if (into_object && Z_TYPE_P(return_value) != IS_NULL) {
                   1263:                zval dataset = *return_value;
                   1264:                zend_fcall_info fci;
                   1265:                zend_fcall_info_cache fcc;
                   1266:                zval *retval_ptr;
                   1267: 
                   1268:                object_and_properties_init(return_value, ce, NULL);
                   1269:                zend_merge_properties(return_value, Z_ARRVAL(dataset), 1 TSRMLS_CC);
                   1270: 
                   1271:                if (ce->constructor) {
                   1272:                        fci.size = sizeof(fci);
                   1273:                        fci.function_table = &ce->function_table;
                   1274:                        fci.function_name = NULL;
                   1275:                        fci.symbol_table = NULL;
                   1276:                        fci.object_ptr = return_value;
                   1277:                        fci.retval_ptr_ptr = &retval_ptr;
                   1278:                        if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) {
                   1279:                                if (Z_TYPE_P(ctor_params) == IS_ARRAY) {
                   1280:                                        HashTable *params_ht = Z_ARRVAL_P(ctor_params);
                   1281:                                        Bucket *p;
                   1282: 
                   1283:                                        fci.param_count = 0;
                   1284:                                        fci.params = safe_emalloc(sizeof(zval*), params_ht->nNumOfElements, 0);
                   1285:                                        p = params_ht->pListHead;
                   1286:                                        while (p != NULL) {
                   1287:                                                fci.params[fci.param_count++] = (zval**)p->pData;
                   1288:                                                p = p->pListNext;
                   1289:                                        }
                   1290:                                } else {
                   1291:                                        /* Two problems why we throw exceptions here: PHP is typeless
                   1292:                                         * and hence passing one argument that's not an array could be
                   1293:                                         * by mistake and the other way round is possible, too. The
                   1294:                                         * single value is an array. Also we'd have to make that one
                   1295:                                         * argument passed by reference.
                   1296:                                         */
                   1297:                                        zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Parameter ctor_params must be an array", 0 TSRMLS_CC);
                   1298:                                        return;
                   1299:                                }
                   1300:                        } else {
                   1301:                                fci.param_count = 0;
                   1302:                                fci.params = NULL;
                   1303:                        }
                   1304:                        fci.no_separation = 1;
                   1305: 
                   1306:                        fcc.initialized = 1;
                   1307:                        fcc.function_handler = ce->constructor;
                   1308:                        fcc.calling_scope = EG(scope);
                   1309:                        fcc.called_scope = Z_OBJCE_P(return_value);
                   1310:                        fcc.object_ptr = return_value;
                   1311: 
                   1312:                        if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) {
                   1313:                                zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Could not execute %s::%s()", ce->name, ce->constructor->common.function_name);
                   1314:                        } else {
                   1315:                                if (retval_ptr) {
                   1316:                                        zval_ptr_dtor(&retval_ptr);
                   1317:                                }
                   1318:                        }
                   1319:                        if (fci.params) {
                   1320:                                efree(fci.params);
                   1321:                        }
                   1322:                } else if (ctor_params) {
                   1323:                        zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Class %s does not have a constructor hence you cannot use ctor_params", ce->name);
                   1324:                }
                   1325:        }
                   1326: }
                   1327: /* }}} */
                   1328: 
                   1329: 
                   1330: #if !defined(MYSQLI_USE_MYSQLND)
                   1331: 
                   1332: #define ALLOC_CALLBACK_ARGS(a, b, c)\
                   1333: if (c) {\
                   1334:        a = (zval ***)safe_emalloc(c, sizeof(zval **), 0);\
                   1335:        for (i = b; i < c; i++) {\
                   1336:                a[i] = emalloc(sizeof(zval *));\
                   1337:                MAKE_STD_ZVAL(*a[i]);\
                   1338:        }\
                   1339: }
                   1340: 
                   1341: #define FREE_CALLBACK_ARGS(a, b, c)\
                   1342: if (a) {\
                   1343:        for (i=b; i < c; i++) {\
                   1344:                zval_ptr_dtor(a[i]);\
                   1345:                efree(a[i]);\
                   1346:        }\
                   1347:        efree(a);\
                   1348: }
                   1349: 
                   1350: #define LOCAL_INFILE_ERROR_MSG(source,dest)\
                   1351:        memset(source, 0, LOCAL_INFILE_ERROR_LEN);\
                   1352:        memcpy(source, dest, MIN(strlen(dest), LOCAL_INFILE_ERROR_LEN-1));\
                   1353:        php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", dest);
                   1354: 
                   1355: 
                   1356: /* {{{ php_local_infile_init
                   1357:  */
                   1358: static int php_local_infile_init(void **ptr, const char *filename, void *userdata)
                   1359: {
                   1360:        mysqli_local_infile                     *data;
                   1361:        MY_MYSQL                                        *mysql;
                   1362:        php_stream_context                      *context = NULL;
                   1363: 
                   1364:        TSRMLS_FETCH();
                   1365: 
                   1366:        /* save pointer to MY_MYSQL structure (userdata) */
                   1367:        if (!(*ptr= data= ((mysqli_local_infile *)calloc(1, sizeof(mysqli_local_infile))))) {
                   1368:                return 1;
                   1369:        }
                   1370: 
                   1371:        if (!(mysql = (MY_MYSQL *)userdata)) {
                   1372:                LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR));
                   1373:                return 1;
                   1374:        }
                   1375: 
                   1376:        /* check open_basedir */
                   1377:        if (PG(open_basedir)) {
                   1378:                if (php_check_open_basedir_ex(filename, 0 TSRMLS_CC) == -1) {
                   1379:                        LOCAL_INFILE_ERROR_MSG(data->error_msg, "open_basedir restriction in effect. Unable to open file");
                   1380:                        return 1;
                   1381:                }
                   1382:        }
                   1383: 
                   1384:        mysql->li_stream = php_stream_open_wrapper_ex((char *)filename, "r", 0, NULL, context);
                   1385: 
                   1386:        if (mysql->li_stream == NULL) {
                   1387:                snprintf((char *)data->error_msg, sizeof(data->error_msg), "Can't find file '%-.64s'.", filename);
                   1388:                return 1;
                   1389:        }
                   1390: 
                   1391:        data->userdata = mysql;
                   1392: 
                   1393:        return 0;
                   1394: }
                   1395: /* }}} */
                   1396: 
                   1397: /* {{{ int php_local_infile_read */
                   1398: static int php_local_infile_read(void *ptr, char *buf, uint buf_len)
                   1399: {
                   1400:        mysqli_local_infile                     *data;
                   1401:        MY_MYSQL                                        *mysql;
                   1402:        zval                                            ***callback_args;
                   1403:        zval                                            *retval;
                   1404:        zval                                            *fp;
                   1405:        int                                                     argc = 4;
                   1406:        int                                                     i;
                   1407:        long                                            rc;
                   1408: 
                   1409:        TSRMLS_FETCH();
                   1410: 
                   1411:        data= (mysqli_local_infile *)ptr;
                   1412:        mysql = data->userdata;
                   1413: 
                   1414:        /* default processing */
                   1415:        if (!mysql->li_read) {
                   1416:                int count = (int)php_stream_read(mysql->li_stream, buf, buf_len);
                   1417: 
                   1418:                if (count < 0) {
                   1419:                        LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(2));
                   1420:                }
                   1421: 
                   1422:                return count;
                   1423:        }
                   1424: 
                   1425:        ALLOC_CALLBACK_ARGS(callback_args, 1, argc);
                   1426: 
                   1427:        /* set parameters: filepointer, buffer, buffer_len, errormsg */
                   1428: 
                   1429:        MAKE_STD_ZVAL(fp);
                   1430:        php_stream_to_zval(mysql->li_stream, fp);
                   1431:        callback_args[0] = &fp;
                   1432:        ZVAL_STRING(*callback_args[1], "", 1);
                   1433:        ZVAL_LONG(*callback_args[2], buf_len);
                   1434:        ZVAL_STRING(*callback_args[3], "", 1);
                   1435: 
                   1436:        if (call_user_function_ex(EG(function_table),
                   1437:                                                NULL,
                   1438:                                                mysql->li_read,
                   1439:                                                &retval,
                   1440:                                                argc,
                   1441:                                                callback_args,
                   1442:                                                0,
                   1443:                                                NULL TSRMLS_CC) == SUCCESS) {
                   1444: 
                   1445:                rc = Z_LVAL_P(retval);
                   1446:                zval_ptr_dtor(&retval);
                   1447: 
                   1448:                if (rc > 0) {
                   1449:                        if (rc >= 0 && rc != Z_STRLEN_P(*callback_args[1])) {
                   1450:                                LOCAL_INFILE_ERROR_MSG(data->error_msg,
                   1451:                                                        "Mismatch between the return value of the callback and the content "
                   1452:                                                        "length of the buffer.");
                   1453:                                rc = -1;
                   1454:                        } else if (rc > buf_len) {
                   1455:                                /* check buffer overflow */
                   1456:                                LOCAL_INFILE_ERROR_MSG(data->error_msg, "Too much data returned");
                   1457:                                rc = -1;
                   1458:                        } else {
                   1459:                                memcpy(buf, Z_STRVAL_P(*callback_args[1]), MIN(rc, Z_STRLEN_P(*callback_args[1])));
                   1460:                        }
                   1461:                } else if (rc < 0) {
                   1462:                        LOCAL_INFILE_ERROR_MSG(data->error_msg, Z_STRVAL_P(*callback_args[3]));
                   1463:                }
                   1464:        } else {
                   1465:                LOCAL_INFILE_ERROR_MSG(data->error_msg, "Can't execute load data local init callback function");
                   1466:                rc = -1;
                   1467:        }
                   1468:        /*
                   1469:          If the (ab)user has closed the file handle we should
                   1470:          not try to use it anymore or even close it
                   1471:        */
                   1472:        if (!zend_rsrc_list_get_rsrc_type(Z_LVAL_P(fp) TSRMLS_CC)) {
                   1473:                LOCAL_INFILE_ERROR_MSG(data->error_msg, "File handle closed");
                   1474:                rc = -1;
                   1475:                /* Thus the end handler won't try to free already freed memory */
                   1476:                mysql->li_stream = NULL;
                   1477:        }
                   1478: 
                   1479:        FREE_CALLBACK_ARGS(callback_args, 1, argc);
                   1480:        efree(fp);
                   1481:        return rc;
                   1482: }
                   1483: /* }}} */
                   1484: 
                   1485: /* {{{ php_local_infile_error
                   1486:  */
                   1487: static int php_local_infile_error(void *ptr, char *error_msg, uint error_msg_len)
                   1488: {
                   1489:        mysqli_local_infile *data = (mysqli_local_infile *) ptr;
                   1490: 
                   1491:        if (data) {
                   1492:                strlcpy(error_msg, data->error_msg, error_msg_len);
                   1493:                return 2000;
                   1494:        }
                   1495:        strlcpy(error_msg, ER(CR_OUT_OF_MEMORY), error_msg_len);
                   1496:        return CR_OUT_OF_MEMORY;
                   1497: }
                   1498: /* }}} */
                   1499: 
                   1500: /* {{{ php_local_infile_end
                   1501:  */
                   1502: static void php_local_infile_end(void *ptr)
                   1503: {
                   1504:        mysqli_local_infile             *data;
                   1505:        MY_MYSQL                                *mysql;
                   1506: 
                   1507:        TSRMLS_FETCH();
                   1508: 
                   1509:        data= (mysqli_local_infile *)ptr;
                   1510: 
                   1511:        if (!data || !(mysql = data->userdata)) {
                   1512:                if (data) {
                   1513:                        free(data);
                   1514:                }
                   1515:                return;
                   1516:        }
                   1517: 
                   1518:        if (mysql->li_stream) {
                   1519:                php_stream_close(mysql->li_stream);
                   1520:        }
                   1521:        free(data);
                   1522:        return;
                   1523: }
                   1524: /* }}} */
                   1525: 
                   1526: 
                   1527: /* {{{ void php_set_local_infile_handler_default
                   1528: */
                   1529: void php_set_local_infile_handler_default(MY_MYSQL *mysql) {
                   1530:        /* register internal callback functions */
                   1531:        mysql_set_local_infile_handler(mysql->mysql, &php_local_infile_init, &php_local_infile_read,
                   1532:                                &php_local_infile_end, &php_local_infile_error, (void *)mysql);
                   1533:        if (mysql->li_read) {
                   1534:                zval_ptr_dtor(&mysql->li_read);
                   1535:                mysql->li_read = NULL;
                   1536:        }
                   1537: }
                   1538: /* }}} */
                   1539: #endif
                   1540: 
                   1541: /*
                   1542:  * Local variables:
                   1543:  * tab-width: 4
                   1544:  * c-basic-offset: 4
                   1545:  * End:
                   1546:  * vim600: noet sw=4 ts=4 fdm=marker
                   1547:  * vim<600: noet sw=4 ts=4
                   1548:  */

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