felipe Thu, 18 Nov 2010 01:24:00 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=305476
Log: - Fixed bug #53335 (pdo_firebird did not implement rowCount()) patch by: preeves at ibphoenix dot com Bug: http://bugs.php.net/53335 (Open) pdo_firebird did not implement rowCount() Changed paths: U php/php-src/branches/PHP_5_3/NEWS U php/php-src/branches/PHP_5_3/ext/pdo_firebird/firebird_statement.c A php/php-src/branches/PHP_5_3/ext/pdo_firebird/tests/rowCount.phpt U php/php-src/trunk/ext/pdo_firebird/firebird_statement.c A php/php-src/trunk/ext/pdo_firebird/tests/rowCount.phpt Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2010-11-17 23:57:47 UTC (rev 305475) +++ php/php-src/branches/PHP_5_3/NEWS 2010-11-18 01:24:00 UTC (rev 305476) @@ -64,6 +64,8 @@ - Fixed the filter extension accepting IPv4 octets with a leading 0 as that belongs to the unsupported "dotted octal" representation. (Gustavo) +- Fixed bug #53335 (pdo_firebird did not implement rowCount()). + (preeves at ibphoenix dot com) - Fixed bug #53323 (pdo_firebird getAttribute() crash). (preeves at ibphoenix dot com) - Fixed Bug #53319 (strip_tags() may strip '<br />' incorrectly). (Felipe) Modified: php/php-src/branches/PHP_5_3/ext/pdo_firebird/firebird_statement.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/pdo_firebird/firebird_statement.c 2010-11-17 23:57:47 UTC (rev 305475) +++ php/php-src/branches/PHP_5_3/ext/pdo_firebird/firebird_statement.c 2010-11-18 01:24:00 UTC (rev 305476) @@ -90,6 +90,9 @@ { pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data; pdo_firebird_db_handle *H = S->H; + unsigned long affected_rows = 0; + static char info_count[] = {isc_info_sql_records}; + char result[64]; do { /* named or open cursors should be closed first */ @@ -103,6 +106,35 @@ break; } + /* Determine how many rows have changed. In this case we are + * only interested in rows changed, not rows retrieved. That + * should be handled by the client when fetching. */ + stmt->row_count = affected_rows; + + switch (S->statement_type) { + case isc_info_sql_stmt_insert: + case isc_info_sql_stmt_update: + case isc_info_sql_stmt_delete: + case isc_info_sql_stmt_exec_procedure: + if (isc_dsql_sql_info(H->isc_status, &S->stmt, sizeof ( info_count), + info_count, sizeof(result), result)) { + break; + } + if (result[0] == isc_info_sql_records) { + unsigned i = 3, result_size = isc_vax_integer(&result[1], 2); + while (result[i] != isc_info_end && i < result_size) { + short len = (short) isc_vax_integer(&result[i + 1], 2); + if (result[i] != isc_info_req_select_count) { + affected_rows += isc_vax_integer(&result[i + 3], len); + } + i += len + 3; + } + stmt->row_count = affected_rows; + } + default: + ; + } + /* commit? */ if (stmt->dbh->auto_commit && isc_commit_retaining(H->isc_status, &H->tr)) { break; @@ -142,6 +174,7 @@ if (S->statement_type == isc_info_sql_stmt_exec_procedure) { S->exhausted = 1; } + stmt->row_count++; return 1; } return 0; Added: php/php-src/branches/PHP_5_3/ext/pdo_firebird/tests/rowCount.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/pdo_firebird/tests/rowCount.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/pdo_firebird/tests/rowCount.phpt 2010-11-18 01:24:00 UTC (rev 305476) @@ -0,0 +1,48 @@ +--TEST-- +PDO_Firebird: rowCount +--SKIPIF-- +<?php extension_loaded("pdo_firebird") or die("skip"); ?> +--FILE-- +<?php /* $Id$ */ + +require("testdb.inc"); + +$dbh = new PDO("firebird:dbname=$test_base",$user,$password) or die; + +...@$dbh->exec('DROP TABLE testz'); +$dbh->exec('CREATE TABLE testz (A VARCHAR(10))'); +$dbh->exec("INSERT INTO testz VALUES ('A')"); +$dbh->exec("INSERT INTO testz VALUES ('A')"); +$dbh->exec("INSERT INTO testz VALUES ('B')"); +$dbh->commit(); + +$query = "SELECT * FROM testz WHERE A = ?"; + +$stmt = $dbh->prepare($query); +$stmt->execute(array('A')); +$rows = $stmt->fetch(); +$rows = $stmt->fetch(); +var_dump($stmt->fetch()); +var_dump($stmt->rowCount()); + +$stmt = $dbh->prepare('UPDATE testZ SET A="A" WHERE A != ?'); +$stmt->execute(array('A')); +var_dump($stmt->rowCount()); +$dbh->commit(); + +$stmt = $dbh->prepare('DELETE FROM testz'); +$stmt->execute(); +var_dump($stmt->rowCount()); + +$dbh->commit(); + +$dbh->exec('DROP TABLE testz'); + +unset($dbh); + +?> +--EXPECT-- +bool(false) +int(2) +int(1) +int(3) Property changes on: php/php-src/branches/PHP_5_3/ext/pdo_firebird/tests/rowCount.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/trunk/ext/pdo_firebird/firebird_statement.c =================================================================== --- php/php-src/trunk/ext/pdo_firebird/firebird_statement.c 2010-11-17 23:57:47 UTC (rev 305475) +++ php/php-src/trunk/ext/pdo_firebird/firebird_statement.c 2010-11-18 01:24:00 UTC (rev 305476) @@ -90,6 +90,9 @@ { pdo_firebird_stmt *S = (pdo_firebird_stmt*)stmt->driver_data; pdo_firebird_db_handle *H = S->H; + unsigned long affected_rows = 0; + static char info_count[] = {isc_info_sql_records}; + char result[64]; do { /* named or open cursors should be closed first */ @@ -103,6 +106,35 @@ break; } + /* Determine how many rows have changed. In this case we are + * only interested in rows changed, not rows retrieved. That + * should be handled by the client when fetching. */ + stmt->row_count = affected_rows; + + switch (S->statement_type) { + case isc_info_sql_stmt_insert: + case isc_info_sql_stmt_update: + case isc_info_sql_stmt_delete: + case isc_info_sql_stmt_exec_procedure: + if (isc_dsql_sql_info(H->isc_status, &S->stmt, sizeof ( info_count), + info_count, sizeof(result), result)) { + break; + } + if (result[0] == isc_info_sql_records) { + unsigned i = 3, result_size = isc_vax_integer(&result[1], 2); + while (result[i] != isc_info_end && i < result_size) { + short len = (short) isc_vax_integer(&result[i + 1], 2); + if (result[i] != isc_info_req_select_count) { + affected_rows += isc_vax_integer(&result[i + 3], len); + } + i += len + 3; + } + stmt->row_count = affected_rows; + } + default: + ; + } + /* commit? */ if (stmt->dbh->auto_commit && isc_commit_retaining(H->isc_status, &H->tr)) { break; @@ -142,6 +174,7 @@ if (S->statement_type == isc_info_sql_stmt_exec_procedure) { S->exhausted = 1; } + stmt->row_count++; return 1; } return 0; Added: php/php-src/trunk/ext/pdo_firebird/tests/rowCount.phpt =================================================================== --- php/php-src/trunk/ext/pdo_firebird/tests/rowCount.phpt (rev 0) +++ php/php-src/trunk/ext/pdo_firebird/tests/rowCount.phpt 2010-11-18 01:24:00 UTC (rev 305476) @@ -0,0 +1,48 @@ +--TEST-- +PDO_Firebird: rowCount +--SKIPIF-- +<?php extension_loaded("pdo_firebird") or die("skip"); ?> +--FILE-- +<?php /* $Id$ */ + +require("testdb.inc"); + +$dbh = new PDO("firebird:dbname=$test_base",$user,$password) or die; + +...@$dbh->exec('DROP TABLE testz'); +$dbh->exec('CREATE TABLE testz (A VARCHAR(10))'); +$dbh->exec("INSERT INTO testz VALUES ('A')"); +$dbh->exec("INSERT INTO testz VALUES ('A')"); +$dbh->exec("INSERT INTO testz VALUES ('B')"); +$dbh->commit(); + +$query = "SELECT * FROM testz WHERE A = ?"; + +$stmt = $dbh->prepare($query); +$stmt->execute(array('A')); +$rows = $stmt->fetch(); +$rows = $stmt->fetch(); +var_dump($stmt->fetch()); +var_dump($stmt->rowCount()); + +$stmt = $dbh->prepare('UPDATE testZ SET A="A" WHERE A != ?'); +$stmt->execute(array('A')); +var_dump($stmt->rowCount()); +$dbh->commit(); + +$stmt = $dbh->prepare('DELETE FROM testz'); +$stmt->execute(); +var_dump($stmt->rowCount()); + +$dbh->commit(); + +$dbh->exec('DROP TABLE testz'); + +unset($dbh); + +?> +--EXPECT-- +bool(false) +int(2) +int(1) +int(3) Property changes on: php/php-src/trunk/ext/pdo_firebird/tests/rowCount.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php