PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LTP GCOV extension - code coverage report
Current view: directory - mysqli - mysqli_nonapi.c
Test: PHP Code Coverage
Date: 2009-11-23 Instrumented lines: 402
Code covered: 93.8 % Executed lines: 377
Legend: not executed executed

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

Generated by: LTP GCOV extension version 1.5

Generated at Mon, 23 Nov 2009 17:39:32 +0000 (33 hours ago)

Copyright © 2005-2009 The PHP Group
All rights reserved.