~clint-fewbar/ubuntu/precise/php5/php5-5.4-merge

« back to all changes in this revision

Viewing changes to ext/mysqli/mysqli_nonapi.c

  • Committer: Package Import Robot
  • Author(s): Chuck Short
  • Date: 2011-02-22 09:46:37 UTC
  • mfrom: (1.1.20) (0.3.18 sid)
  • Revision ID: package-import@ubuntu.com-20110222094637-nlu2tvb7oqgaarl0
Tags: 5.3.5-1ubuntu1
* Merge from debian/unstable. Remaining changes:
 - debian/control:
    * Dropped firebird2.1-dev, libc-client-dev, libmcrypt-dev as it is in universe.
    * Dropped libmysqlclient15-dev, build against mysql 5.1.
    * Dropped libcurl-dev not in the archive.
    * Suggest php5-suhosin rather than recommends.
    * Dropped php5-imap, php5-interbase, php5-mcrypt since we have versions 
      already in universe.
    * Dropped libonig-dev and libqgdbm since its in universe. (will be re-added in lucid+1)
    * Dropped locales-all.
  - modulelist: Drop imap, interbase, sybase, and mcrypt.
  - debian/rules:
    * Dropped building of mcrypt, imap, and interbase.
    * Install apport hook for php5.
    * stop mysql instance on clean just in case we failed in tests

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
  |          Ulf Wendel <uw@php.net>                                     |
18
18
  +----------------------------------------------------------------------+
19
19
 
20
 
  $Id: mysqli_nonapi.c 299771 2010-05-26 07:28:43Z andrey $ 
 
20
  $Id: mysqli_nonapi.c 305244 2010-11-10 13:57:09Z andrey $
21
21
*/
22
22
 
23
23
#ifdef HAVE_CONFIG_H
30
30
#include "php_ini.h"
31
31
#include "ext/standard/info.h"
32
32
#include "php_mysqli_structs.h"
 
33
#include "mysqli_priv.h"
33
34
 
34
35
#define SAFE_STR(a) ((a)?a:"")
35
36
 
46
47
        if (MyG(error_msg)) {
47
48
                efree(MyG(error_msg));
48
49
        }
49
 
        if(mysql_err && *mysql_err) { 
 
50
        if(mysql_err && *mysql_err) {
50
51
                MyG(error_msg) = estrdup(mysql_err);
51
52
        } else {
52
53
                MyG(error_msg) = NULL;
61
62
        MYSQLI_RESOURCE         *mysqli_resource = NULL;
62
63
        zval                            *object = getThis();
63
64
        char                            *hostname = NULL, *username=NULL, *passwd=NULL, *dbname=NULL, *socket=NULL;
64
 
        unsigned int            hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
 
65
        int                                     hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
65
66
        zend_bool                       persistent = FALSE;
66
67
        long                            port = 0, flags = 0;
67
68
        uint                            hash_len;
87
88
        hostname = username = dbname = passwd = socket = NULL;
88
89
 
89
90
        if (!is_real_connect) {
90
 
                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ssssls", &hostname, &hostname_len, &username, &username_len, 
 
91
                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ssssls", &hostname, &hostname_len, &username, &username_len,
91
92
                                                                        &passwd, &passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len) == FAILURE) {
92
93
                        return;
93
94
                }
122
123
                        flags &= ~CLIENT_LOCAL_FILES;
123
124
                }
124
125
        }
125
 
        if (mysql->mysql && mysqli_resource && mysqli_resource->status > MYSQLI_STATUS_INITIALIZED) {
126
 
                /* already connected, we should close the connection */
127
 
                php_mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT, mysqli_resource->status TSRMLS_CC);
128
 
        }
129
126
 
130
127
        if (!socket_len || !socket) {
131
128
                socket = MyG(default_socket);
144
141
                hostname = MyG(default_host);
145
142
        }
146
143
 
 
144
       if (mysql->mysql && mysqli_resource && (mysqli_resource->status > MYSQLI_STATUS_INITIALIZED || (strlen(SAFE_STR(hostname)) > 2 && !strncasecmp(hostname, "p:", 2)))) {
 
145
                /* already connected, we should close the connection */
 
146
                php_mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT, mysqli_resource->status TSRMLS_CC);
 
147
        }
 
148
 
147
149
        if (strlen(SAFE_STR(hostname)) > 2 && !strncasecmp(hostname, "p:", 2)) {
148
150
                hostname += 2;
149
151
                if (!MyG(allow_persistent)) {
150
 
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Persistent connections are disabled. Downgrading to normal");                      
 
152
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Persistent connections are disabled. Downgrading to normal");
151
153
                } else {
152
154
                        mysql->persistent = persistent = TRUE;
153
155
 
154
 
                        hash_len = spprintf(&hash_key, 0, "mysqli_%s_%s%ld%s%s%s", SAFE_STR(hostname), SAFE_STR(socket), 
155
 
                                                                port, SAFE_STR(username), SAFE_STR(dbname), 
 
156
                        hash_len = spprintf(&hash_key, 0, "mysqli_%s_%s%ld%s%s%s", SAFE_STR(hostname), SAFE_STR(socket),
 
157
                                                                port, SAFE_STR(username), SAFE_STR(dbname),
156
158
                                                                SAFE_STR(passwd));
157
159
 
158
160
                        mysql->hash_key = hash_key;
167
169
                                                        mysql->mysql = zend_ptr_stack_pop(&plist->free_links);
168
170
 
169
171
                                                        MyG(num_inactive_persistent)--;
170
 
#if defined(MYSQLI_USE_MYSQLND)
171
 
                                                        mysqlnd_end_psession(mysql->mysql);
172
 
#endif  
173
172
                                                        /* reset variables */
174
173
 
175
174
#ifndef MYSQLI_NO_CHANGE_USER_ON_PCONNECT
279
278
        mysql->multi_query = 0;
280
279
 
281
280
        if (!object || !instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) {
282
 
                MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);       
 
281
                MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);
283
282
        } else {
284
283
                ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr = mysqli_resource;
285
284
        }
303
302
 
304
303
 
305
304
/* {{{ proto object mysqli_connect([string hostname [,string username [,string passwd [,string dbname [,int port [,string socket]]]]]])
306
 
   Open a connection to a mysql server */ 
 
305
   Open a connection to a mysql server */
307
306
PHP_FUNCTION(mysqli_connect)
308
307
{
309
308
        mysqli_common_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE, FALSE);
312
311
 
313
312
 
314
313
/* {{{ proto object mysqli_link_construct()
315
 
  */ 
 
314
  */
316
315
PHP_FUNCTION(mysqli_link_construct)
317
316
{
318
317
        mysqli_common_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE, TRUE);
330
329
 
331
330
/* {{{ proto string mysqli_connect_error(void)
332
331
   Returns the text of the error message from previous MySQL operation */
333
 
PHP_FUNCTION(mysqli_connect_error) 
 
332
PHP_FUNCTION(mysqli_connect_error)
334
333
{
335
334
        if (MyG(error_msg)) {
336
335
                RETURN_STRING(MyG(error_msg),1);
343
342
 
344
343
/* {{{ proto mixed mysqli_fetch_array (object result [,int resulttype])
345
344
   Fetch a result row as an associative array, a numeric array, or both */
346
 
PHP_FUNCTION(mysqli_fetch_array) 
 
345
PHP_FUNCTION(mysqli_fetch_array)
347
346
{
348
347
        php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0);
349
348
}
351
350
 
352
351
/* {{{ proto mixed mysqli_fetch_assoc (object result)
353
352
   Fetch a result row as an associative array */
354
 
PHP_FUNCTION(mysqli_fetch_assoc) 
 
353
PHP_FUNCTION(mysqli_fetch_assoc)
355
354
{
356
355
        php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 0);
357
356
}
358
357
/* }}} */
359
358
 
360
359
 
361
 
/* {{{ proto mixed mysqli_fetch_all (object result [,int resulttype]) 
 
360
/* {{{ proto mixed mysqli_fetch_all (object result [,int resulttype])
362
361
   Fetches all result rows as an associative array, a numeric array, or both */
363
362
#if defined(MYSQLI_USE_MYSQLND)
364
 
PHP_FUNCTION(mysqli_fetch_all) 
 
363
PHP_FUNCTION(mysqli_fetch_all)
365
364
{
366
 
        MYSQL_RES               *result;
367
 
        zval                    *mysql_result;
368
 
        long                    mode = MYSQLND_FETCH_NUM;
 
365
        MYSQL_RES       *result;
 
366
        zval            *mysql_result;
 
367
        long            mode = MYSQLND_FETCH_NUM;
369
368
 
370
369
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &mode) == FAILURE) {
371
370
                return;
385
384
 
386
385
/* {{{ proto array mysqli_cache_stats(void) U
387
386
   Returns statistics about the zval cache */
388
 
PHP_FUNCTION(mysqli_get_cache_stats) 
 
387
PHP_FUNCTION(mysqli_get_cache_stats)
389
388
{
390
389
        if (zend_parse_parameters_none() == FAILURE) {
391
390
                return;
397
396
 
398
397
/* {{{ proto array mysqli_get_client_stats(void)
399
398
   Returns statistics about the zval cache */
400
 
PHP_FUNCTION(mysqli_get_client_stats) 
 
399
PHP_FUNCTION(mysqli_get_client_stats)
401
400
{
402
401
        if (zend_parse_parameters_none() == FAILURE) {
403
402
                return;
409
408
 
410
409
/* {{{ proto array mysqli_get_connection_stats(void)
411
410
   Returns statistics about the zval cache */
412
 
PHP_FUNCTION(mysqli_get_connection_stats) 
 
411
PHP_FUNCTION(mysqli_get_connection_stats)
413
412
{
414
413
        MY_MYSQL        *mysql;
415
414
        zval            *mysql_link;
428
427
 
429
428
/* {{{ proto mixed mysqli_fetch_object (object result [, string class_name [, NULL|array ctor_params]])
430
429
   Fetch a result row as an object */
431
 
PHP_FUNCTION(mysqli_fetch_object) 
 
430
PHP_FUNCTION(mysqli_fetch_object)
432
431
{
433
 
        php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 1);  
 
432
        php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQLI_ASSOC, 1);
434
433
}
435
434
/* }}} */
436
435
 
438
437
   allows to execute multiple queries  */
439
438
PHP_FUNCTION(mysqli_multi_query)
440
439
{
441
 
        MY_MYSQL                *mysql;
442
 
        zval                    *mysql_link;
443
 
        char                    *query = NULL;
444
 
        unsigned int    query_len;
 
440
        MY_MYSQL        *mysql;
 
441
        zval            *mysql_link;
 
442
        char            *query = NULL;
 
443
        int             query_len;
445
444
 
446
445
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
447
446
                return;
448
447
        }
449
448
        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
450
449
 
451
 
        MYSQLI_ENABLE_MQ;       
 
450
        MYSQLI_ENABLE_MQ;
452
451
        if (mysql_real_query(mysql->mysql, query, query_len)) {
453
452
#ifndef MYSQLI_USE_MYSQLND
454
453
                char s_error[MYSQL_ERRMSG_SIZE], s_sqlstate[SQLSTATE_LENGTH+1];
455
454
                unsigned int s_errno;
456
 
                /* we have to save error information, cause 
 
455
                /* we have to save error information, cause
457
456
                MYSQLI_DISABLE_MQ will reset error information */
458
457
                strcpy(s_error, mysql_error(mysql->mysql));
459
458
                strcpy(s_sqlstate, mysql_sqlstate(mysql->mysql));
468
467
                /* restore error information */
469
468
                strcpy(mysql->mysql->net.last_error, s_error);
470
469
                strcpy(mysql->mysql->net.sqlstate, s_sqlstate);
471
 
                mysql->mysql->net.last_errno = s_errno; 
 
470
                mysql->mysql->net.last_errno = s_errno;
472
471
#else
473
472
                mysql->mysql->error_info = error_info;
474
473
#endif
486
485
        MYSQLI_RESOURCE         *mysqli_resource;
487
486
        MYSQL_RES                       *result;
488
487
        char                            *query = NULL;
489
 
        unsigned int            query_len;
490
 
        unsigned long           resultmode = MYSQLI_STORE_RESULT;
 
488
        int                             query_len;
 
489
        long                            resultmode = MYSQLI_STORE_RESULT;
491
490
 
492
491
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|l", &mysql_link, mysqli_link_class_entry, &query, &query_len, &resultmode) == FAILURE) {
493
492
                return;
541
540
        }
542
541
        if (!result) {
543
542
                php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC,
544
 
                                                                                "%s", mysql_error(mysql->mysql)); 
 
543
                                                                                "%s", mysql_error(mysql->mysql));
545
544
                RETURN_FALSE;
546
545
        }
547
546
 
575
574
                i++;
576
575
                if (Z_TYPE_PP(elem) != IS_OBJECT ||
577
576
                        !instanceof_function(Z_OBJCE_PP(elem), mysqli_link_class_entry TSRMLS_CC)) {
578
 
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter %d not a mysqli object", i);                     
 
577
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter %d not a mysqli object", i);
579
578
                } else {
580
579
                        MY_MYSQL *mysql;
581
580
                        MYSQLI_RESOURCE *my_res;
775
774
 
776
775
        if (!result) {
777
776
                php_mysqli_throw_sql_exception((char *)mysql_sqlstate(mysql->mysql), mysql_errno(mysql->mysql) TSRMLS_CC,
778
 
                                                                                "%s", mysql_error(mysql->mysql)); 
 
777
                                                                                "%s", mysql_error(mysql->mysql));
779
778
                RETURN_FALSE;
780
779
        }
781
780
 
813
812
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
814
813
        mysqli_resource->ptr = (void *)result;
815
814
        mysqli_resource->status = MYSQLI_STATUS_VALID;
816
 
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);     
 
815
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
817
816
}
818
817
/* }}} */
819
818
#endif
833
832
        MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID);
834
833
 
835
834
        if (mysql_warning_count(mysql->mysql)) {
836
 
                w = php_get_warnings(mysql->mysql TSRMLS_CC); 
 
835
                w = php_get_warnings(mysql->mysql TSRMLS_CC);
837
836
        } else {
838
837
                RETURN_FALSE;
839
838
        }
840
839
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
841
840
        mysqli_resource->ptr = mysqli_resource->info = (void *)w;
842
841
        mysqli_resource->status = MYSQLI_STATUS_VALID;
843
 
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);    
 
842
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);
844
843
}
845
844
/* }}} */
846
845
 
858
857
        MYSQLI_FETCH_RESOURCE_STMT(stmt, &stmt_link, MYSQLI_STATUS_VALID);
859
858
 
860
859
        if (mysqli_stmt_warning_count(stmt->stmt)) {
861
 
                w = php_get_warnings(mysqli_stmt_get_connection(stmt->stmt) TSRMLS_CC); 
 
860
                w = php_get_warnings(mysqli_stmt_get_connection(stmt->stmt) TSRMLS_CC);
862
861
        } else {
863
862
                RETURN_FALSE;
864
863
        }
874
873
   sets client character set */
875
874
PHP_FUNCTION(mysqli_set_charset)
876
875
{
877
 
        MY_MYSQL                        *mysql;
878
 
        zval                            *mysql_link;
879
 
        char                            *cs_name;
880
 
        int                                     csname_len;
 
876
        MY_MYSQL        *mysql;
 
877
        zval            *mysql_link;
 
878
        char            *cs_name;
 
879
        int                     csname_len;
881
880
 
882
881
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &cs_name, &csname_len) == FAILURE) {
883
882
                return;
892
891
/* }}} */
893
892
#endif
894
893
 
895
 
#ifdef HAVE_MYSQLI_GET_CHARSET 
 
894
#ifdef HAVE_MYSQLI_GET_CHARSET
896
895
/* {{{ proto object mysqli_get_charset(object link) U
897
896
   returns a character set object */
898
897
PHP_FUNCTION(mysqli_get_charset)
926
925
        comment = cs.comment;
927
926
#else
928
927
        cs = mysql->mysql->charset;
929
 
        name = cs->name;        
930
 
        collation = cs->collation;      
 
928
        name = cs->name;
 
929
        collation = cs->collation;
931
930
        minlength = cs->char_minlen;
932
931
        maxlength = cs->char_maxlen;
933
932
        number = cs->nr;