georg           Wed Jun 22 05:12:45 2005 EDT

  Modified files:              
    /php-src/ext/mysqli mysqli_warning.c mysqli.c php_mysqli.h 
  Log:
  changed/fixed mysqli_warning class
  added prefetch support for cursors
  
  
http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli_warning.c?r1=1.3&r2=1.4&ty=u
Index: php-src/ext/mysqli/mysqli_warning.c
diff -u php-src/ext/mysqli/mysqli_warning.c:1.3 
php-src/ext/mysqli/mysqli_warning.c:1.4
--- php-src/ext/mysqli/mysqli_warning.c:1.3     Thu Apr 28 19:49:04 2005
+++ php-src/ext/mysqli/mysqli_warning.c Wed Jun 22 05:12:43 2005
@@ -30,88 +30,81 @@
 /* {{{ void php_clear_warnings() */
 void php_clear_warnings(MYSQLI_WARNING *w)
 {
-       if (w->result) {
-               mysql_free_result(w->result);
-       }
-       efree(w);
+       MYSQLI_WARNING  *n;
+
+       while (w) {
+               n = w;
+               efree(w->reason);
+               w = w->next;
+               efree(n);
+       } 
 }
 /* }}} */
 
-/* {{{ void php_get_warnings(MYSQL *mysql) */
-MYSQLI_WARNING *php_get_warnings(MYSQL *mysql)
+/* {{{ MYSQLI_WARNING *php_new_warning */
+MYSQLI_WARNING *php_new_warning(char *reason, char *sqlstate, int errorno)
 {
-       MYSQLI_WARNING *w;
-       int cwarnings;
+       MYSQLI_WARNING  *w;
 
-       if (!(cwarnings = mysql_warning_count(mysql))) {
-               return NULL;
-       }
+       w = (MYSQLI_WARNING *)ecalloc(1, sizeof(MYSQLI_WARNING));
 
-       if (mysql_query(mysql, "SHOW WARNINGS")) {
-               return NULL;
-       }
-
-       w = (MYSQLI_WARNING *)ecalloc(sizeof(MYSQLI_WARNING), 1);
-
-       w->warning_count = cwarnings;
-       w->result = mysql_store_result(mysql);
-       if (!(w->row = mysql_fetch_row(w->result))) {
-               mysql_free_result(w->result);
-               efree(w);
-               return NULL;
+       w->reason = safe_estrdup(reason);
+       if (sqlstate) {
+               strcpy(w->sqlstate, sqlstate);
+       } else {
+               strcpy(w->sqlstate, "00000");
        }
+       w->errorno = errorno;
 
        return w;
 }
 /* }}} */
 
-/* {{{ mysqli_warning::__construct */
-ZEND_FUNCTION(mysqli_warning_construct)
+/* {{{ MYSQLI_WARNING *php_get_warnings(MYSQL *mysql) */
+MYSQLI_WARNING *php_get_warnings(MYSQL *mysql)
 {
-       MYSQL                   *mysql = NULL;
-       MYSQLI_WARNING  *w;
-       MYSQLI_RESOURCE *mysqli_resource;
-       mysqli_object   *obj;
+       MYSQLI_WARNING  *w, *first = NULL, *prev = NULL;
+       MYSQL_RES               *result;
+       MYSQL_ROW               row;
 
-       if (!getThis()) {
-               RETURN_FALSE;
-       } 
-
-       obj = (mysqli_object *)zend_objects_get_address(getThis() TSRMLS_CC);
-
-       if (obj->zo.ce == mysqli_link_class_entry) {
-               mysql = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE 
*)(obj->ptr))->ptr)->mysql;
-       } else if (obj->zo.ce == mysqli_stmt_class_entry) {
-               mysql = (MYSQL *)((MY_STMT *)((MYSQLI_RESOURCE 
*)(obj->ptr))->ptr)->stmt->mysql;
+       if (mysql_query(mysql, "SHOW WARNINGS")) {
+               return NULL;
        }
 
-       if ((w = php_get_warnings(mysql))) {
-               mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, 
sizeof(MYSQLI_RESOURCE));
-               mysqli_resource->ptr = (void *)w;
-               obj->valid = 1;
-
-               MYSQLI_RETURN_RESOURCE(mysqli_resource, 
mysqli_warning_class_entry);    
-       } else {
-               RETURN_FALSE;
+       result = mysql_store_result(mysql);
+       while ((row = mysql_fetch_row(result))) {
+               w = php_new_warning(row[2], "HY000", atoi(row[1]));
+               if (!first) {
+                       first = w;
+               }
+               if (prev) {
+                       prev->next = (void *)w;
+               }
+               prev = w;
        }
+       mysql_free_result(result);
+       return first;
 }
 /* }}} */
 
-/* {{{ bool mysqli_warning::next */
-ZEND_FUNCTION(mysqli_warning_next) {
+/* {{{ bool mysqli_warning::next() */
+PHP_METHOD(mysqli_warning, next) 
+{
        MYSQLI_WARNING  *w;
-       zval                    *mysql_warning;
+       zval                    *mysqli_warning;
        mysqli_object *obj = (mysqli_object 
*)zend_objects_get_address(getThis() TSRMLS_CC);
 
-       if (obj->valid) {
+       if (obj->ptr) {
                if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
getThis(), "O", 
-                                                                               
 &mysql_warning, mysqli_warning_class_entry) == FAILURE) {
+                                                                               
 &mysqli_warning, mysqli_warning_class_entry) == FAILURE) {
                        return;
                }
 
-               MYSQLI_FETCH_RESOURCE(w, MYSQLI_WARNING *, &mysql_warning, 
"mysqli_warning");
+               MYSQLI_FETCH_RESOURCE(w, MYSQLI_WARNING *, &mysqli_warning, 
"mysqli_warning");
 
-               if (w->warning_count && (w->row = mysql_fetch_row(w->result))) {
+               if (w->next) {
+                       w = w->next;
+               ((MYSQLI_RESOURCE *)(obj->ptr))->ptr = w;
                        RETURN_TRUE;
                }
        }
@@ -119,16 +112,19 @@
 }
 /* }}} */
 
-/* {{{ property mysqli_warning_error */
-int mysqli_warning_error(mysqli_object *obj, zval **retval TSRMLS_DC)
+/* {{{ property mysqli_warning_message */
+int mysqli_warning_message(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
        MYSQLI_WARNING *w;
 
-       ALLOC_ZVAL(*retval);
-       w = obj->valid ? (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr 
: NULL;
+       if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) {
+               return FAILURE;
+       }
 
-       if (w && w->row && w->row[2]) {
-               ZVAL_STRING(*retval, w->row[2], 1);
+       w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
+       ALLOC_ZVAL(*retval);
+       if (w->reason) {
+               ZVAL_STRING(*retval, w->reason, 1);
        } else {
                ZVAL_NULL(*retval);
        }
@@ -136,35 +132,94 @@
 }
 /* }}} */
 
+/* {{{ property mysqli_warning_sqlstate */
+int mysqli_warning_sqlstate(mysqli_object *obj, zval **retval TSRMLS_DC)
+{
+       MYSQLI_WARNING *w;
+       
+       if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) {
+               return FAILURE;
+       }
+
+       w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
+       ALLOC_ZVAL(*retval);
+       ZVAL_STRING(*retval, w->sqlstate, 1);
+       return SUCCESS;
+}
+/* }}} */
+
 /* {{{ property mysqli_warning_error */
 int mysqli_warning_errno(mysqli_object *obj, zval **retval TSRMLS_DC)
 {
        MYSQLI_WARNING *w;
 
+       if (!obj->ptr || !((MYSQLI_RESOURCE *)(obj->ptr))->ptr) {
+               return FAILURE;
+       }
+       w = (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
        ALLOC_ZVAL(*retval);
-       w = obj->valid ? (MYSQLI_WARNING *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr 
: NULL;
+       ZVAL_LONG(*retval, w->errorno);
+       return SUCCESS;
+}
+/* }}} */
+
+/* {{{ mysqli_warning_construct(object obj) */
+PHP_METHOD(mysqli_warning, __construct)
+{
+       zval                    **z;
+       mysqli_object   *obj;
+       MYSQL                   *hdl;
+       MYSQLI_WARNING  *w;
+       MYSQLI_RESOURCE *mysqli_resource;
+
+       if (ZEND_NUM_ARGS() != 1) {
+               WRONG_PARAM_COUNT;
+       }
+       if (zend_get_parameters_ex(1, &z)==FAILURE) {
+               return;
+       }
+       obj = (mysqli_object *)zend_object_store_get_object(*(z) TSRMLS_CC);\
 
-       if (w && w->row && w->row[1]) {
-               ZVAL_LONG(*retval, atoi(w->row[1]));
+       if (obj->zo.ce == mysqli_link_class_entry) {
+               MY_MYSQL *mysql;
+               MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, z, "mysqli_link");
+               hdl = mysql->mysql;
+       } else if (obj->zo.ce == mysqli_stmt_class_entry) {
+               MY_STMT *stmt;
+               MYSQLI_FETCH_RESOURCE(stmt, MY_STMT *, z, "mysqli_stmt");
+               hdl = stmt->stmt->mysql;
        } else {
-               ZVAL_NULL(*retval);
+               RETURN_FALSE;
        }
-       return SUCCESS;
+
+       if (mysql_warning_count(hdl)) {
+               w = php_get_warnings(hdl); 
+       } else {
+               RETURN_FALSE;
+       }
+
+       mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, 
sizeof(MYSQLI_RESOURCE));
+       mysqli_resource->ptr = mysqli_resource->info = (void *)w;
+
+       if (!getThis()) {
+               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;
+       }
+
 }
 /* }}} */
 
-/* {{{ mysqli_warning_methods[]
- */
 function_entry mysqli_warning_methods[] = {
-       PHP_FALIAS(__construct,mysqli_warning_construct, NULL)
-       PHP_FALIAS(next,mysqli_warning_next,NULL)
+       PHP_ME(mysqli_warning, __construct,             NULL, 
ZEND_ACC_PROTECTED)
+       PHP_ME(mysqli_warning, next,                    NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
-/* }}} */
-
 
 mysqli_property_entry mysqli_warning_property_entries[] = {
-       {"error", mysqli_warning_error, NULL},
+       {"message", mysqli_warning_message, NULL},
+       {"sqlstate", mysqli_warning_sqlstate, NULL},
        {"errno", mysqli_warning_errno, NULL},
        {NULL, NULL, NULL}
 };
http://cvs.php.net/diff.php/php-src/ext/mysqli/mysqli.c?r1=1.69&r2=1.70&ty=u
Index: php-src/ext/mysqli/mysqli.c
diff -u php-src/ext/mysqli/mysqli.c:1.69 php-src/ext/mysqli/mysqli.c:1.70
--- php-src/ext/mysqli/mysqli.c:1.69    Mon May  9 18:29:21 2005
+++ php-src/ext/mysqli/mysqli.c Wed Jun 22 05:12:43 2005
@@ -15,7 +15,7 @@
   | Author: Georg Richter <[EMAIL PROTECTED]>                                |
   +----------------------------------------------------------------------+
 
-  $Id: mysqli.c,v 1.69 2005/05/09 22:29:21 andrey Exp $ 
+  $Id: mysqli.c,v 1.70 2005/06/22 09:12:43 georg Exp $ 
 */
 
 #ifdef HAVE_CONFIG_H
@@ -152,7 +152,7 @@
                }
        } else if (intern->zo.ce == mysqli_warning_class_entry) { /* warning 
object */
                if (my_res && my_res->ptr) {
-                       php_clear_warnings((MYSQLI_WARNING *)my_res->ptr);
+                       php_clear_warnings((MYSQLI_WARNING *)my_res->info);
                }
        }
        my_efree(my_res);
@@ -316,7 +316,7 @@
                } else if (obj->zo.ce == mysqli_driver_class_entry) {
                        f.handler = ZEND_FN(mysqli_driver_construct);
                } else if (obj->zo.ce == mysqli_warning_class_entry) {
-                       f.handler = ZEND_FN(mysqli_driver_construct);
+                       f.handler = ZEND_FN(mysqli_warning___construct);
                }
        
                return (union _zend_function*)&f;
@@ -451,7 +451,7 @@
        zend_hash_init(&mysqli_driver_properties, 0, NULL, NULL, 1);
        MYSQLI_ADD_PROPERTIES(&mysqli_driver_properties, 
mysqli_driver_property_entries);
        zend_hash_add(&classes, ce->name, ce->name_length+1, 
&mysqli_driver_properties, sizeof(mysqli_driver_properties), NULL);
-    ce->ce_flags |= ZEND_ACC_FINAL;
+    ce->ce_flags |= ZEND_ACC_FINAL_CLASS;
 
        REGISTER_MYSQLI_CLASS_ENTRY("mysqli", mysqli_link_class_entry, 
mysqli_link_methods);
        ce = mysqli_link_class_entry;
@@ -461,11 +461,10 @@
 
        REGISTER_MYSQLI_CLASS_ENTRY("mysqli_warning", 
mysqli_warning_class_entry, mysqli_warning_methods);
        ce = mysqli_warning_class_entry;
-    ce->ce_flags |= ZEND_ACC_FINAL;
+    ce->ce_flags |= ZEND_ACC_FINAL_CLASS | ZEND_ACC_PROTECTED;
        zend_hash_init(&mysqli_warning_properties, 0, NULL, NULL, 1);
        MYSQLI_ADD_PROPERTIES(&mysqli_warning_properties, 
mysqli_warning_property_entries);
        zend_hash_add(&classes, ce->name, ce->name_length+1, 
&mysqli_warning_properties, sizeof(mysqli_warning_properties), NULL);
-    ce->ce_flags |= ZEND_ACC_FINAL;
 
        REGISTER_MYSQLI_CLASS_ENTRY("mysqli_result", mysqli_result_class_entry, 
mysqli_result_methods);
        ce = mysqli_result_class_entry;
@@ -513,6 +512,10 @@
        REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_FOR_UPDATE", 
CURSOR_TYPE_FOR_UPDATE, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_SCROLLABLE", 
CURSOR_TYPE_SCROLLABLE, CONST_CS | CONST_PERSISTENT);
 #endif
+
+#if MYSQL_VERSION_ID > 50007
+       REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_PREFETCH_ROWS", 
STMT_ATTR_PREFETCH_ROWS, CONST_CS | CONST_PERSISTENT);
+#endif
        
        /* column information */
        REGISTER_LONG_CONSTANT("MYSQLI_NOT_NULL_FLAG", NOT_NULL_FLAG, CONST_CS 
| CONST_PERSISTENT);
http://cvs.php.net/diff.php/php-src/ext/mysqli/php_mysqli.h?r1=1.49&r2=1.50&ty=u
Index: php-src/ext/mysqli/php_mysqli.h
diff -u php-src/ext/mysqli/php_mysqli.h:1.49 
php-src/ext/mysqli/php_mysqli.h:1.50
--- php-src/ext/mysqli/php_mysqli.h:1.49        Fri Jun  3 04:49:00 2005
+++ php-src/ext/mysqli/php_mysqli.h     Wed Jun 22 05:12:43 2005
@@ -15,7 +15,7 @@
   | Author: Georg Richter <[EMAIL PROTECTED]>                                |
   +----------------------------------------------------------------------+
 
-  $Id: php_mysqli.h,v 1.49 2005/06/03 08:49:00 georg Exp $ 
+  $Id: php_mysqli.h,v 1.50 2005/06/22 09:12:43 georg Exp $ 
 */
 
 /* A little hack to prevent build break, when mysql is used together with
@@ -71,12 +71,6 @@
        void            *info;          /* additional buffer                    
         */
 } MYSQLI_RESOURCE;
 
-typedef struct {
-       MYSQL_RES               *result;                /* stored result set 
from SHOW WARNINGS */
-       MYSQL_ROW               row;
-       int                             warning_count;  /* number of warnings */
-} MYSQLI_WARNING;
-
 typedef struct _mysqli_object {
        zend_object     zo;
        void                    *ptr;
@@ -84,6 +78,13 @@
        HashTable               *prop_handler;
 } mysqli_object; /* extends zend_object */
 
+typedef struct {
+       char                    *reason;
+       char                    sqlstate[6];
+       int                             errorno;
+       void                    *next;
+} MYSQLI_WARNING;
+
 typedef struct _mysqli_property_entry {
        char *pname;
        int (*r_func)(mysqli_object *obj, zval **retval TSRMLS_DC);
@@ -157,6 +158,7 @@
 extern void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int 
override_flag, int into_object);
 extern void php_clear_stmt_bind(MY_STMT *stmt);
 extern void php_clear_mysql(MY_MYSQL *);
+extern MYSQLI_WARNING *php_get_warnings(MYSQL *mysql);
 extern void php_clear_warnings(MYSQLI_WARNING *w);
 extern void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type);
 extern void php_mysqli_report_error(char *sqlstate, int errorno, char *error 
TSRMLS_DC);
@@ -359,6 +361,7 @@
 PHP_FUNCTION(mysqli_get_proto_info);
 PHP_FUNCTION(mysqli_get_server_info);
 PHP_FUNCTION(mysqli_get_server_version);
+PHP_FUNCTION(mysqli_get_warnings);
 PHP_FUNCTION(mysqli_info);
 PHP_FUNCTION(mysqli_insert_id);
 PHP_FUNCTION(mysqli_init);
@@ -411,6 +414,7 @@
 PHP_FUNCTION(mysqli_stmt_errno);
 PHP_FUNCTION(mysqli_stmt_error);
 PHP_FUNCTION(mysqli_stmt_free_result);
+PHP_FUNCTION(mysqli_stmt_get_warnings);
 PHP_FUNCTION(mysqli_stmt_reset);
 PHP_FUNCTION(mysqli_stmt_insert_id);
 PHP_FUNCTION(mysqli_stmt_num_rows);
@@ -425,7 +429,7 @@
 ZEND_FUNCTION(mysqli_stmt_construct);
 ZEND_FUNCTION(mysqli_result_construct);
 ZEND_FUNCTION(mysqli_driver_construct);
-ZEND_FUNCTION(mysqli_warning_construct);
+ZEND_METHOD(mysqli_warning,__construct);
 
 ZEND_BEGIN_MODULE_GLOBALS(mysqli)
        long                    default_link;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to