]> granicus.if.org Git - php/commitdiff
Fix for bug #36802 (server crashes with invalid/not opened connections)
authorGeorg Richter <georg@php.net>
Fri, 24 Mar 2006 09:32:24 +0000 (09:32 +0000)
committerGeorg Richter <georg@php.net>
Fri, 24 Mar 2006 09:32:24 +0000 (09:32 +0000)
Added status to mysqli_resource:
MYSQLI_STATUS_UNKNOWN
MYSQLI_STATUS_CLEARED (for future use)
MYSQLI_STATUS_INITIALIZED (after mysqli_init and mysqli_stmt_init)
MYSQLI_STATUS_VALID (for valid objects)
removed valid flag
changed MYSQLI_FETCH_RESOURCE
added last parameter __check which specifies the status

13 files changed:
ext/mysqli/mysqli.c
ext/mysqli/mysqli_api.c
ext/mysqli/mysqli_driver.c
ext/mysqli/mysqli_nonapi.c
ext/mysqli/mysqli_prop.c
ext/mysqli/mysqli_repl.c
ext/mysqli/mysqli_warning.c
ext/mysqli/php_mysqli.h
ext/mysqli/tests/002.phpt
ext/mysqli/tests/014.phpt
ext/mysqli/tests/bug34810.phpt
ext/mysqli/tests/bug36802.phpt [new file with mode: 0644]
ext/mysqli/tests/connect.inc

index 0d1b34db9eaa6e59c9c6c5586c12594856efdddc..4531bb07e2670937cef076ac076dd4ea53c64ff3 100644 (file)
@@ -211,22 +211,11 @@ zval *mysqli_read_property(zval *object, zval *member, int type TSRMLS_DC)
        }
 
        if (ret == SUCCESS) {
-
-               /* check if mysqli object is still valid */
-               if (!strcmp(obj->zo.ce->name, "mysqli")) {
-                       if (!obj->ptr ||
-                       !((MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql)->thread_id) {
-                               retval = EG(uninitialized_zval_ptr);
-                               return(retval);
-                       }
-               } else
-               /* check if stmt object is still valid */
-               if (!strcmp(obj->zo.ce->name, "mysqli_stmt")) {
-                       if (!obj->ptr ||
-                       !((MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt)->mysql) {
-                               retval = EG(uninitialized_zval_ptr);
-                               return(retval);
-                       }
+               if (strcmp(obj->zo.ce->name, "mysqli_driver") &&
+            (!obj->ptr || ((MYSQLI_RESOURCE *)(obj->ptr))->status < MYSQLI_STATUS_INITIALIZED)) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name );
+                       retval = EG(uninitialized_zval_ptr);
+                       return(retval);
                }
 
                ret = hnd->read_func(obj, &retval TSRMLS_CC);
@@ -346,7 +335,6 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_
        intern->zo.ce = class_type;
        intern->zo.guards = NULL;
        intern->ptr = NULL;
-       intern->valid = 0;
        intern->prop_handler = NULL;
 
        mysqli_base_class = class_type;
@@ -652,7 +640,7 @@ PHP_MINFO_FUNCTION(mysqli)
 /* {{{ mixed mysqli_stmt_construct() 
 constructor for statement object.
 Parameters: 
-  object -> mysqli_init
+  object -> mysqli_stmt_init
   object, query -> mysqli_prepare
 */
 ZEND_FUNCTION(mysqli_stmt_construct)
@@ -670,7 +658,7 @@ ZEND_FUNCTION(mysqli_stmt_construct)
                if (zend_parse_parameters(1 TSRMLS_CC, "O", &mysql_link, mysqli_link_class_entry)==FAILURE) {
                                return;
                        }
-                       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+                       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
                        stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
 
@@ -680,7 +668,7 @@ ZEND_FUNCTION(mysqli_stmt_construct)
                if (zend_parse_parameters(2 TSRMLS_CC, "Os", &mysql_link, mysqli_link_class_entry, &statement, &stmt_len)==FAILURE) {
                                return;
                        }
-                       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+                       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
                        stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
        
@@ -700,9 +688,9 @@ ZEND_FUNCTION(mysqli_stmt_construct)
 
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)stmt;
-       
+       mysqli_resource->status = (ZEND_NUM_ARGS() == 1) ? MYSQLI_STATUS_INITIALIZED : MYSQLI_STATUS_VALID;
+
        ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
-       ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->valid = 1;
 }
 /* }}} */
 
@@ -734,7 +722,7 @@ ZEND_FUNCTION(mysqli_result_construct)
                        WRONG_PARAM_COUNT;
        }
 
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        result = (resmode == MYSQLI_STORE_RESULT) ? mysql_store_result(mysql->mysql) :
                                                                                                mysql_use_result(mysql->mysql);
@@ -745,9 +733,9 @@ ZEND_FUNCTION(mysqli_result_construct)
 
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)result;
+       mysqli_resource->status = MYSQLI_STATUS_VALID;
        
        ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
-       ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->valid = 1;
 
 }
 /* }}} */
@@ -796,7 +784,7 @@ void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags
                        }
                }
        }
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID); 
 
        if ((fetchtype & MYSQLI_BOTH) == 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQLI_NUM, MYSQLI_ASSOC or MYSQLI_BOTH");
index 5bd19535284258e946c5d9655f6ce4a8cc34ad72..6ab053ef8b5160c248fb4bc3d282e33e21974f1b 100644 (file)
@@ -41,7 +41,7 @@ PHP_FUNCTION(mysqli_affected_rows)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        rc = mysql_affected_rows(mysql->mysql);
        if (rc == (my_ulonglong) -1) {
@@ -62,7 +62,7 @@ PHP_FUNCTION(mysqli_autocommit)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ob", &mysql_link, mysqli_link_class_entry, &automode) == FAILURE) {
                return; 
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (mysql_autocommit(mysql->mysql, automode)) {
                RETURN_FALSE;
@@ -103,7 +103,7 @@ PHP_FUNCTION(mysqli_stmt_bind_param)
                return; 
        }
 
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID); 
 
        if (getThis()) {
                start = 1;
@@ -229,7 +229,7 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
                return; 
        }
 
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID); 
 
        if (argc < (getThis() ? 1 : 2))  {
                WRONG_PARAM_COUNT;
@@ -326,11 +326,11 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
                        case MYSQL_TYPE_NEWDECIMAL:
 #endif
                        {
-#if VERSION_ID > 50999
+#if MYSQL_VERSION_ID > 50099
                                /* Changed to my_bool in MySQL 5.1. See MySQL Bug #16144 */
                                my_bool tmp;
 #else
-                               ulong tmp;
+                               ulong tmp = 0;
 #endif
                                stmt->result.buf[ofs].type = IS_STRING;
                                /*
@@ -409,7 +409,7 @@ PHP_FUNCTION(mysqli_change_user)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osss", &mysql_link, mysqli_link_class_entry, &user, &user_len, &password, &password_len, &dbname, &dbname_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        rc = mysql_change_user(mysql->mysql, user, password, dbname);
        MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -433,7 +433,7 @@ PHP_FUNCTION(mysqli_character_set_name)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_STRING((char *) mysql_character_set_name(mysql->mysql), 1);
 }
@@ -450,7 +450,7 @@ PHP_FUNCTION(mysqli_close)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
 
        mysql_close(mysql->mysql);
        php_clear_mysql(mysql);
@@ -470,7 +470,7 @@ PHP_FUNCTION(mysqli_commit)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        if (mysql_commit(mysql->mysql)) {
                RETURN_FALSE;
        }
@@ -490,7 +490,7 @@ PHP_FUNCTION(mysqli_data_seek)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
 
        if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with MYSQL_USE_RESULT");
@@ -533,7 +533,7 @@ PHP_FUNCTION(mysqli_dump_debug_info)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        rc = mysql_dump_debug_info(mysql->mysql);
 
@@ -554,7 +554,7 @@ PHP_FUNCTION(mysqli_errno)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        RETURN_LONG(mysql_errno(mysql->mysql));
 }
 /* }}} */
@@ -569,7 +569,7 @@ PHP_FUNCTION(mysqli_error)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        RETURN_STRING((char *)mysql_error(mysql->mysql),1);
 }
 /* }}} */
@@ -585,7 +585,7 @@ PHP_FUNCTION(mysqli_stmt_execute)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
        
        for (i = 0; i < stmt->param.var_cnt; i++) {             
                if (stmt->param.vars[i]) {
@@ -639,7 +639,7 @@ PHP_FUNCTION(mysqli_stmt_fetch)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
        
        /* reset buffers */
 
@@ -763,7 +763,7 @@ PHP_FUNCTION(mysqli_fetch_field)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
 
        if (!(field = mysql_fetch_field(result))) {
                RETURN_FALSE;
@@ -800,7 +800,7 @@ PHP_FUNCTION(mysqli_fetch_fields)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
 
        array_init(return_value);
 
@@ -841,7 +841,7 @@ PHP_FUNCTION(mysqli_fetch_field_direct)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
        
        if (offset < 0 || offset >= mysql_num_fields(result)) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field offset is invalid for resultset");
@@ -881,7 +881,7 @@ PHP_FUNCTION(mysqli_fetch_lengths)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
 
        if (!(ret = mysql_fetch_lengths(result))) {
                RETURN_FALSE;
@@ -914,7 +914,7 @@ PHP_FUNCTION(mysqli_field_count)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_LONG(mysql_field_count(mysql->mysql));
 }
@@ -932,7 +932,7 @@ PHP_FUNCTION(mysqli_field_seek)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_result, mysqli_result_class_entry, &fieldnr) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
 
        if (fieldnr < 0 || fieldnr >= mysql_num_fields(result)) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with MYSQL_USE_RESULT");
@@ -954,7 +954,7 @@ PHP_FUNCTION(mysqli_field_tell)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
        
        RETURN_LONG(mysql_field_tell(result));
 }
@@ -970,7 +970,7 @@ PHP_FUNCTION(mysqli_free_result)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
 
        mysql_free_result(result);
        MYSQLI_CLEAR_RESOURCE(&mysql_result);   
@@ -1005,7 +1005,7 @@ PHP_FUNCTION(mysqli_get_host_info)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_STRING((mysql->mysql->host_info) ? mysql->mysql->host_info : "", 1);
 }
@@ -1021,7 +1021,7 @@ PHP_FUNCTION(mysqli_get_proto_info)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_LONG(mysql_get_proto_info(mysql->mysql));
 }
@@ -1037,7 +1037,7 @@ PHP_FUNCTION(mysqli_get_server_info)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_STRING((char *)mysql_get_server_info(mysql->mysql), 1);
 }
@@ -1054,7 +1054,7 @@ PHP_FUNCTION(mysqli_get_server_version)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_LONG(mysql_get_server_version(mysql->mysql));
 }
@@ -1070,7 +1070,7 @@ PHP_FUNCTION(mysqli_info)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_STRING((mysql->mysql->info) ? mysql->mysql->info : "", 1);
 }
@@ -1090,12 +1090,12 @@ PHP_FUNCTION(mysqli_init)
 
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)mysql;
+       mysqli_resource->status = MYSQLI_STATUS_INITIALIZED;
 
        if (!getThis() || !instanceof_function(Z_OBJCE_P(getThis()), mysqli_link_class_entry TSRMLS_CC)) {
                MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);       
        } else {
                ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
-               ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->valid = 1;
        }
 }
 /* }}} */
@@ -1111,7 +1111,7 @@ PHP_FUNCTION(mysqli_insert_id)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        rc = mysql_insert_id(mysql->mysql);
        MYSQLI_RETURN_LONG_LONG(rc)
 }
@@ -1128,7 +1128,7 @@ PHP_FUNCTION(mysqli_kill)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_link, mysqli_link_class_entry, &processid) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        
        if (mysql_kill(mysql->mysql, processid)) {
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -1149,7 +1149,7 @@ PHP_FUNCTION(mysqli_set_local_infile_default)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (mysql->li_read) {
                efree(Z_STRVAL_P(mysql->li_read));
@@ -1173,7 +1173,7 @@ PHP_FUNCTION(mysqli_set_local_infile_handler)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        /* check callback function */
        if (!zend_is_callable(callback_func, 0, &callback_name)) {
@@ -1199,7 +1199,7 @@ PHP_FUNCTION(mysqli_more_results)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (!mysql_more_results(mysql->mysql)) {
                RETURN_FALSE;
@@ -1217,7 +1217,7 @@ PHP_FUNCTION(mysqli_next_result) {
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (mysql_next_result(mysql->mysql)) {
                RETURN_FALSE;
@@ -1236,7 +1236,7 @@ PHP_FUNCTION(mysqli_num_fields)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
 
        RETURN_LONG(mysql_num_fields(result));
 }
@@ -1252,7 +1252,7 @@ PHP_FUNCTION(mysqli_num_rows)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result"); 
+       MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID);
 
        if (result->handle && result->handle->status == MYSQL_STATUS_USE_RESULT) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Function cannot be used with MYSQL_USE_RESULT");
@@ -1277,7 +1277,7 @@ PHP_FUNCTION(mysqli_options)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olz", &mysql_link, mysqli_link_class_entry, &mysql_option, &mysql_value) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
 
        switch (Z_TYPE_PP(&mysql_value)) {
                case IS_STRING:
@@ -1310,7 +1310,7 @@ PHP_FUNCTION(mysqli_ping)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        rc = mysql_ping(mysql->mysql);
        MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
        if (rc) {
@@ -1334,7 +1334,7 @@ PHP_FUNCTION(mysqli_prepare)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",&mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        if (mysql->mysql->status == MYSQL_STATUS_GET_RESULT) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "All data must be fetched before a new statement prepare takes place");
                RETURN_FALSE;
@@ -1369,10 +1369,14 @@ PHP_FUNCTION(mysqli_prepare)
                RETURN_FALSE;
        }
 
+
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)stmt;
        stmt->query = (query_len) ? (char *)emalloc(query_len + 1) : NULL;
        strcpy(stmt->query, query);
+
+       /* change status */
+       mysqli_resource->status = MYSQLI_STATUS_VALID;
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_stmt_class_entry);
 }
 /* }}} */
@@ -1386,7 +1390,6 @@ PHP_FUNCTION(mysqli_real_connect)
        unsigned int    hostname_len = 0, username_len = 0, passwd_len = 0, dbname_len = 0, socket_len = 0;
        unsigned long   port=0, flags=0;
        zval                    *mysql_link;
-       zval                    *object = getThis();
 
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|sssslsl", &mysql_link, mysqli_link_class_entry,
                &hostname, &hostname_len, &username, &username_len, &passwd, &passwd_len, &dbname, &dbname_len, &port, &socket, &socket_len,
@@ -1412,7 +1415,7 @@ PHP_FUNCTION(mysqli_real_connect)
                }
        }       
 
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED);
 
        /* remove some insecure options */
        flags ^= CLIENT_MULTI_STATEMENTS;   /* don't allow multi_queries via connect parameter */
@@ -1425,23 +1428,24 @@ PHP_FUNCTION(mysqli_real_connect)
        }
 
        if (mysql_real_connect(mysql->mysql,hostname,username,passwd,dbname,port,socket,flags) == NULL) {
-               
                php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql) TSRMLS_CC);
                php_mysqli_throw_sql_exception( mysql->mysql->net.sqlstate, mysql->mysql->net.last_errno TSRMLS_CC,
                                                                                "%s", mysql->mysql->net.last_error);
 
+               /* change status */
+               MYSQLI_SET_STATUS(&mysql_link, MYSQLI_STATUS_INITIALIZED);
                RETURN_FALSE;
        }
+
        php_mysqli_set_error(mysql_errno(mysql->mysql), (char *)mysql_error(mysql->mysql) TSRMLS_CC);
 
        mysql->mysql->reconnect = MyG(reconnect);
 
        /* set our own local_infile handler */
        php_set_local_infile_handler_default(mysql);
-       
-       if (object) {
-               ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->valid = 1;
-       }
+
+       /* change status */
+       MYSQLI_SET_STATUS(&mysql_link, MYSQLI_STATUS_VALID);
 
        RETURN_TRUE;
 }
@@ -1459,7 +1463,7 @@ PHP_FUNCTION(mysqli_real_query)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        MYSQLI_DISABLE_MQ; /* disable multi statements/queries */
 
@@ -1489,7 +1493,7 @@ PHP_FUNCTION(mysqli_real_escape_string) {
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &escapestr, &escapestr_len) == FAILURE) {
                return;
        }       
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        newstr = safe_emalloc(2, escapestr_len, 1);
        newstr_len = mysql_real_escape_string(mysql->mysql, newstr, escapestr, escapestr_len);
@@ -1509,7 +1513,7 @@ PHP_FUNCTION(mysqli_rollback)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (mysql_rollback(mysql->mysql)) {
                RETURN_FALSE;
@@ -1532,7 +1536,7 @@ PHP_FUNCTION(mysqli_stmt_send_long_data)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols", &mysql_stmt, mysqli_stmt_class_entry, &param_nr, &data, &data_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        if (param_nr < 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid parameter number");
@@ -1557,7 +1561,7 @@ PHP_FUNCTION(mysqli_stmt_affected_rows)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        rc = mysql_stmt_affected_rows(stmt->stmt);
        if (rc == (my_ulonglong) -1) {
@@ -1577,13 +1581,13 @@ PHP_FUNCTION(mysqli_stmt_close)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
+
        mysql_stmt_close(stmt->stmt);
        stmt->stmt = NULL;
        php_clear_stmt_bind(stmt); 
        MYSQLI_CLEAR_RESOURCE(&mysql_stmt);
        RETURN_TRUE;
-
 }
 /* }}} */
 
@@ -1603,7 +1607,7 @@ PHP_FUNCTION(mysqli_stmt_data_seek)
                RETURN_FALSE;
        }
 
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        mysql_stmt_data_seek(stmt->stmt, offset);
        return;
@@ -1620,7 +1624,7 @@ PHP_FUNCTION(mysqli_stmt_field_count)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
                
        RETURN_LONG(mysql_stmt_field_count(stmt->stmt));
 }
@@ -1637,7 +1641,7 @@ PHP_FUNCTION(mysqli_stmt_free_result)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        mysql_stmt_free_result(stmt->stmt);
 
@@ -1656,7 +1660,7 @@ PHP_FUNCTION(mysqli_stmt_insert_id)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
        rc = mysql_stmt_insert_id(stmt->stmt);
        MYSQLI_RETURN_LONG_LONG(rc)
 }
@@ -1672,7 +1676,7 @@ PHP_FUNCTION(mysqli_stmt_param_count)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
                
        RETURN_LONG(mysql_stmt_param_count(stmt->stmt));
 }
@@ -1689,7 +1693,7 @@ PHP_FUNCTION(mysqli_stmt_reset)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        if (mysql_stmt_reset(stmt->stmt)) {
                RETURN_FALSE;
@@ -1710,7 +1714,7 @@ PHP_FUNCTION(mysqli_stmt_num_rows)
                return;
        }
 
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        rc = mysql_stmt_num_rows(stmt->stmt);
        MYSQLI_RETURN_LONG_LONG(rc)
@@ -1730,7 +1734,7 @@ PHP_FUNCTION(mysqli_select_db)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &dbname, &dbname_len) == FAILURE) {
                return;
        } 
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        
        if (!mysql_select_db(mysql->mysql, dbname)) {
                RETURN_TRUE;
@@ -1751,7 +1755,7 @@ PHP_FUNCTION(mysqli_sqlstate)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        RETURN_STRING((char *)mysql_sqlstate(mysql->mysql),1);
 }
 /* }}} */
@@ -1768,7 +1772,7 @@ PHP_FUNCTION(mysqli_ssl_set)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osssss", &mysql_link, mysqli_link_class_entry, &ssl_parm[0], &ssl_parm_len[0], &ssl_parm[1], &ssl_parm_len[1], &ssl_parm[2], &ssl_parm_len[2], &ssl_parm[3], &ssl_parm_len[3], &ssl_parm[4], &ssl_parm_len[4])   == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        for (i=0; i < 5; i++) {
                if (!ssl_parm_len[i]) {
@@ -1793,7 +1797,7 @@ PHP_FUNCTION(mysqli_stat)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if ((stat = (char *)mysql_stat(mysql->mysql))) {
                RETURN_STRING(stat, 1);
@@ -1816,7 +1820,7 @@ PHP_FUNCTION(mysqli_stmt_attr_set)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll", &mysql_stmt, mysqli_stmt_class_entry, &attr, &mode) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        if ((rc = mysql_stmt_attr_set(stmt->stmt, attr, (void *)&mode))) {
                RETURN_FALSE;
@@ -1838,7 +1842,7 @@ PHP_FUNCTION(mysqli_stmt_attr_get)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &mysql_stmt, mysqli_stmt_class_entry, &attr) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        if ((rc = mysql_stmt_attr_get(stmt->stmt, attr, &value))) {
                RETURN_FALSE;
@@ -1857,7 +1861,7 @@ PHP_FUNCTION(mysqli_stmt_errno)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        RETURN_LONG(mysql_stmt_errno(stmt->stmt));
 }
@@ -1873,7 +1877,7 @@ PHP_FUNCTION(mysqli_stmt_error)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
        
        RETURN_STRING((char *)mysql_stmt_error(stmt->stmt),1);
 }
@@ -1892,7 +1896,7 @@ PHP_FUNCTION(mysqli_stmt_init)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",&mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
 
@@ -1902,6 +1906,7 @@ PHP_FUNCTION(mysqli_stmt_init)
        }
 
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
+       mysqli_resource->status = MYSQLI_STATUS_INITIALIZED;
        mysqli_resource->ptr = (void *)stmt;
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_stmt_class_entry);
 }
@@ -1920,12 +1925,14 @@ PHP_FUNCTION(mysqli_stmt_prepare)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_stmt, mysqli_stmt_class_entry, &query, &query_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt");
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_INITIALIZED);
 
        if (mysql_stmt_prepare(stmt->stmt, query, query_len)) {
                MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
                RETURN_FALSE;
        }
+       /* change status */
+       MYSQLI_SET_STATUS(&mysql_stmt, MYSQLI_STATUS_VALID);
        RETURN_TRUE;
 }
 /* }}} */
@@ -1942,7 +1949,7 @@ PHP_FUNCTION(mysqli_stmt_result_metadata)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
 
        if (!(result = mysql_stmt_result_metadata(stmt->stmt))){
                MYSQLI_REPORT_STMT_ERROR(stmt->stmt);
@@ -1951,6 +1958,7 @@ PHP_FUNCTION(mysqli_stmt_result_metadata)
 
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)result;
+       mysqli_resource->status = MYSQLI_STATUS_VALID;
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);     
 }
 /* }}} */
@@ -1966,7 +1974,7 @@ PHP_FUNCTION(mysqli_stmt_store_result)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
        
        /*
          If the user wants to store the data and we have BLOBs/TEXTs we try to allocate
@@ -2001,7 +2009,7 @@ PHP_FUNCTION(mysqli_stmt_sqlstate)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt"); 
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &mysql_stmt, "mysqli_stmt", MYSQLI_STATUS_VALID);
        
        RETURN_STRING((char *)mysql_stmt_sqlstate(stmt->stmt),1);
 }
@@ -2019,7 +2027,7 @@ PHP_FUNCTION(mysqli_store_result)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (!(result = mysql_store_result(mysql->mysql))) {
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -2028,8 +2036,10 @@ PHP_FUNCTION(mysqli_store_result)
        if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
                php_mysqli_report_index("from previous query", mysql->mysql->server_status TSRMLS_CC);
        }
+
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)result;
+       mysqli_resource->status = MYSQLI_STATUS_VALID;
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);     
 }
 /* }}} */
@@ -2044,7 +2054,7 @@ PHP_FUNCTION(mysqli_thread_id)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_LONG(mysql_thread_id(mysql->mysql));
 }
@@ -2071,7 +2081,7 @@ PHP_FUNCTION(mysqli_use_result)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (!(result = mysql_use_result(mysql->mysql))) {
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
@@ -2081,9 +2091,9 @@ PHP_FUNCTION(mysqli_use_result)
        if (MyG(report_mode) & MYSQLI_REPORT_INDEX) {
                php_mysqli_report_index("from previous query", mysql->mysql->server_status TSRMLS_CC);
        }
-
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)result;
+       mysqli_resource->status = MYSQLI_STATUS_VALID;
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);     
 }
 /* }}} */
@@ -2098,7 +2108,7 @@ PHP_FUNCTION(mysqli_warning_count)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_LONG(mysql_warning_count(mysql->mysql));
 }
index 8e473eab08328aedb90d221a056d54f6a6376e9f..d1c776ad19db13f818e83f18530a7c3fe6caa6f8 100644 (file)
@@ -130,7 +130,6 @@ MAP_PROPERTY_MYG_LONG_READ(driver_report_read, report_mode);
 
 ZEND_FUNCTION(mysqli_driver_construct)
 {
-       
 }
 
 mysqli_property_entry mysqli_driver_property_entries[] = {
index 9c031fab6c487b6ac9ab8ccf5ae68e9c75943167..67da4934f57f530cb3e8e0743c2274b374c65580 100644 (file)
@@ -75,10 +75,11 @@ PHP_FUNCTION(mysqli_connect)
        }
 
 #ifdef HAVE_EMBEDDED_MYSQLI
-       if (hostname_len && hostname) {
+       if (strcmp(hostname, ":embedded")) {
                unsigned int external=1;
                mysql_options(mysql->mysql, MYSQL_OPT_USE_REMOTE_CONNECTION, (char *)&external);
        } else {
+               hostname[0] = '\0';
                mysql_options(mysql->mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, 0);
        }
 #endif
@@ -111,12 +112,12 @@ PHP_FUNCTION(mysqli_connect)
 
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)mysql;
+       mysqli_resource->status = MYSQLI_STATUS_VALID;
 
        if (!object || !instanceof_function(Z_OBJCE_P(object), mysqli_link_class_entry TSRMLS_CC)) {
                MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_link_class_entry);       
        } else {
                ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->ptr = mysqli_resource;
-               ((mysqli_object *) zend_object_store_get_object(object TSRMLS_CC))->valid = 1;
        }
 }
 /* }}} */
@@ -177,7 +178,7 @@ PHP_FUNCTION(mysqli_multi_query)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        MYSQLI_ENABLE_MQ;       
        if (mysql_real_query(mysql->mysql, query, query_len)) {
@@ -228,7 +229,7 @@ PHP_FUNCTION(mysqli_query)
                RETURN_FALSE;
        }
 
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        MYSQLI_DISABLE_MQ;
 
@@ -259,6 +260,7 @@ PHP_FUNCTION(mysqli_query)
 
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
        mysqli_resource->ptr = (void *)result;
+       mysqli_resource->status = MYSQLI_STATUS_VALID;
        MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_result_class_entry);
 }
 /* }}} */
@@ -274,7 +276,7 @@ PHP_FUNCTION(mysqli_get_warnings)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (mysql_warning_count(mysql->mysql)) {
                w = php_get_warnings(mysql->mysql); 
@@ -298,7 +300,7 @@ PHP_FUNCTION(mysqli_stmt_get_warnings)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &stmt_link, mysqli_stmt_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT*, &stmt_link, "mysqli_stmt");
+       MYSQLI_FETCH_RESOURCE(stmt, MY_STMT*, &stmt_link, "mysqli_stmt", 1);
 
        if (mysql_warning_count(stmt->stmt->mysql)) {
                w = php_get_warnings(stmt->stmt->mysql); 
@@ -324,9 +326,9 @@ PHP_FUNCTION(mysqli_set_charset)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &cs_name, &len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
-       if (!mysql->mysql->thread_id || mysql_set_character_set(mysql->mysql, cs_name)) {
+       if (mysql_set_character_set(mysql->mysql, cs_name)) {
                RETURN_FALSE;
        }
        RETURN_TRUE;
@@ -346,7 +348,7 @@ PHP_FUNCTION(mysqli_get_charset)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        object_init(return_value);
 
index 19db5bc1de2270e5d5451fab392165b60c3774de..a978255d4b45cd9c1add334cd110e5346f240283 100644 (file)
 #include "ext/standard/info.h"
 #include "php_mysqli.h"
 
-#define CHECK_OBJECT() \
-       if (!obj->valid) { \
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Property access is not allowed yet. Call the default constructor of the object first"); \
+#define CHECK_STATUS(value) \
+       if (((MYSQLI_RESOURCE *)obj->ptr)->status < value ) { \
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Property access is not allowed yet"); \
                ZVAL_NULL(*retval); \
                return SUCCESS; \
        } \
 
-#define MYSQLI_GET_MYSQL() \
+#define MYSQLI_GET_MYSQL(statusval) \
 MYSQL *p; \
 ALLOC_ZVAL(*retval);\
-CHECK_OBJECT();\
 if (!obj->ptr || !(MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { \
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
        ZVAL_NULL(*retval);\
        return SUCCESS; \
-} else if (!obj->valid) { \
-       php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid resource %s", obj->zo.ce->name);\
-       ZVAL_NULL(*retval);\
-       return SUCCESS; \
 } else { \
-       p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql; \
+       CHECK_STATUS(statusval);\
+    p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql;\
 }
 
-#define MYSQLI_GET_RESULT() \
+#define MYSQLI_GET_RESULT(statusval) \
 MYSQL_RES *p; \
 ALLOC_ZVAL(*retval);\
-CHECK_OBJECT();\
 if (!obj->ptr) { \
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
        ZVAL_NULL(*retval);\
        return SUCCESS; \
-} else if (!obj->valid) { \
-       php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid resource %s", obj->zo.ce->name);\
-       ZVAL_NULL(*retval);\
-       return SUCCESS; \
 } else { \
+       CHECK_STATUS(statusval);\
        p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr; \
 }
 
 
-#define MYSQLI_GET_STMT() \
+#define MYSQLI_GET_STMT(statusval) \
 MYSQL_STMT *p; \
 ALLOC_ZVAL(*retval);\
-CHECK_OBJECT();\
-p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt
+if (!obj->ptr) { \
+       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
+       ZVAL_NULL(*retval);\
+       return SUCCESS; \
+} else { \
+       CHECK_STATUS(statusval);\
+       p = (MYSQL_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr; \
+}
 
 #define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type)\
 static int __func(mysqli_object *obj, zval **retval TSRMLS_DC) \
@@ -126,6 +124,7 @@ static int link_client_version_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 static int link_client_info_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
        ALLOC_ZVAL(*retval);
+       CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
        ZVAL_STRING(*retval, MYSQL_SERVER_VERSION, 1);
        return SUCCESS;
 }
@@ -135,6 +134,7 @@ static int link_client_info_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 static int link_connect_errno_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
        ALLOC_ZVAL(*retval);
+       CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
        ZVAL_LONG(*retval, (long)MyG(error_no));
        return SUCCESS;
 }
@@ -144,6 +144,7 @@ static int link_connect_errno_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 static int link_connect_error_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
        ALLOC_ZVAL(*retval);
+       CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
        ZVAL_STRING(*retval, MyG(error_msg), 1);
        return SUCCESS;
 }
@@ -156,41 +157,46 @@ static int link_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
        my_ulonglong rc;
 
        ALLOC_ZVAL(*retval); 
-       CHECK_OBJECT();
 
        mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
-       rc = mysql_affected_rows(mysql->mysql);
-
-       if (rc == (my_ulonglong)-1) {
-               ZVAL_LONG(*retval, -1);
-               return SUCCESS;
-       } 
-
-       if (rc < LONG_MAX) {
-               ZVAL_LONG(*retval, rc);
+       
+       if (!mysql) {
+               ZVAL_NULL(*retval);
        } else {
-               char ret[40];
-               sprintf(ret, "%llu", (my_ulonglong) rc);
-               ZVAL_STRING(*retval, ret, 1);
+               CHECK_STATUS(MYSQLI_STATUS_VALID);
+
+               rc = mysql_affected_rows(mysql->mysql);
+
+               if (rc == (my_ulonglong)-1) {
+                       ZVAL_LONG(*retval, -1);
+                       return SUCCESS;
+               } 
+
+               if (rc < LONG_MAX) {
+                       ZVAL_LONG(*retval, rc);
+               } else {
+                       char ret[40];
+                       sprintf(ret, "%llu", (my_ulonglong) rc);
+                       ZVAL_STRING(*retval, ret, 1);
+               }
        }
-
        return SUCCESS;
 }
 /* }}} */
 
 /* link properties */
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(), my_ulonglong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL());
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED));
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), my_ulonglong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong);
 /* result properties */
 
 /* {{{ property result_type_read */
@@ -199,7 +205,7 @@ static int result_type_read(mysqli_object *obj, zval **retval TSRMLS_DC)
        MYSQL_RES *p;
 
        ALLOC_ZVAL(*retval);
-       CHECK_OBJECT();
+       CHECK_STATUS(MYSQLI_STATUS_VALID);
        p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
 
        if (!p) {
@@ -217,15 +223,15 @@ static int result_lengths_read(mysqli_object *obj, zval **retval TSRMLS_DC)
        MYSQL_RES *p;
 
        ALLOC_ZVAL(*retval);
-       CHECK_OBJECT();
 
+       CHECK_STATUS(MYSQLI_STATUS_VALID);
        p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
        if (!p || !p->field_count) {
                ZVAL_NULL(*retval);
        } else {
                ulong i;
                zval *l;
-       
+
                array_init(*retval);
 
                for (i=0; i < p->field_count; i++) {
@@ -239,9 +245,9 @@ static int result_lengths_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 /* }}} */
 
 
-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(), my_ulonglong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), my_ulonglong);
 
 /* statement properties */
 
@@ -251,7 +257,7 @@ static int stmt_id_read(mysqli_object *obj, zval **retval TSRMLS_DC)
        MY_STMT *p;
 
        ALLOC_ZVAL(*retval); 
-       CHECK_OBJECT();
+       CHECK_STATUS(MYSQLI_STATUS_VALID);
 
        p = (MY_STMT*)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
 
@@ -267,39 +273,43 @@ static int stmt_id_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 /* {{{ property stmt_affected_rows_read */
 static int stmt_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
-       MY_STMT *stmt;
+       MY_STMT *p;
        my_ulonglong rc;
 
        ALLOC_ZVAL(*retval); 
-       CHECK_OBJECT();
+       CHECK_STATUS(MYSQLI_STATUS_VALID);
 
-       stmt = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
-       rc = mysql_stmt_affected_rows(stmt->stmt);
+       p = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
 
-       if (rc == (my_ulonglong)-1) {
-               ZVAL_LONG(*retval, -1);
-               return SUCCESS;
-       } 
-
-       if (rc < LONG_MAX) {
-               ZVAL_LONG(*retval, rc);
+       if (!p) {
+               ZVAL_NULL(*retval);
        } else {
-               char ret[40];
-               sprintf(ret, "%llu", (my_ulonglong) rc);
-               ZVAL_STRING(*retval, ret, 1);
+               rc = mysql_stmt_affected_rows(p->stmt);
+       
+               if (rc == (my_ulonglong)-1) {
+                       ZVAL_LONG(*retval, -1);
+                       return SUCCESS;
+               } 
+       
+               if (rc < LONG_MAX) {
+                       ZVAL_LONG(*retval, rc);
+               } else {
+                       char ret[40];
+                       sprintf(ret, "%llu", (my_ulonglong) rc);
+                       ZVAL_STRING(*retval, ret, 1);
+               }
        }
-
        return SUCCESS;
 }
 /* }}} */
 
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(), my_ulonglong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(), my_ulonglong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(), ulong);
-MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT());
-MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT());
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong);
+MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID));
+MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID));
 
 /* }}} */
 mysqli_property_entry mysqli_link_property_entries[] = {
index 1093ccfab85f05805be9ae2b90f6df16be346a2b..b68c4509b0b4073ce7ebfd5e98901043e35ffbfc 100644 (file)
@@ -39,7 +39,7 @@ PHP_FUNCTION(mysqli_disable_reads_from_master)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        mysql_disable_reads_from_master(mysql);
        RETURN_TRUE;
 }
@@ -55,7 +55,7 @@ PHP_FUNCTION(mysqli_disable_rpl_parse)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
        mysql_disable_rpl_parse(mysql);
        RETURN_TRUE;
 }
@@ -71,7 +71,7 @@ PHP_FUNCTION(mysqli_enable_reads_from_master)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        mysql_enable_reads_from_master(mysql);
        RETURN_TRUE;
@@ -88,7 +88,7 @@ PHP_FUNCTION(mysqli_enable_rpl_parse)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        mysql_enable_rpl_parse(mysql);
        RETURN_TRUE;
@@ -106,7 +106,7 @@ PHP_FUNCTION(mysqli_master_query) {
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (mysql_master_query(mysql, query, query_len)) {
                RETURN_FALSE;
@@ -125,7 +125,7 @@ PHP_FUNCTION(mysqli_rpl_parse_enabled)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_LONG(mysql_rpl_parse_enabled(mysql));
 }
@@ -141,7 +141,7 @@ PHP_FUNCTION(mysqli_rpl_probe)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
 
        if (mysql_rpl_probe(mysql)) {
@@ -163,7 +163,7 @@ PHP_FUNCTION(mysqli_rpl_query_type)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        RETURN_LONG(mysql_rpl_query_type(query, query_len));
 }
@@ -181,7 +181,7 @@ PHP_FUNCTION(mysqli_send_query)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (mysql_send_query(mysql, query, query_len)) {
                RETURN_FALSE;
@@ -202,7 +202,7 @@ PHP_FUNCTION(mysqli_slave_query)
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &mysql_link, mysqli_link_class_entry, &query, &query_len) == FAILURE) {
                return;
        }
-       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link");
+       MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
 
        if (mysql_slave_query(mysql, query, query_len)) {
                RETURN_FALSE;
index 427822bdc2804c3fa4be65a4cabcadef4c328db3..733eab149a71accf0ba74143630a8dff4bdde482 100644 (file)
@@ -100,7 +100,7 @@ PHP_METHOD(mysqli_warning, next)
                        return;
                }
 
-               MYSQLI_FETCH_RESOURCE(w, MYSQLI_WARNING *, &mysqli_warning, "mysqli_warning");
+               MYSQLI_FETCH_RESOURCE(w, MYSQLI_WARNING *, &mysqli_warning, "mysqli_warning", MYSQLI_STATUS_VALID);
 
                if (w->next) {
                        w = w->next;
@@ -182,11 +182,11 @@ PHP_METHOD(mysqli_warning, __construct)
 
        if (obj->zo.ce == mysqli_link_class_entry) {
                MY_MYSQL *mysql;
-               MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &z, "mysqli_link");
+               MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &z, "mysqli_link", MYSQLI_STATUS_VALID);
                hdl = mysql->mysql;
        } else if (obj->zo.ce == mysqli_stmt_class_entry) {
                MY_STMT *stmt;
-               MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &z, "mysqli_stmt");
+               MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, &z, "mysqli_stmt", MYSQLI_STATUS_VALID);
                hdl = stmt->stmt->mysql;
        } else {
                RETURN_FALSE;
@@ -199,13 +199,13 @@ PHP_METHOD(mysqli_warning, __construct)
        }
 
        mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
+       mysqli_resource->status = MYSQLI_STATUS_VALID;
        mysqli_resource->ptr = mysqli_resource->info = (void *)w;
 
        if (!getThis() || !instanceof_function(Z_OBJCE_P(getThis()), mysqli_warning_class_entry TSRMLS_CC)) {
                MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry);    
        } else {
                ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
-               ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->valid = 1;
        }
 
 }
index 82a0b3bb2b191f148d136f43da1561c476707ff4..79225b5cc71284c3e30d3f4c91f16872a4d4a11c 100644 (file)
 #define HAVE_MYSQLI_SET_CHARSET
 #endif
 
+
 #include <errmsg.h>
 
 #ifndef PHP_MYSQLI_H
 #define PHP_MYSQLI_H
 
-#define MYSQLI_VERSION_ID              101008
+#define MYSQLI_VERSION_ID              101009
+
+enum mysqli_status {
+       MYSQLI_STATUS_UNKNOWN=0,
+       MYSQLI_STATUS_CLEARED,
+       MYSQLI_STATUS_INITIALIZED,
+       MYSQLI_STATUS_VALID
+};
 
 typedef struct {
        ulong           buflen;
@@ -57,17 +65,17 @@ typedef struct {
 } BIND_BUFFER;
 
 typedef struct {
-       MYSQL_STMT      *stmt;
-       BIND_BUFFER     param;
-       BIND_BUFFER     result;
-       char            *query;
+       MYSQL_STMT                      *stmt;
+       BIND_BUFFER                     param;
+       BIND_BUFFER                     result;
+       char                            *query;
 } MY_STMT;
 
 typedef struct {
-       MYSQL           *mysql;
-       zval            *li_read;
-       php_stream      *li_stream;
-       unsigned int multi_query;       
+       MYSQL                           *mysql;
+       zval                            *li_read;
+       php_stream                      *li_stream;
+       unsigned int            multi_query;    
 } MY_MYSQL;
 
 typedef struct {
@@ -77,15 +85,15 @@ typedef struct {
 } PROFILER;
 
 typedef struct {
-       void            *ptr;           /* resource: (mysql, result, stmt)   */
-       void            *info;          /* additional buffer                             */
+       void                            *ptr;           /* resource: (mysql, result, stmt)   */
+       void                            *info;          /* additional buffer                             */
+    enum mysqli_status status;
 } MYSQLI_RESOURCE;
 
 typedef struct _mysqli_object {
-       zend_object     zo;
-       void                    *ptr;
-       char                    valid;
-       HashTable               *prop_handler;
+       zend_object             zo;
+       void                            *ptr;
+       HashTable                       *prop_handler;
 } mysqli_object; /* extends zend_object */
 
 typedef struct {
@@ -181,7 +189,6 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRML
 
 #define MYSQLI_REGISTER_RESOURCE_EX(__ptr, __zval, __ce)  \
        ((mysqli_object *) zend_object_store_get_object(__zval TSRMLS_CC))->ptr = __ptr; \
-       ((mysqli_object *) zend_object_store_get_object(__zval TSRMLS_CC))->valid = 1;
 
 #define MYSQLI_RETURN_RESOURCE(__ptr, __ce) \
        Z_TYPE_P(return_value) = IS_OBJECT; \
@@ -199,7 +206,7 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRML
        MYSQLI_REGISTER_RESOURCE_EX(__ptr, object, __ce)\
 }
 
-#define MYSQLI_FETCH_RESOURCE(__ptr, __type, __id, __name) \
+#define MYSQLI_FETCH_RESOURCE(__ptr, __type, __id, __name, __check) \
 { \
        MYSQLI_RESOURCE *my_res; \
        mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\
@@ -207,19 +214,19 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry * TSRML
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", intern->zo.ce->name);\
                RETURN_NULL();\
        }\
-       if (!intern->valid) { \
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid resource %s", intern->zo.ce->name); \
-               RETURN_NULL(); \
-       } \
        __ptr = (__type)my_res->ptr; \
-       if (!strcmp((char *)__name, "mysqli_stmt")) {\
-               if (!((MY_STMT *)__ptr)->stmt->mysql) {\
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Statement isn't valid anymore");\
-                       RETURN_NULL();\
-               }\
+       if (__check && my_res->status < __check) { \
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid object or resource %s\n", intern->zo.ce->name); \
+               RETURN_NULL();\
        }\
 } 
 
+#define MYSQLI_SET_STATUS(__id, __value) \
+{ \
+       mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\
+       ((MYSQLI_RESOURCE *)intern->ptr)->status = __value; \
+} \
+
 #define MYSQLI_CLEAR_RESOURCE(__id) \
 { \
        mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*(__id) TSRMLS_CC);\
index fa4e60e185d611e7f7a8b20140d49a3a87763963..301af98939c71f4c430b7282bf5f41c5715ac4b6 100644 (file)
@@ -8,6 +8,7 @@ mysqli bind_result 1
        
        /*** test mysqli_connect 127.0.0.1 ***/
        $link = mysqli_connect($host, $user, $passwd);
+    $link->query("CREATE SCHEMA test");
 
        mysqli_select_db($link, "test");                
        $rc = mysqli_query($link,"DROP TABLE IF EXISTS test_fetch_null");
index a180bea75651bc5d0b1251cb0e72149bd359805e..8bd26f5db944567540b483100c7cc3493bdbc1e1 100644 (file)
@@ -8,13 +8,12 @@ mysqli autocommit/commit/rollback
        $row = mysqli_fetch_row($result);
        mysqli_free_result($result);
        mysqli_close($link);
-       
        if ($row[1] == "DISABLED" || $row[1] == "NO") {
                printf ("skip innodb support is not installed or enabled.");
+               exit;
        }
+       require_once('skipif.inc');
 ?>
---SKIPIF--
-<?php require_once('skipif.inc'); ?>
 --FILE--
 <?php
        include "connect.inc";
index 12d6ce2e9a23c3a9c5465f4d57748c6d717e22ff..a949b52c6456507d8060a7a26d7e00e05eb1ca5c 100644 (file)
@@ -18,6 +18,7 @@ class DbConnection {
                $mysql = new mysqli($host, $user, $passwd, "test");
                $mysql->query("DROP TABLE IF EXISTS test_warnings");
                $mysql->query("CREATE TABLE test_warnings (a int not null)");
+               $mysql->query("SET sql_mode=''");
                $mysql->query("INSERT INTO test_warnings VALUES (1),(2),(NULL)");
                var_dump(mysqli_warning::__construct($mysql));
        } 
diff --git a/ext/mysqli/tests/bug36802.phpt b/ext/mysqli/tests/bug36802.phpt
new file mode 100644 (file)
index 0000000..69ef56b
--- /dev/null
@@ -0,0 +1,42 @@
+--TEST--
+bug #36802 : crashes with mysql_init                                            
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+       class my_mysqli extends mysqli {
+               function __construct() 
+               {
+               }
+       }
+
+       include "connect.inc";
+
+
+       $mysql = mysqli_init();
+
+       /* following operations should not work */
+       $x[0] = @$mysql->set_charset('utf8');
+       $x[1] = @$mysql->query("SELECT 'foo' FROM DUAL");
+
+       /* following operations should work */ 
+       $x[2] = ($mysql->client_version > 0);
+       $x[3] = $mysql->errno;
+       $mysql->close();
+       
+
+
+       var_dump($x);
+?>
+--EXPECT--
+array(4) {
+  [0]=>
+  NULL
+  [1]=>
+  NULL
+  [2]=>
+  bool(true)
+  [3]=>
+  int(0)
+}
index 2fcf4ff0fff36e6c45155165bab119719a1e6ea7..2b4a67be2c642b2cb6263874d0c7b0714166c151 100644 (file)
                $passwd = "";
        } else {
                $path =  dirname(__FILE__);
-               $host = $user = $passwd = NULL;
+               $host = ":embedded";
+               $user = $passwd = NULL;
                $args = array(
                                        "--datadir=$path", 
                                        "--innodb_data_home_dir=$path",
                                        "--innodb_data_file_path=ibdata1:10M:autoextend",
                                        "--log-error=$path/testrun.log"
                                );
-               $driver->embedded_server_start(TRUE, $args, NULL);
+               $x = $driver->embedded_server_start(TRUE, $args, NULL);
+               var_dump($x);
        }
 
 ?>