Annotation of embedaddon/php/ext/mysqli/mysqli_nonapi.c, revision 1.1.1.5

1.1       misho       1: /*
                      2:   +----------------------------------------------------------------------+
                      3:   | PHP Version 5                                                        |
                      4:   +----------------------------------------------------------------------+
1.1.1.5 ! misho       5:   | Copyright (c) 1997-2014 The PHP Group                                |
1.1       misho       6:   +----------------------------------------------------------------------+
                      7:   | This source file is subject to version 3.01 of the PHP license,      |
                      8:   | that is bundled with this package in the file LICENSE, and is        |
                      9:   | available through the world-wide-web at the following url:           |
                     10:   | http://www.php.net/license/3_01.txt                                  |
                     11:   | If you did not receive a copy of the PHP license and are unable to   |
                     12:   | obtain it through the world-wide-web, please send a note to          |
                     13:   | license@php.net so we can mail you a copy immediately.               |
                     14:   +----------------------------------------------------------------------+
                     15:   | Authors: Georg Richter <georg@php.net>                               |
                     16:   |          Andrey Hristov <andrey@php.net>                             |
                     17:   |          Ulf Wendel <uw@php.net>                                     |
                     18:   +----------------------------------------------------------------------+
                     19: 
1.1.1.2   misho      20:   $Id$
1.1       misho      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 "php_mysqli_structs.h"
                     33: #include "mysqli_priv.h"
                     34: 
                     35: #define SAFE_STR(a) ((a)?a:"")
                     36: 
                     37: #ifndef zend_parse_parameters_none
                     38: #define zend_parse_parameters_none()   \
                     39:         zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")
                     40: #endif
                     41: 
                     42: /* {{{ php_mysqli_set_error
                     43:  */
                     44: static void php_mysqli_set_error(long mysql_errno, char *mysql_err TSRMLS_DC)
                     45: {
                     46:        MyG(error_no) = mysql_errno;
                     47:        if (MyG(error_msg)) {
                     48:                efree(MyG(error_msg));
                     49:        }
                     50:        if(mysql_err && *mysql_err) {
                     51:                MyG(error_msg) = estrdup(mysql_err);
                     52:        } else {
                     53:                MyG(error_msg) = NULL;
                     54:        }
                     55: }
                     56: /* }}} */
                     57: 
                     58: 
                     59: void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_connect, zend_bool in_ctor)
                     60: {
                     61:        MY_MYSQL                        *mysql = NULL;
                     62:        MYSQLI_RESOURCE         *mysqli_resource = NULL;
                     63:        zval                            *object = getThis();
                     64:        char                            *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL;
                     65:        int                                     hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
                     66:        zend_bool                       persistent = FALSE;
                     67:        long                            port = 0, flags = 0;
                     68:        uint                            hash_len;
                     69:        char                            *hash_key = NULL;
                     70:        zend_bool                       new_connection = FALSE;
                     71:        zend_rsrc_list_entry    *le;
                     72:        mysqli_plist_entry *plist = NULL;
                     73:        zend_bool                       self_alloced = 0;
                     74: 
                     75: 
                     76: #if !defined(MYSQL_USE_MYSQLND)
                     77:        if ((MYSQL_VERSION_ID / 100) != (mysql_get_client_version() / 100)) {
                     78:                php_error_docref(NULL TSRMLS_CC, E_WARNING,
                     79:                                                "Headers and client library minor version mismatch. Headers:%d Library:%ld",
                     80:                                                MYSQL_VERSION_ID, mysql_get_client_version());
                     81:        }
                     82: #endif
                     83: 
                     84:        if (getThis() && !ZEND_NUM_ARGS() && in_ctor) {
                     85:                php_mysqli_init(INTERNAL_FUNCTION_PARAM_PASSTHRU);
                     86:                return;
                     87:        }
                     88:        hostname = username = dbname = passwd = socket = NULL;
                     89: 
                     90:        if (!is_real_connect) {
                     91:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ssssls", &hostname, &hostname_len, &username, &username_len,
                     92:                                                                        &passwd, &passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len) == FAILURE) {
                     93:                        return;
                     94:                }
                     95: 
                     96:                if (object && instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) {
                     97:                        mysqli_resource = ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr;
                     98:                        if (mysqli_resource && mysqli_resource->ptr) {
                     99:                                mysql = (MY_MYSQL*) mysqli_resource->ptr;
                    100:                        }
                    101:                }
                    102:                if (!mysql) {
                    103:                        mysql = (MY_MYSQL *) ecalloc(1, sizeof(MY_MYSQL));
                    104:                        self_alloced = 1;
                    105:                }
                    106:                flags |= CLIENT_MULTI_RESULTS; /* needed for mysql_multi_query() */
                    107:        } else {
                    108:                /* We have flags too */
                    109:                if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|sssslsl", &object, mysqli_link_class_entry,
                    110:                                                                                &hostname, &hostname_len, &username, &username_len, &passwd, &passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len,
                    111:                                                                                &flags) == FAILURE) {
                    112:                        return;
                    113:                }
                    114: 
                    115:                mysqli_resource = ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr;
                    116:                MYSQLI_FETCH_RESOURCE_CONN(mysql, &object, MYSQLI_STATUS_INITIALIZED);
                    117: 
                    118:                /* set some required options */
                    119:                flags |= CLIENT_MULTI_RESULTS; /* needed for mysql_multi_query() */
                    120:                /* remove some insecure options */
                    121:                flags &= ~CLIENT_MULTI_STATEMENTS;   /* don't allow multi_queries via connect parameter */
                    122:                if (PG(open_basedir) && PG(open_basedir)[0] != '\0') {
                    123:                        flags &= ~CLIENT_LOCAL_FILES;
                    124:                }
                    125:        }
                    126: 
                    127:        if (!socket_len || !socket) {
                    128:                socket = MyG(default_socket);
                    129:        }
                    130:        if (!port){
                    131:                port = MyG(default_port);
                    132:        }
                    133:        if (!passwd) {
                    134:                passwd = MyG(default_pw);
                    135:                passwd_len = strlen(SAFE_STR(passwd));
                    136:        }
                    137:        if (!username){
                    138:                username = MyG(default_user);
                    139:        }
                    140:        if (!hostname || !hostname_len) {
                    141:                hostname = MyG(default_host);
                    142:        }
                    143: 
                    144:        if (mysql->mysql && mysqli_resource &&
                    145:                (mysqli_resource->status > MYSQLI_STATUS_INITIALIZED))
                    146:        {
                    147:                /* already connected, we should close the connection */
                    148:                php_mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT, mysqli_resource->status TSRMLS_CC);
                    149:        }
                    150: 
                    151:        if (strlen(SAFE_STR(hostname)) > 2 && !strncasecmp(hostname, "p:", 2)) {
                    152:                hostname += 2;
                    153:                if (!MyG(allow_persistent)) {
                    154:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Persistent connections are disabled. Downgrading to normal");
                    155:                } else {
                    156:                        mysql->persistent = persistent = TRUE;
                    157: 
                    158:                        hash_len = spprintf(&hash_key, 0, "mysqli_%s_%s%ld%s%s%s", SAFE_STR(hostname), SAFE_STR(socket),
                    159:                                                                port, SAFE_STR(username), SAFE_STR(dbname),
                    160:                                                                SAFE_STR(passwd));
                    161: 
                    162:                        mysql->hash_key = hash_key;
                    163: 
                    164:                        /* check if we can reuse exisiting connection ... */
                    165:                        if (zend_hash_find(&EG(persistent_list), hash_key, hash_len + 1, (void **)&le) == SUCCESS) {
                    166:                                if (Z_TYPE_P(le) == php_le_pmysqli()) {
                    167:                                        plist = (mysqli_plist_entry *) le->ptr;
                    168: 
                    169:                                        do {
                    170:                                                if (zend_ptr_stack_num_elements(&plist->free_links)) {
                    171:                                                        mysql->mysql = zend_ptr_stack_pop(&plist->free_links);
                    172: 
                    173:                                                        MyG(num_inactive_persistent)--;
                    174:                                                        /* reset variables */
                    175: 
                    176: #ifndef MYSQLI_NO_CHANGE_USER_ON_PCONNECT
1.1.1.2   misho     177:                                                        if (!mysqli_change_user_silent(mysql->mysql, username, passwd, dbname, passwd_len)) {
1.1       misho     178: #else
                    179:                                                        if (!mysql_ping(mysql->mysql)) {
                    180: #endif
                    181: #ifdef MYSQLI_USE_MYSQLND
                    182:                                                                mysqlnd_restart_psession(mysql->mysql);
                    183: #endif
                    184:                                                                MyG(num_active_persistent)++;
                    185:                                                                goto end;
                    186:                                                        } else {
                    187:                                                                mysqli_close(mysql->mysql, MYSQLI_CLOSE_IMPLICIT);
                    188:                                                                mysql->mysql = NULL;
                    189:                                                        }
                    190:                                                }
                    191:                                        } while (0);
                    192:                                }
                    193:                        } else {
                    194:                                zend_rsrc_list_entry le;
                    195:                                le.type = php_le_pmysqli();
                    196:                                le.ptr = plist = calloc(1, sizeof(mysqli_plist_entry));
                    197: 
                    198:                                zend_ptr_stack_init_ex(&plist->free_links, 1);
                    199:                                zend_hash_update(&EG(persistent_list), hash_key, hash_len + 1, (void *)&le, sizeof(le), NULL);
                    200:                        }
                    201:                }
                    202:        }
                    203:        if (MyG(max_links) != -1 && MyG(num_links) >= MyG(max_links)) {
                    204:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MyG(num_links));
                    205:                goto err;
                    206:        }
                    207: 
                    208:        if (persistent && MyG(max_persistent) != -1 &&
                    209:                (MyG(num_active_persistent) + MyG(num_inactive_persistent))>= MyG(max_persistent))
                    210:        {
                    211:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%ld)",
                    212:                                                                MyG(num_active_persistent) + MyG(num_inactive_persistent));
                    213:                goto err;
                    214:        }
                    215:        if (!mysql->mysql) {
                    216: #if !defined(MYSQLI_USE_MYSQLND)
                    217:                if (!(mysql->mysql = mysql_init(NULL))) {
                    218: #else
                    219:                if (!(mysql->mysql = mysqlnd_init(persistent))) {
                    220: #endif
                    221:                        goto err;
                    222:                }
                    223:                new_connection = TRUE;
                    224:        }
                    225: 
                    226: #ifdef HAVE_EMBEDDED_MYSQLI
                    227:        if (hostname_len) {
                    228:                unsigned int external=1;
                    229:                mysql_options(mysql->mysql, MYSQL_OPT_USE_REMOTE_CONNECTION, (char *)&external);
                    230:        } else {
                    231:                mysql_options(mysql->mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, 0);
                    232:        }
                    233: #endif
                    234: 
                    235: #if !defined(MYSQLI_USE_MYSQLND)
                    236:        /* BC for prior to bug fix #53425 */
                    237:        flags |= CLIENT_MULTI_RESULTS;
                    238: 
                    239:        if (mysql_real_connect(mysql->mysql, hostname, username, passwd, dbname, port, socket, flags) == NULL)
                    240: #else
                    241:        if (mysqlnd_connect(mysql->mysql, hostname, username, passwd, passwd_len, dbname, dbname_len,
                    242:                                                port, socket, flags TSRMLS_CC) == NULL)
                    243: #endif
                    244:        {
                    245:                /* Save error messages - for mysqli_connect_error() & mysqli_connect_errno() */
                    246:                php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC);
                    247:                php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC,
                    248:                                                                                "%s", mysql_error(mysql->mysql));
                    249:                if (!is_real_connect) {
                    250:                        /* free mysql structure */
                    251:                        mysqli_close(mysql->mysql, MYSQLI_CLOSE_DISCONNECTED);
                    252:                        mysql->mysql = NULL;
                    253:                }
                    254:                goto err;
                    255:        }
                    256: 
                    257:        /* clear error */
                    258:        php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC);
                    259: 
                    260: #if !defined(MYSQLI_USE_MYSQLND)
                    261:        mysql->mysql->reconnect = MyG(reconnect);
                    262: 
                    263:        /* set our own local_infile handler */
                    264:        php_set_local_infile_handler_default(mysql);
                    265: #endif
                    266: 
                    267:        mysql_options(mysql->mysql, MYSQL_OPT_LOCAL_INFILE, (char *)&MyG(allow_local_infile));
                    268: 
                    269: end:
                    270:        if (!mysqli_resource) {
                    271:                mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
                    272:                mysqli_resource->ptr = (void *)mysql;
                    273:        }
                    274:        mysqli_resource->status = MYSQLI_STATUS_VALID;
                    275: 
                    276:        /* store persistent connection */
                    277:        if (persistent && (new_connection || is_real_connect)) {
                    278:                MyG(num_active_persistent)++;
                    279:        }
                    280: 
                    281:        MyG(num_links)++;
                    282: 
                    283:        mysql->multi_query = 0;
                    284: 
                    285:        if (!object || !instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) {
                    286:                MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);
                    287:        } else {
                    288:                ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr = mysqli_resource;
                    289:        }
                    290:        if (!is_real_connect) {
                    291:                return;
                    292:        } else {
                    293:                RETURN_TRUE;
                    294:        }
                    295: 
                    296: err:
                    297:        if (mysql->hash_key) {
                    298:                efree(mysql->hash_key);
                    299:                mysql->hash_key = NULL;
                    300:                mysql->persistent = FALSE;
                    301:        }
                    302:        if (!is_real_connect && self_alloced) {
                    303:                efree(mysql);
                    304:        }
                    305:        RETVAL_FALSE;
                    306: }
                    307: 
                    308: 
                    309: /* {{{ proto object mysqli_connect([string hostname [,string username [,string passwd [,string dbname [,int port [,string socket]]]]]])
                    310:    Open a connection to a mysql server */
                    311: PHP_FUNCTION(mysqli_connect)
                    312: {
                    313:        mysqli_common_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE, FALSE);
                    314: }
                    315: /* }}} */
                    316: 
                    317: 
                    318: /* {{{ proto object mysqli_link_construct()
                    319:   */
                    320: PHP_FUNCTION(mysqli_link_construct)
                    321: {
                    322:        mysqli_common_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE, TRUE);
                    323: }
                    324: /* }}} */
                    325: 
                    326: 
                    327: /* {{{ proto int mysqli_connect_errno(void)
                    328:    Returns the numerical value of the error message from last connect command */
                    329: PHP_FUNCTION(mysqli_connect_errno)
                    330: {
                    331:        RETURN_LONG(MyG(error_no));
                    332: }
                    333: /* }}} */
                    334: 
                    335: /* {{{ proto string mysqli_connect_error(void)
                    336:    Returns the text of the error message from previous MySQL operation */
                    337: PHP_FUNCTION(mysqli_connect_error)
                    338: {
                    339:        if (MyG(error_msg)) {
                    340:                RETURN_STRING(MyG(error_msg),1);
                    341:        } else {
                    342:                RETURN_NULL();
                    343:        }
                    344: }
                    345: /* }}} */
                    346: 
                    347: 
                    348: /* {{{ proto mixed mysqli_fetch_array (object result [,int resulttype])
                    349:    Fetch a result row as an associative array, a numeric array, or both */
                    350: PHP_FUNCTION(mysqli_fetch_array)
                    351: {
                    352:        php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0);
                    353: }
                    354: /* }}} */
                    355: 
                    356: /* {{{ proto mixed mysqli_fetch_assoc (object result)
                    357:    Fetch a result row as an associative array */
                    358: PHP_FUNCTION(mysqli_fetch_assoc)
                    359: {
                    360:        php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 0);
                    361: }
                    362: /* }}} */
                    363: 
                    364: 
                    365: /* {{{ proto mixed mysqli_fetch_all (object result [,int resulttype])
                    366:    Fetches all result rows as an associative array, a numeric array, or both */
                    367: #if defined(MYSQLI_USE_MYSQLND)
                    368: PHP_FUNCTION(mysqli_fetch_all)
                    369: {
                    370:        MYSQL_RES       *result;
                    371:        zval            *mysql_result;
                    372:        long            mode = MYSQLND_FETCH_NUM;
                    373: 
                    374:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &mode) == FAILURE) {
                    375:                return;
                    376:        }
                    377:        MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
                    378: 
                    379:        if (!mode || (mode & ~MYSQLND_FETCH_BOTH)) {
                    380:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mode can be only MYSQLI_FETCH_NUM, "
                    381:                                 "MYSQLI_FETCH_ASSOC or MYSQLI_FETCH_BOTH");
                    382:                RETURN_FALSE;
                    383:        }
                    384: 
                    385:        mysqlnd_fetch_all(result, mode, return_value);
                    386: }
                    387: /* }}} */
                    388: 
                    389: 
                    390: 
                    391: /* {{{ proto array mysqli_get_client_stats(void)
                    392:    Returns statistics about the zval cache */
                    393: PHP_FUNCTION(mysqli_get_client_stats)
                    394: {
                    395:        if (zend_parse_parameters_none() == FAILURE) {
                    396:                return;
                    397:        }
                    398:        mysqlnd_get_client_stats(return_value);
                    399: }
                    400: /* }}} */
                    401: 
                    402: 
                    403: /* {{{ proto array mysqli_get_connection_stats(void)
                    404:    Returns statistics about the zval cache */
                    405: PHP_FUNCTION(mysqli_get_connection_stats)
                    406: {
                    407:        MY_MYSQL        *mysql;
                    408:        zval            *mysql_link;
                    409: 
                    410:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
                    411:                                                                         &mysql_link, mysqli_link_class_entry) == FAILURE) {
                    412:                return;
                    413:        }
                    414:        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                    415: 
                    416:        mysqlnd_get_connection_stats(mysql->mysql, return_value);
                    417: }
                    418: #endif
                    419: /* }}} */
                    420: 
1.1.1.2   misho     421: /* {{{ proto mixed mysqli_error_list (object connection)
                    422:    Fetches all client errors */
                    423: PHP_FUNCTION(mysqli_error_list)
                    424: {
                    425:        MY_MYSQL        *mysql;
                    426:        zval            *mysql_link;
                    427: 
                    428:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                    429:                return;
                    430:        }
                    431:        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                    432:        array_init(return_value);
                    433: #if defined(MYSQLI_USE_MYSQLND)
                    434:        if (mysql->mysql->data->error_info->error_list) {
                    435:                MYSQLND_ERROR_LIST_ELEMENT * message;
                    436:                zend_llist_position pos;
                    437:                for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(mysql->mysql->data->error_info->error_list, &pos);
                    438:                         message;
                    439:                         message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(mysql->mysql->data->error_info->error_list, &pos)) 
                    440:                {
                    441:                        zval * single_error;
                    442:                        MAKE_STD_ZVAL(single_error);
                    443:                        array_init(single_error);
                    444:                        add_assoc_long_ex(single_error, "errno", sizeof("errno"), message->error_no);
                    445:                        add_assoc_string_ex(single_error, "sqlstate", sizeof("sqlstate"), message->sqlstate, 1);
                    446:                        add_assoc_string_ex(single_error, "error", sizeof("error"), message->error, 1);
                    447:                        add_next_index_zval(return_value, single_error);
                    448:                }
                    449:        }
                    450: #else
                    451:        if (mysql_errno(mysql->mysql)) {
                    452:                zval * single_error;
                    453:                MAKE_STD_ZVAL(single_error);
                    454:                array_init(single_error);
                    455:                add_assoc_long_ex(single_error, "errno", sizeof("errno"), mysql_errno(mysql->mysql));
                    456:                add_assoc_string_ex(single_error, "sqlstate", sizeof("sqlstate"), mysql_sqlstate(mysql->mysql), 1);
                    457:                add_assoc_string_ex(single_error, "error", sizeof("error"), mysql_error(mysql->mysql), 1);
                    458:                add_next_index_zval(return_value, single_error);
                    459:        }
                    460: #endif
                    461: }
                    462: /* }}} */
                    463: 
                    464: 
                    465: /* {{{ proto string mysqli_stmt_error_list(object stmt)
                    466: */
                    467: PHP_FUNCTION(mysqli_stmt_error_list)
                    468: {
                    469:        MY_STMT *stmt;
                    470:        zval    *mysql_stmt;
                    471: 
                    472:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                    473:                return;
                    474:        }
                    475:        MYSQLI_FETCH_RESOURCE_STMT(stmt, &mysql_stmt, MYSQLI_STATUS_INITIALIZED);
                    476:        array_init(return_value);
                    477: #if defined(MYSQLI_USE_MYSQLND)
                    478:        if (stmt->stmt && stmt->stmt->data && stmt->stmt->data->error_info->error_list) {
                    479:                MYSQLND_ERROR_LIST_ELEMENT * message;
                    480:                zend_llist_position pos;
                    481:                for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(stmt->stmt->data->error_info->error_list, &pos);
                    482:                         message;
                    483:                         message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(stmt->stmt->data->error_info->error_list, &pos)) 
                    484:                {
                    485:                        zval * single_error;
                    486:                        MAKE_STD_ZVAL(single_error);
                    487:                        array_init(single_error);
                    488:                        add_assoc_long_ex(single_error, "errno", sizeof("errno"), message->error_no);
                    489:                        add_assoc_string_ex(single_error, "sqlstate", sizeof("sqlstate"), message->sqlstate, 1);
                    490:                        add_assoc_string_ex(single_error, "error", sizeof("error"), message->error, 1);
                    491:                        add_next_index_zval(return_value, single_error);
                    492:                }
                    493:        }
                    494: #else
                    495:        if (mysql_stmt_errno(stmt->stmt)) {
                    496:                zval * single_error;
                    497:                MAKE_STD_ZVAL(single_error);
                    498:                array_init(single_error);
                    499:                add_assoc_long_ex(single_error, "errno", sizeof("errno"), mysql_stmt_errno(stmt->stmt));
                    500:                add_assoc_string_ex(single_error, "sqlstate", sizeof("sqlstate"), mysql_stmt_sqlstate(stmt->stmt), 1);
                    501:                add_assoc_string_ex(single_error, "error", sizeof("error"), mysql_stmt_error(stmt->stmt), 1);
                    502:                add_next_index_zval(return_value, single_error);
                    503:        }
                    504: #endif
                    505: }
                    506: /* }}} */
                    507: 
1.1       misho     508: 
                    509: /* {{{ proto mixed mysqli_fetch_object (object result [, string class_name [, NULL|array ctor_params]])
                    510:    Fetch a result row as an object */
                    511: PHP_FUNCTION(mysqli_fetch_object)
                    512: {
                    513:        php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 1);
                    514: }
                    515: /* }}} */
                    516: 
                    517: /* {{{ proto bool mysqli_multi_query(object link, string query)
                    518:    allows to execute multiple queries  */
                    519: PHP_FUNCTION(mysqli_multi_query)
                    520: {
                    521:        MY_MYSQL        *mysql;
                    522:        zval            *mysql_link;
                    523:        char            *query = NULL;
                    524:        int             query_len;
                    525: 
                    526:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
                    527:                return;
                    528:        }
                    529:        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                    530: 
                    531:        MYSQLI_ENABLE_MQ;
                    532:        if (mysql_real_query(mysql->mysql, query, query_len)) {
                    533: #ifndef MYSQLI_USE_MYSQLND
                    534:                char s_error[MYSQL_ERRMSG_SIZE], s_sqlstate[SQLSTATE_LENGTH+1];
                    535:                unsigned int s_errno;
                    536:                /* we have to save error information, cause
                    537:                MYSQLI_DISABLE_MQ will reset error information */
                    538:                strcpy(s_error, mysql_error(mysql->mysql));
                    539:                strcpy(s_sqlstate, mysql_sqlstate(mysql->mysql));
                    540:                s_errno = mysql_errno(mysql->mysql);
                    541: #else
1.1.1.2   misho     542:                MYSQLND_ERROR_INFO error_info = *mysql->mysql->data->error_info;
1.1       misho     543: #endif
                    544:                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
                    545:                MYSQLI_DISABLE_MQ;
                    546: 
                    547: #ifndef MYSQLI_USE_MYSQLND
                    548:                /* restore error information */
                    549:                strcpy(mysql->mysql->net.last_error, s_error);
                    550:                strcpy(mysql->mysql->net.sqlstate, s_sqlstate);
                    551:                mysql->mysql->net.last_errno = s_errno;
                    552: #else
1.1.1.2   misho     553:                *mysql->mysql->data->error_info = error_info;
1.1       misho     554: #endif
                    555:                RETURN_FALSE;
                    556:        }
                    557:        RETURN_TRUE;
                    558: }
                    559: /* }}} */
                    560: 
                    561: /* {{{ proto mixed mysqli_query(object link, string query [,int resultmode]) */
                    562: PHP_FUNCTION(mysqli_query)
                    563: {
                    564:        MY_MYSQL                        *mysql;
                    565:        zval                            *mysql_link;
                    566:        MYSQLI_RESOURCE         *mysqli_resource;
1.1.1.4   misho     567:        MYSQL_RES                       *result = NULL;
1.1       misho     568:        char                            *query = NULL;
                    569:        int                             query_len;
                    570:        long                            resultmode = MYSQLI_STORE_RESULT;
                    571: 
                    572:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|l", &mysql_link, mysqli_link_class_entry, &query, &query_len, &resultmode) == FAILURE) {
                    573:                return;
                    574:        }
                    575: 
                    576:        if (!query_len) {
                    577:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty query");
                    578:                RETURN_FALSE;
                    579:        }
                    580:        if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_STORE_RESULT) {
                    581:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value for resultmode");
                    582:                RETURN_FALSE;
                    583:        }
                    584: 
                    585:        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                    586: 
                    587:        MYSQLI_DISABLE_MQ;
                    588: 
                    589: 
                    590: #ifdef MYSQLI_USE_MYSQLND
                    591:        if (resultmode & MYSQLI_ASYNC) {
                    592:                if (mysqli_async_query(mysql->mysql, query, query_len)) {
                    593:                        MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
                    594:                        RETURN_FALSE;
                    595:                }
                    596:                mysql->async_result_fetch_type = resultmode & ~MYSQLI_ASYNC;
                    597:                RETURN_TRUE;
                    598:        }
                    599: #endif
                    600: 
                    601:        if (mysql_real_query(mysql->mysql, query, query_len)) {
                    602:                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
                    603:                RETURN_FALSE;
                    604:        }
                    605: 
                    606:        if (!mysql_field_count(mysql->mysql)) {
                    607:                /* no result set - not a SELECT */
                    608:                if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
                    609:                        php_mysqli_report_index(query, mysqli_server_status(mysql->mysql) TSRMLS_CC);
                    610:                }
                    611:                RETURN_TRUE;
                    612:        }
                    613: 
                    614:        switch (resultmode) {
                    615:                case MYSQLI_STORE_RESULT:
                    616:                        result = mysql_store_result(mysql->mysql);
                    617:                        break;
                    618:                case MYSQLI_USE_RESULT:
                    619:                        result = mysql_use_result(mysql->mysql);
                    620:                        break;
                    621:        }
                    622:        if (!result) {
                    623:                php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC,
                    624:                                                                                "%s", mysql_error(mysql->mysql));
                    625:                RETURN_FALSE;
                    626:        }
                    627: 
                    628:        if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
                    629:                php_mysqli_report_index(query, mysqli_server_status(mysql->mysql) TSRMLS_CC);
                    630:        }
                    631: 
                    632:        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
                    633:        mysqli_resource->ptr = (void *)result;
                    634:        mysqli_resource->status = MYSQLI_STATUS_VALID;
                    635:        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
                    636: }
                    637: /* }}} */
                    638: 
                    639: 
                    640: #if defined(MYSQLI_USE_MYSQLND)
                    641: #include "php_network.h"
                    642: /* {{{ mysqlnd_zval_array_to_mysqlnd_array functions */
                    643: static int mysqlnd_zval_array_to_mysqlnd_array(zval *in_array, MYSQLND ***out_array TSRMLS_DC)
                    644: {
                    645:        zval **elem;
                    646:        int i = 0, current = 0;
                    647: 
                    648:        if (Z_TYPE_P(in_array) != IS_ARRAY) {
                    649:                return 0;
                    650:        }
                    651:        *out_array = ecalloc(zend_hash_num_elements(Z_ARRVAL_P(in_array)) + 1, sizeof(MYSQLND *));
                    652:        for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(in_array));
                    653:                 zend_hash_get_current_data(Z_ARRVAL_P(in_array), (void **) &elem) == SUCCESS;
                    654:                 zend_hash_move_forward(Z_ARRVAL_P(in_array))) {
                    655:                i++;
                    656:                if (Z_TYPE_PP(elem) != IS_OBJECT ||
                    657:                        !instanceof_function(Z_OBJCE_PP(elem), mysqli_link_class_entry TSRMLS_CC)) {
                    658:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter %d not a mysqli object", i);
                    659:                } else {
                    660:                        MY_MYSQL *mysql;
                    661:                        MYSQLI_RESOURCE *my_res;
                    662:                        mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*elem TSRMLS_CC);
                    663:                        if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) {
                    664:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "[%d] Couldn't fetch %s", i, intern->zo.ce->name);
                    665:                                continue;
                    666:                        }
                    667:                        mysql = (MY_MYSQL*) my_res->ptr;
                    668:                        if (MYSQLI_STATUS_VALID && my_res->status < MYSQLI_STATUS_VALID) {
                    669:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object %d or resource %s", i, intern->zo.ce->name);
                    670:                                continue;
                    671:                        }
                    672:                        (*out_array)[current++] = mysql->mysql;
                    673:                }
                    674:        }
                    675:        return 0;
                    676: }
                    677: /* }}} */
                    678: 
                    679: 
                    680: /* {{{ mysqlnd_zval_array_from_mysqlnd_array */
                    681: static int mysqlnd_zval_array_from_mysqlnd_array(MYSQLND **in_array, zval *out_array TSRMLS_DC)
                    682: {
                    683:        MYSQLND **p = in_array;
                    684:        HashTable *new_hash;
                    685:        zval **elem, **dest_elem;
1.1.1.3   misho     686:        int ret = 0, i = 0;
1.1       misho     687: 
                    688:        ALLOC_HASHTABLE(new_hash);
                    689:        zend_hash_init(new_hash, zend_hash_num_elements(Z_ARRVAL_P(out_array)), NULL, ZVAL_PTR_DTOR, 0);
                    690: 
                    691:        for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(out_array));
                    692:                 zend_hash_get_current_data(Z_ARRVAL_P(out_array), (void **) &elem) == SUCCESS;
                    693:                 zend_hash_move_forward(Z_ARRVAL_P(out_array)))
                    694:        {
1.1.1.3   misho     695:                i++;
1.1       misho     696:                if (Z_TYPE_PP(elem) != IS_OBJECT || !instanceof_function(Z_OBJCE_PP(elem), mysqli_link_class_entry TSRMLS_CC)) {
                    697:                        continue;
                    698:                }
                    699:                {
                    700:                        MY_MYSQL *mysql;
1.1.1.3   misho     701:                        MYSQLI_RESOURCE *my_res;
1.1       misho     702:                        mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*elem TSRMLS_CC);
1.1.1.3   misho     703:                        if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) {
                    704:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "[%d] Couldn't fetch %s", i, intern->zo.ce->name);
                    705:                                continue;
                    706:                        }
                    707:                        mysql = (MY_MYSQL *) my_res->ptr;
1.1       misho     708:                        if (mysql->mysql == *p) {
                    709:                                zend_hash_next_index_insert(new_hash, (void *)elem, sizeof(zval *), (void **)&dest_elem);
                    710:                                if (dest_elem) {
                    711:                                        zval_add_ref(dest_elem);
                    712:                                }
                    713:                                ret++;
                    714:                                p++;
                    715:                        }
                    716:                }
                    717:        }
                    718: 
                    719:        /* destroy old array and add new one */
                    720:        zend_hash_destroy(Z_ARRVAL_P(out_array));
                    721:        efree(Z_ARRVAL_P(out_array));
                    722: 
                    723:        zend_hash_internal_pointer_reset(new_hash);
                    724:        Z_ARRVAL_P(out_array) = new_hash;
                    725: 
                    726:        return 0;
                    727: }
                    728: /* }}} */
                    729: 
                    730: 
                    731: /* {{{ mysqlnd_dont_poll_zval_array_from_mysqlnd_array */
                    732: static int mysqlnd_dont_poll_zval_array_from_mysqlnd_array(MYSQLND **in_array, zval *in_zval_array, zval *out_array TSRMLS_DC)
                    733: {
                    734:        MYSQLND **p = in_array;
                    735:        HashTable *new_hash;
                    736:        zval **elem, **dest_elem;
                    737:        int ret = 0;
                    738: 
                    739:        ALLOC_HASHTABLE(new_hash);
                    740:        zend_hash_init(new_hash, zend_hash_num_elements(Z_ARRVAL_P(in_zval_array)), NULL, ZVAL_PTR_DTOR, 0);
                    741:        if (in_array) {
                    742:                for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(in_zval_array));
                    743:                         zend_hash_get_current_data(Z_ARRVAL_P(in_zval_array), (void **) &elem) == SUCCESS;
                    744:                         zend_hash_move_forward(Z_ARRVAL_P(in_zval_array)))
                    745:                {
                    746:                        MY_MYSQL *mysql;
                    747:                        mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*elem TSRMLS_CC);
                    748:                        mysql = (MY_MYSQL *) ((MYSQLI_RESOURCE *)intern->ptr)->ptr;
                    749:                        if (mysql->mysql == *p) {
                    750:                                zend_hash_next_index_insert(new_hash, (void *)elem, sizeof(zval *), (void **)&dest_elem);
                    751:                                if (dest_elem) {
                    752:                                        zval_add_ref(dest_elem);
                    753:                                }
                    754:                                ret++;
                    755:                                p++;
                    756:                        }
                    757:                }
                    758:        }
                    759: 
                    760:        /* destroy old array and add new one */
                    761:        zend_hash_destroy(Z_ARRVAL_P(out_array));
                    762:        efree(Z_ARRVAL_P(out_array));
                    763: 
                    764:        zend_hash_internal_pointer_reset(new_hash);
                    765:        Z_ARRVAL_P(out_array) = new_hash;
                    766: 
                    767:        return 0;
                    768: }
                    769: /* }}} */
                    770: 
                    771: 
                    772: /* {{{ proto int mysqli_poll(array read, array write, array error, long sec [, long usec]) U
                    773:    Poll connections */
                    774: PHP_FUNCTION(mysqli_poll)
                    775: {
                    776:        zval                    *r_array, *e_array, *dont_poll_array;
                    777:        MYSQLND                 **new_r_array = NULL, **new_e_array = NULL, **new_dont_poll_array = NULL;
                    778:        long                    sec = 0, usec = 0;
                    779:        enum_func_status ret;
1.1.1.5 ! misho     780:        int                     desc_num;
1.1       misho     781: 
                    782:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a!a!al|l", &r_array, &e_array, &dont_poll_array, &sec, &usec) == FAILURE) {
                    783:                return;
                    784:        }
                    785:        if (sec < 0 || usec < 0) {
                    786:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Negative values passed for sec and/or usec");
                    787:                RETURN_FALSE;
                    788:        }
                    789: 
1.1.1.3   misho     790:        if (!r_array && !e_array) {
                    791:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "No stream arrays were passed");
                    792:                RETURN_FALSE;
                    793:        }
                    794: 
1.1       misho     795:        if (r_array != NULL) {
                    796:                mysqlnd_zval_array_to_mysqlnd_array(r_array, &new_r_array TSRMLS_CC);
                    797:        }
                    798:        if (e_array != NULL) {
                    799:                mysqlnd_zval_array_to_mysqlnd_array(e_array, &new_e_array TSRMLS_CC);
                    800:        }
                    801: 
                    802:        ret = mysqlnd_poll(new_r_array, new_e_array, &new_dont_poll_array, sec, usec, &desc_num);
                    803: 
                    804:        mysqlnd_dont_poll_zval_array_from_mysqlnd_array(r_array != NULL ? new_dont_poll_array:NULL, r_array, dont_poll_array TSRMLS_CC);
                    805: 
                    806:        if (r_array != NULL) {
                    807:                mysqlnd_zval_array_from_mysqlnd_array(new_r_array, r_array TSRMLS_CC);
                    808:        }
                    809:        if (e_array != NULL) {
                    810:                mysqlnd_zval_array_from_mysqlnd_array(new_e_array, e_array TSRMLS_CC);
                    811:        }
                    812: 
                    813:        if (new_dont_poll_array) {
                    814:                efree(new_dont_poll_array);
                    815:        }
                    816:        if (new_r_array) {
                    817:                efree(new_r_array);
                    818:        }
                    819:        if (new_e_array) {
                    820:                efree(new_e_array);
                    821:        }
                    822:        if (ret == PASS) {
                    823:                RETURN_LONG(desc_num);
                    824:        } else {
                    825:                RETURN_FALSE;
                    826:        }
                    827: }
                    828: /* }}} */
                    829: 
                    830: 
                    831: /* {{{ proto int mysqli_reap_async_query(object link) U
                    832:    Poll connections */
                    833: PHP_FUNCTION(mysqli_reap_async_query)
                    834: {
                    835:        MY_MYSQL                *mysql;
                    836:        zval                    *mysql_link;
                    837:        MYSQLI_RESOURCE         *mysqli_resource;
1.1.1.4   misho     838:        MYSQL_RES                       *result = NULL;
1.1       misho     839: 
                    840:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                    841:                return;
                    842:        }
                    843: 
                    844:        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                    845: 
                    846:        if (FAIL == mysqlnd_reap_async_query(mysql->mysql)) {
                    847:                RETURN_FALSE;
                    848:        }
                    849: 
                    850:        if (!mysql_field_count(mysql->mysql)) {
                    851:                /* no result set - not a SELECT */
                    852:                if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
                    853: /*                     php_mysqli_report_index("n/a", mysqli_server_status(mysql->mysql) TSRMLS_CC); */
                    854:                }
                    855:                RETURN_TRUE;
                    856:        }
                    857: 
                    858:        switch (mysql->async_result_fetch_type) {
                    859:                case MYSQLI_STORE_RESULT:
                    860:                        result = mysql_store_result(mysql->mysql);
                    861:                        break;
                    862:                case MYSQLI_USE_RESULT:
                    863:                        result = mysql_use_result(mysql->mysql);
                    864:                        break;
                    865:        }
                    866: 
                    867:        if (!result) {
                    868:                php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC,
                    869:                                                                                "%s", mysql_error(mysql->mysql));
                    870:                RETURN_FALSE;
                    871:        }
                    872: 
                    873:        if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
                    874: /*             php_mysqli_report_index("n/a", mysqli_server_status(mysql->mysql) TSRMLS_CC); */
                    875:        }
                    876: 
                    877:        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
                    878:        mysqli_resource->ptr = (void *)result;
                    879:        mysqli_resource->status = MYSQLI_STATUS_VALID;
                    880:        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
                    881: }
                    882: /* }}} */
                    883: 
                    884: 
                    885: /* {{{ proto object mysqli_stmt_get_result(object link) U
                    886:    Buffer result set on client */
                    887: PHP_FUNCTION(mysqli_stmt_get_result)
                    888: {
                    889:        MYSQL_RES               *result;
                    890:        MYSQLI_RESOURCE *mysqli_resource;
                    891:        MY_STMT                 *stmt;
                    892:        zval                    *mysql_stmt;
                    893: 
                    894:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                    895:                return;
                    896:        }
                    897:        MYSQLI_FETCH_RESOURCE_STMT(stmt, &mysql_stmt, MYSQLI_STATUS_VALID);
                    898: 
                    899:        if (!(result = mysqlnd_stmt_get_result(stmt->stmt))) {
                    900:                MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
                    901:                RETURN_FALSE;
                    902:        }
                    903: 
                    904:        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
                    905:        mysqli_resource->ptr = (void *)result;
                    906:        mysqli_resource->status = MYSQLI_STATUS_VALID;
                    907:        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
                    908: }
                    909: /* }}} */
                    910: #endif
                    911: 
                    912: 
                    913: /* {{{ proto object mysqli_get_warnings(object link) */
                    914: PHP_FUNCTION(mysqli_get_warnings)
                    915: {
                    916:        MY_MYSQL                        *mysql;
                    917:        zval                            *mysql_link;
                    918:        MYSQLI_RESOURCE         *mysqli_resource;
                    919:        MYSQLI_WARNING          *w;
                    920: 
                    921:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                    922:                return;
                    923:        }
                    924:        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                    925: 
                    926:        if (mysql_warning_count(mysql->mysql)) {
1.1.1.2   misho     927: #ifdef MYSQLI_USE_MYSQLND
                    928:                w = php_get_warnings(mysql->mysql->data TSRMLS_CC);
                    929: #else
1.1       misho     930:                w = php_get_warnings(mysql->mysql TSRMLS_CC);
1.1.1.2   misho     931: #endif
1.1       misho     932:        } else {
                    933:                RETURN_FALSE;
                    934:        }
                    935:        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
                    936:        mysqli_resource->ptr = mysqli_resource->info = (void *)w;
                    937:        mysqli_resource->status = MYSQLI_STATUS_VALID;
                    938:        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);
                    939: }
                    940: /* }}} */
                    941: 
1.1.1.2   misho     942: 
1.1       misho     943: /* {{{ proto object mysqli_stmt_get_warnings(object link) */
                    944: PHP_FUNCTION(mysqli_stmt_get_warnings)
                    945: {
                    946:        MY_STMT                         *stmt;
                    947:        zval                            *stmt_link;
                    948:        MYSQLI_RESOURCE         *mysqli_resource;
                    949:        MYSQLI_WARNING          *w;
                    950: 
                    951:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &stmt_link, mysqli_stmt_class_entry) == FAILURE) {
                    952:                return;
                    953:        }
                    954:        MYSQLI_FETCH_RESOURCE_STMT(stmt, &stmt_link, MYSQLI_STATUS_VALID);
                    955: 
                    956:        if (mysqli_stmt_warning_count(stmt->stmt)) {
                    957:                w = php_get_warnings(mysqli_stmt_get_connection(stmt->stmt) TSRMLS_CC);
                    958:        } else {
                    959:                RETURN_FALSE;
                    960:        }
                    961:        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
                    962:        mysqli_resource->ptr = mysqli_resource->info = (void *)w;
                    963:        mysqli_resource->status = MYSQLI_STATUS_VALID;
                    964:        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);
                    965: }
                    966: /* }}} */
                    967: 
1.1.1.2   misho     968: 
1.1       misho     969: #ifdef HAVE_MYSQLI_SET_CHARSET
                    970: /* {{{ proto bool mysqli_set_charset(object link, string csname)
                    971:    sets client character set */
                    972: PHP_FUNCTION(mysqli_set_charset)
                    973: {
                    974:        MY_MYSQL        *mysql;
                    975:        zval            *mysql_link;
                    976:        char            *cs_name;
                    977:        int                     csname_len;
                    978: 
                    979:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &cs_name, &csname_len) == FAILURE) {
                    980:                return;
                    981:        }
                    982:        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                    983: 
                    984:        if (mysql_set_character_set(mysql->mysql, cs_name)) {
                    985:                RETURN_FALSE;
                    986:        }
                    987:        RETURN_TRUE;
                    988: }
                    989: /* }}} */
                    990: #endif
                    991: 
                    992: #ifdef HAVE_MYSQLI_GET_CHARSET
                    993: /* {{{ proto object mysqli_get_charset(object link) U
                    994:    returns a character set object */
                    995: PHP_FUNCTION(mysqli_get_charset)
                    996: {
                    997:        MY_MYSQL                                *mysql;
                    998:        zval                                    *mysql_link;
                    999:        const char                              *name = NULL, *collation = NULL, *dir = NULL, *comment = NULL;
                   1000:        uint                                    minlength, maxlength, number, state;
                   1001: #if !defined(MYSQLI_USE_MYSQLND)
                   1002:        MY_CHARSET_INFO                 cs;
                   1003: #else
                   1004:        const MYSQLND_CHARSET   *cs;
                   1005: #endif
                   1006: 
                   1007:        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                   1008:                return;
                   1009:        }
                   1010:        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
                   1011: 
                   1012: 
                   1013: #if !defined(MYSQLI_USE_MYSQLND)
                   1014:        mysql_get_character_set_info(mysql->mysql, &cs);
                   1015:        name = (char *)cs.csname;
                   1016:        collation = (char *)cs.name;
                   1017:        dir = (char *)cs.dir;
                   1018:        minlength = cs.mbminlen;
                   1019:        maxlength = cs.mbmaxlen;
                   1020:        number = cs.number;
                   1021:        state = cs.state;
                   1022:        comment = cs.comment;
                   1023: #else
1.1.1.2   misho    1024:        cs = mysql->mysql->data->charset;
1.1       misho    1025:        if (!cs) {
                   1026:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "The connection has no charset associated");
                   1027:                RETURN_NULL();
                   1028:        }
                   1029:        name = cs->name;
                   1030:        collation = cs->collation;
                   1031:        minlength = cs->char_minlen;
                   1032:        maxlength = cs->char_maxlen;
                   1033:        number = cs->nr;
                   1034:        comment = cs->comment;
                   1035:        state = 1;      /* all charsets are compiled in */
                   1036: #endif
                   1037:        object_init(return_value);
                   1038: 
                   1039:        add_property_string(return_value, "charset", (name) ? (char *)name : "", 1);
                   1040:        add_property_string(return_value, "collation",(collation) ? (char *)collation : "", 1);
                   1041:        add_property_string(return_value, "dir", (dir) ? (char *)dir : "", 1);
                   1042:        add_property_long(return_value, "min_length", minlength);
                   1043:        add_property_long(return_value, "max_length", maxlength);
                   1044:        add_property_long(return_value, "number", number);
                   1045:        add_property_long(return_value, "state", state);
                   1046:        add_property_string(return_value, "comment", (comment) ? (char *)comment : "", 1);
                   1047: }
                   1048: /* }}} */
                   1049: #endif
                   1050: 
                   1051: /*
                   1052:  * Local variables:
                   1053:  * tab-width: 4
                   1054:  * c-basic-offset: 4
                   1055:  * End:
                   1056:  * vim600: noet sw=4 ts=4 fdm=marker
                   1057:  * vim<600: noet sw=4 ts=4
                   1058:  */

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