andrey          Wed Feb  6 14:11:32 2008 UTC

  Modified files:              
    /php-src/ext/mysqli/tests   mysqli_stmt_affected_rows.phpt 
    /php-src/ext/mysqlnd        mysqlnd_result.c 
  Log:
  Fix a bug and a test
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt?r1=1.2&r2=1.3&diff_format=u
Index: php-src/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt
diff -u php-src/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt:1.2 
php-src/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt:1.3
--- php-src/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt:1.2 Thu Aug  9 
10:01:20 2007
+++ php-src/ext/mysqli/tests/mysqli_stmt_affected_rows.phpt     Wed Feb  6 
14:11:32 2008
@@ -160,17 +160,77 @@
        if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
                printf("[029] Expecting int/1, got %s/%s\n", gettype($tmp), 
$tmp);
 
+       if (!mysqli_stmt_prepare($stmt, 'SELECT label FROM test WHERE id = 
100') ||
+               !mysqli_stmt_execute($stmt))
+               printf("[030] [%d] %s\n", mysqli_stmt_errno($stmt), 
mysqli_stmt_error($stmt));
+
+       /* use it like num_rows */
+       /* PS are unbuffered, num_rows cannot determine the row count before 
all rows have been fetched and/or buffered */
+       if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
+               printf("[031] Expecting int/-1, got %s/%s\n", gettype($tmp), 
$tmp);
+
+       if (0 !== ($tmp = mysqli_stmt_num_rows($stmt)))
+               printf("[032] Expecting int/0, got %s/%s\n", gettype($tmp), 
$tmp);
+
+       if (!mysqli_stmt_store_result($stmt))
+               printf("[033] [%d] %s\n", mysqli_stmt_errno($stmt), 
mysqli_stmt_error($stmt));
+
+       if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
+               printf("[034] Expecting int/0, got %s/%s\n", gettype($tmp), 
$tmp);
+
+       if (1 !== ($tmp = mysqli_stmt_num_rows($stmt)))
+               printf("[035] Expecting int/0, got %s/%s\n", gettype($tmp), 
$tmp);
+
+       mysqli_stmt_free_result($stmt);
+       mysqli_stmt_close($stmt);
+       $stmt = mysqli_stmt_init($link);
+
+       if (!mysqli_stmt_prepare($stmt, 'SELECT label FROM test WHERE 1 = 2') ||
+               !mysqli_stmt_execute($stmt))
+               printf("[036] [%d] %s\n", mysqli_stmt_errno($stmt), 
mysqli_stmt_error($stmt));
+
+       /* use it like num_rows */
+       if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
+               printf("[037] Expecting int/-1, got %s/%s\n", gettype($tmp), 
$tmp);
+
+       if (true !== ($tmp = mysqli_stmt_store_result($stmt)))
+               printf("[038] Expecting boolean/true, got %s\%s\n", 
gettype($tmp), $tmp);
+
+       if (0 !== ($tmp = mysqli_stmt_num_rows($stmt)))
+               printf("[039] Expecting int/0, got %s/%s\n", gettype($tmp), 
$tmp);
+
+       if (0 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
+               printf("[040] Expecting int/0, got %s/%s\n", gettype($tmp), 
$tmp);
+
+       /* try to use stmt_affected_rows like stmt_num_rows */
+       /* stmt_affected_rows is not really meant for SELECT! */
+       if (mysqli_stmt_prepare($stmt, 'SELECT unknown_column FROM 
this_table_does_not_exist') ||
+               mysqli_stmt_execute($stmt))
+               printf("[041] The invalid SELECT statement is issued on 
purpose\n");
+
+       if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
+               printf("[042] Expecting int/-1, got %s/%s\n", gettype($tmp), 
$tmp);
+
+       if (false !== ($tmp = mysqli_stmt_store_result($stmt)))
+               printf("[043] Expecting boolean/false, got %s\%s\n", 
gettype($tmp), $tmp);
+
+       if (0 !== ($tmp = mysqli_stmt_num_rows($stmt)))
+               printf("[044] Expecting int/0, got %s/%s\n", gettype($tmp), 
$tmp);
+
+       if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
+               printf("[045] Expecting int/-1, got %s/%s\n", gettype($tmp), 
$tmp);
+
        mysqli_stmt_close($stmt);
        $stmt = mysqli_stmt_init($link);
 
        if (!mysqli_stmt_prepare($stmt, "DROP TABLE IF EXISTS test") ||
                !mysqli_stmt_execute($stmt))
-               printf("[030] [%d] %s\n", mysqli_stmt_errno($stmt), 
mysqli_stmt_error($stmt));
+               printf("[046] [%d] %s\n", mysqli_stmt_errno($stmt), 
mysqli_stmt_error($stmt));
 
        mysqli_stmt_close($stmt);
 
        if (!is_null($tmp = mysqli_stmt_affected_rows($stmt)))
-               printf("[031] Expecting NULL, got %s/%s\n", gettype($tmp), 
$tmp);
+               printf("[047] Expecting NULL, got %s/%s\n", gettype($tmp), 
$tmp);
 
        mysqli_close($link);
 
@@ -180,4 +240,4 @@
 [009] [%d] (error message varies with the MySQL Server version, check the 
error code)
 
 Warning: mysqli_stmt_affected_rows(): Couldn't fetch mysqli_stmt in %s on line 
%d
-done!
\ No newline at end of file
+done!
http://cvs.php.net/viewvc.cgi/php-src/ext/mysqlnd/mysqlnd_result.c?r1=1.16&r2=1.17&diff_format=u
Index: php-src/ext/mysqlnd/mysqlnd_result.c
diff -u php-src/ext/mysqlnd/mysqlnd_result.c:1.16 
php-src/ext/mysqlnd/mysqlnd_result.c:1.17
--- php-src/ext/mysqlnd/mysqlnd_result.c:1.16   Mon Feb  4 17:32:43 2008
+++ php-src/ext/mysqlnd/mysqlnd_result.c        Wed Feb  6 14:11:32 2008
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: mysqlnd_result.c,v 1.16 2008/02/04 17:32:43 andrey Exp $ */
+/* $Id: mysqlnd_result.c,v 1.17 2008/02/06 14:11:32 andrey Exp $ */
 #include "php.h"
 #include "mysqlnd.h"
 #include "mysqlnd_wireprotocol.h"
@@ -372,7 +372,6 @@
 void mysqlnd_internal_free_result(MYSQLND_RES *result TSRMLS_DC)
 {
        DBG_ENTER("mysqlnd_internal_free_result");
-
        result->m.free_result_contents(result TSRMLS_CC);
 
        if (result->conn) {
@@ -439,6 +438,7 @@
        ret = FAIL;
        PACKET_INIT_ALLOCA(rset_header, PROT_RSET_HEADER_PACKET);
        do {
+               SET_ERROR_AFF_ROWS(conn);
                if (FAIL == (ret = PACKET_READ_ALLOCA(rset_header, conn))) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error 
reading result set's header");
                        break;
@@ -455,7 +455,6 @@
                          safe to unconditionally turn off the flag here.
                        */
                        conn->upsert_status.server_status &= 
~SERVER_MORE_RESULTS_EXISTS;
-                       conn->upsert_status.affected_rows = -1;
                        /*
                          This will copy the error code and the messages, as 
they
                          are buffers in the struct
@@ -507,6 +506,9 @@
 
                                MYSQLND_INC_CONN_STATISTIC(&conn->stats, 
STAT_RSET_QUERY);
                                memset(&conn->upsert_status, 0, 
sizeof(conn->upsert_status));
+                               /* restore after zeroing */
+                               SET_ERROR_AFF_ROWS(conn);
+
                                conn->last_query_type = QUERY_SELECT;
                                CONN_SET_STATE(conn, CONN_FETCHING_DATA);
                                /* PS has already allocated it */

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

Reply via email to