Author: ahristov
Date: 2007-03-13 09:36:26 +0100 (Tue, 13 Mar 2007)
New Revision: 110
Modified:
trunk/ext/mysqli/mysqlnd/mysqlnd.c
trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c
trunk/ext/mysqli/tests/057.phpt
trunk/ext/mysqli/tests/mysqli_fetch_all_oo.phpt
trunk/ext/mysqli/tests/mysqli_prepare.phpt
Log:
Fix two issues which were affecting test 057.phpt
- The user was calling stmt_close() directly after stmt_execute() and
we have to clean the line before being able to close the statement.
- libmysql's documentation states that mysql_stmt_affected_rows() should
return mysql_stmt_num_rows() for SELECT statements. The same is stated
for non-prepared statements too.
In addition fix similar problem which was affecting mysqlnd_stmt_reset().
Added a test case for it.
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd.c 2007-03-12 22:51:02 UTC (rev 109)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd.c 2007-03-13 08:36:26 UTC (rev 110)
@@ -1396,7 +1396,9 @@
if (PASS == ret) {
/* Position at the first row */
result->data_cursor = result->data;
- /* No multithreading issues as we don't share the connection :) */
+
+ /* libmysql's documentation says it should be so for SELECT statements */
+ conn->upsert_status.affected_rows = result->row_count;
} else {
mysqlnd_internal_free_result_contents(result);
efree(result);
Modified: trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c
===================================================================
--- trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c 2007-03-12 22:51:02 UTC (rev 109)
+++ trunk/ext/mysqli/mysqlnd/mysqlnd_ps.c 2007-03-13 08:36:26 UTC (rev 110)
@@ -162,7 +162,11 @@
/* Position at the first row */
result->data_cursor = result->data;
stmt->state = MYSQLND_STMT_USE_OR_STORE_CALLED;
- /* No multithreading issues as we don't share the connection :) */
+
+ /* libmysql API docs say it should be so for SELECT statements */
+ stmt->upsert_status.affected_rows =
+ stmt->conn->upsert_status.affected_rows =
+ stmt->result->row_count;
} else {
mysqlnd_internal_free_result_contents(stmt->result);
efree(stmt->result);
@@ -444,6 +448,12 @@
stmt->result->lengths = NULL;
if (stmt->field_count) {
stmt->state = MYSQLND_STMT_WAITING_USE_OR_STORE;
+ /*
+ We need to set this because the user might not call
+ use_result() or store_result() and we should be able to scrap the
+ data on the line, if he just decides to close the statement.
+ */
+
if (stmt->upsert_status.server_status & SERVER_STATUS_CURSOR_EXISTS) {
stmt->cursor_exists = TRUE;
conn->state = CONN_READY;
@@ -815,6 +825,16 @@
}
}
+ /*
+ If the user decided to close the statement right after execute()
+ We have to call the appropriate use_result() or store_result() and
+ clean.
+ */
+ if (stmt->state == MYSQLND_STMT_WAITING_USE_OR_STORE) {
+ stmt->default_rset_handler(stmt TSRMLS_CC);
+ stmt->state = MYSQLND_STMT_USER_FETCHING;
+ }
+
if (stmt->result) {
stmt->result->m.skip_result(stmt->result TSRMLS_CC);
}
@@ -1369,6 +1389,16 @@
MYSQLND * conn = stmt->conn;
zend_uchar cmd_buf[STMT_ID_LENGTH /* statement id */];
+ /*
+ If the user decided to close the statement right after execute()
+ We have to call the appropriate use_result() or store_result() and
+ clean.
+ */
+ if (stmt->state == MYSQLND_STMT_WAITING_USE_OR_STORE) {
+ stmt->default_rset_handler(stmt TSRMLS_CC);
+ stmt->state = MYSQLND_STMT_USER_FETCHING;
+ }
+
/* unbuffered set not fetched to the end ? Clean the line */
if (stmt->result) {
stmt->result->m.skip_result(stmt->result TSRMLS_CC);
Modified: trunk/ext/mysqli/tests/057.phpt
===================================================================
--- trunk/ext/mysqli/tests/057.phpt 2007-03-12 22:51:02 UTC (rev 109)
+++ trunk/ext/mysqli/tests/057.phpt 2007-03-13 08:36:26 UTC (rev 110)
@@ -26,7 +26,16 @@
}
mysqli_stmt_close($stmt);
+ /* now we should try mysqli_stmt_reset() */
$stmt = mysqli_prepare($link, "SELECT * FROM test_store_result");
+ var_dump(mysqli_execute($stmt));
+ var_dump(mysqli_stmt_reset($stmt));
+ var_dump($stmt = mysqli_prepare($link, "SELECT * FROM test_store_result"));
+ var_dump(mysqli_execute($stmt));
+ var_dump($stmt = mysqli_prepare($link, "SELECT * FROM test_store_result"));
+ var_dump(mysqli_stmt_reset($stmt));
+
+ $stmt = mysqli_prepare($link, "SELECT * FROM test_store_result");
mysqli_execute($stmt);
$result1 = mysqli_get_metadata($stmt);
mysqli_stmt_store_result($stmt);
@@ -47,6 +56,14 @@
mysqli_close($link);
?>
--EXPECTF--
+bool(true)
+bool(true)
+object(mysqli_stmt)#%d (%d) {
+}
+bool(true)
+object(mysqli_stmt)#%d (%d) {
+}
+bool(true)
Rows: 3
array(1) {
[0]=>
Modified: trunk/ext/mysqli/tests/mysqli_fetch_all_oo.phpt
===================================================================
--- trunk/ext/mysqli/tests/mysqli_fetch_all_oo.phpt 2007-03-12 22:51:02 UTC (rev 109)
+++ trunk/ext/mysqli/tests/mysqli_fetch_all_oo.phpt 2007-03-13 08:36:26 UTC (rev 110)
@@ -3,7 +3,6 @@
--SKIPIF--
<?php require_once('skipif.inc'); ?>
<?php require_once('skipifemb.inc'); ?>
-<?php die("skip: fetch_all() is missing in the OO interface, test is not checked");
?>
--FILE--
<?php
include "connect.inc";
@@ -430,4 +429,4 @@
Warning: mysqli_fetch_all(): Mode can be only MYSQLI_FETCH_NUM, MYSQLI_FETCH_ASSOC or
MYSQLI_FETCH_BOTH in %s on line %d
Warning: mysqli_fetch_array(): Couldn't fetch mysqli_result in %s on line %d
-done!
\ No newline at end of file
+done!
Modified: trunk/ext/mysqli/tests/mysqli_prepare.phpt
===================================================================
--- trunk/ext/mysqli/tests/mysqli_prepare.phpt 2007-03-12 22:51:02 UTC (rev 109)
+++ trunk/ext/mysqli/tests/mysqli_prepare.phpt 2007-03-13 08:36:26 UTC (rev 110)
@@ -3,7 +3,6 @@
--SKIPIF--
<?php require_once('skipif.inc'); ?>
<?php require_once('skipifemb.inc'); ?>
-<?php die("skip: PS support not complete"); ?>
--FILE--
<?php
include "connect.inc";
@@ -113,4 +112,4 @@
print "done!";
?>
--EXPECTF--
-done!
\ No newline at end of file
+done!
| Thread |
|---|
| • PHP mysqlnd svn commit: r110 - in trunk/ext/mysqli: mysqlnd tests | ahristov | 13 Mar |