felipe Fri Oct 10 16:46:10 2008 UTC
Modified files:
/php-src/ext/pdo pdo_stmt.c
Log:
- Fixed bug #46139 (PDOStatement->setFetchMode() forgets FETCH_PROPS_LATE)
Initial patch by: chsc at peytz dot dk
MFB:
- Fixed bug #41971 (PDOStatement::fetch and PDOStatement::setFetchMode causes
unexpected behavior)
- Fixed bug #42917 (PDO::FETCH_KEY_PAIR doesn't work with setFetchMode)
http://cvs.php.net/viewvc.cgi/php-src/ext/pdo/pdo_stmt.c?r1=1.199&r2=1.200&diff_format=u
Index: php-src/ext/pdo/pdo_stmt.c
diff -u php-src/ext/pdo/pdo_stmt.c:1.199 php-src/ext/pdo/pdo_stmt.c:1.200
--- php-src/ext/pdo/pdo_stmt.c:1.199 Tue Sep 23 23:05:24 2008
+++ php-src/ext/pdo/pdo_stmt.c Fri Oct 10 16:46:10 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: pdo_stmt.c,v 1.199 2008/09/23 23:05:24 felipe Exp $ */
+/* $Id: pdo_stmt.c,v 1.200 2008/10/10 16:46:10 felipe Exp $ */
/* The PDO Statement Handle Class */
@@ -897,15 +897,16 @@
static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
enum pdo_fetch_type how, enum pdo_fetch_orientation ori, long offset,
zval *return_all TSRMLS_DC) /* {{{ */
{
- int flags = how & PDO_FETCH_FLAGS, idx, old_arg_count = 0;
+ int flags, idx, old_arg_count = 0;
zend_class_entry *ce = NULL, *old_ce = NULL;
zval grp_val, *grp, **pgrp, *retval, *old_ctor_args = NULL;
int colno;
- how = how & ~PDO_FETCH_FLAGS;
if (how == PDO_FETCH_USE_DEFAULT) {
how = stmt->default_fetch_type;
}
+ flags = how & PDO_FETCH_FLAGS;
+ how = how & ~PDO_FETCH_FLAGS;
if (!do_fetch_common(stmt, ori, offset, do_bind TSRMLS_CC)) {
return 0;
@@ -1489,7 +1490,7 @@
zval *arg2;
zend_class_entry *old_ce;
zval *old_ctor_args, *ctor_args = NULL;
- int error = 0, old_arg_count;
+ int error = 0, flags, old_arg_count;
PHP_STMT_GET_OBJ;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lzz",
&how, &arg2, &ctor_args)) {
@@ -1581,20 +1582,25 @@
}
}
+ flags = how & PDO_FETCH_FLAGS;
+
if ((how & ~PDO_FETCH_FLAGS) == PDO_FETCH_USE_DEFAULT) {
+ flags |= stmt->default_fetch_type & PDO_FETCH_FLAGS;
how |= stmt->default_fetch_type & ~PDO_FETCH_FLAGS;
}
if (!error) {
PDO_STMT_CLEAR_ERR();
MAKE_STD_ZVAL(data);
- if (how & PDO_FETCH_GROUP) {
+ if ( (how & PDO_FETCH_GROUP) || how == PDO_FETCH_KEY_PAIR ||
+ (how == PDO_FETCH_USE_DEFAULT &&
stmt->default_fetch_type == PDO_FETCH_KEY_PAIR)
+ ) {
array_init(return_value);
return_all = return_value;
} else {
return_all = 0;
}
- if (!do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0,
return_all TSRMLS_CC)) {
+ if (!do_fetch(stmt, TRUE, data, how | flags,
PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC)) {
FREE_ZVAL(data);
error = 2;
}
@@ -1603,13 +1609,15 @@
if ((how & PDO_FETCH_GROUP)) {
do {
MAKE_STD_ZVAL(data);
- } while (do_fetch(stmt, TRUE, data, how,
PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
+ } while (do_fetch(stmt, TRUE, data, how | flags,
PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
+ } else if (how == PDO_FETCH_KEY_PAIR || (how ==
PDO_FETCH_USE_DEFAULT && stmt->default_fetch_type == PDO_FETCH_KEY_PAIR)) {
+ while (do_fetch(stmt, TRUE, data, how | flags,
PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
} else {
array_init(return_value);
do {
add_next_index_zval(return_value, data);
MAKE_STD_ZVAL(data);
- } while (do_fetch(stmt, TRUE, data, how,
PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC));
+ } while (do_fetch(stmt, TRUE, data, how | flags,
PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC));
}
FREE_ZVAL(data);
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php