summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2005-02-19 23:11:23 +0000
committerMarcus Boerger <helly@php.net>2005-02-19 23:11:23 +0000
commit474fcab6235237588af5ef4e5ce2e454e6ec4a5b (patch)
tree5cdfd389d3bbebbd7e2d76d1979c228f9d59aabf
parent1fee3962b09dcee3daf625e305d8fccff750159c (diff)
downloadphp-git-474fcab6235237588af5ef4e5ce2e454e6ec4a5b.tar.gz
- Add PDO_FETCH_GROUP to fetchAll()
-rwxr-xr-xext/pdo/pdo.c1
-rwxr-xr-xext/pdo/pdo_stmt.c64
-rwxr-xr-xext/pdo/php_pdo_driver.h3
3 files changed, 53 insertions, 15 deletions
diff --git a/ext/pdo/pdo.c b/ext/pdo/pdo.c
index 71ce757a67..f010a54fe5 100755
--- a/ext/pdo/pdo.c
+++ b/ext/pdo/pdo.c
@@ -237,6 +237,7 @@ PHP_MINIT_FUNCTION(pdo)
REGISTER_LONG_CONSTANT("PDO_FETCH_COLUMN",(long)PDO_FETCH_COLUMN, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PDO_FETCH_CLASS",(long)PDO_FETCH_CLASS, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PDO_FETCH_INTO", (long)PDO_FETCH_INTO, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("PDO_FETCH_GROUP",(long)PDO_FETCH_GROUP, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PDO_ATTR_AUTOCOMMIT", (long)PDO_ATTR_AUTOCOMMIT, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PDO_ATTR_PREFETCH", (long)PDO_ATTR_PREFETCH, CONST_CS|CONST_PERSISTENT);
diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c
index 8fb29c665e..8b263aba8c 100755
--- a/ext/pdo/pdo_stmt.c
+++ b/ext/pdo/pdo_stmt.c
@@ -527,7 +527,7 @@ static int do_fetch_common(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori,
/* perform a fetch. If do_bind is true, update any bound columns.
* If return_value is not null, store values into it according to HOW. */
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 TSRMLS_DC)
+ enum pdo_fetch_type how, enum pdo_fetch_orientation ori, long offset, zval *return_all TSRMLS_DC)
{
enum pdo_fetch_type really_how = how;
zend_class_entry * ce;
@@ -642,8 +642,27 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
/* shouldn't happen */
return 0;
}
+
+ if (return_all) {
+ zval val, *grp, **pgrp;
+ INIT_PZVAL(&val);
+ fetch_value(stmt, &val, 0 TSRMLS_CC);
+ convert_to_string(&val);
+ if (zend_symtable_find(Z_ARRVAL_P(return_all), Z_STRVAL(val), Z_STRLEN(val)+1, (void**)&pgrp) == FAILURE) {
+ MAKE_STD_ZVAL(grp);
+ array_init(grp);
+ add_assoc_zval(return_all, Z_STRVAL(val), grp);
+ } else {
+ grp = *pgrp;
+ }
+ zval_dtor(&val);
+ add_next_index_zval(grp, return_value);
+ i = 1;
+ } else {
+ i = 0;
+ }
- for (i = 0; i < stmt->column_count; i++) {
+ for (; i < stmt->column_count; i++) {
zval *val;
MAKE_STD_ZVAL(val);
fetch_value(stmt, val, i TSRMLS_CC);
@@ -692,7 +711,7 @@ static PHP_METHOD(PDOStatement, fetch)
}
PDO_STMT_CLEAR_ERR();
- if (!do_fetch(stmt, TRUE, return_value, how, ori, off TSRMLS_CC)) {
+ if (!do_fetch(stmt, TRUE, return_value, how, ori, off, 0 TSRMLS_CC)) {
PDO_HANDLE_STMT_ERR();
RETURN_FALSE;
}
@@ -749,7 +768,7 @@ static PHP_METHOD(PDOStatement, fetchObject)
}
PDO_STMT_CLEAR_ERR();
- if (!error && !do_fetch(stmt, TRUE, return_value, how, ori, off TSRMLS_CC)) {
+ if (!error && !do_fetch(stmt, TRUE, return_value, how, ori, off, 0 TSRMLS_CC)) {
error = 1;
PDO_HANDLE_STMT_ERR();
}
@@ -786,8 +805,8 @@ static PHP_METHOD(PDOStatement, fetchSingle)
static PHP_METHOD(PDOStatement, fetchAll)
{
pdo_stmt_t *stmt = (pdo_stmt_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
- long how = PDO_FETCH_USE_DEFAULT;
- zval *data;
+ long how = PDO_FETCH_USE_DEFAULT, flags;
+ zval *data, *return_all;
char *class_name;
int class_name_len;
zend_class_entry *old_ce;
@@ -828,25 +847,40 @@ static PHP_METHOD(PDOStatement, fetchAll)
}
}
+ flags = how & PDO_FETCH_FLAGS;
+ how = how & ~PDO_FETCH_FLAGS;
if (!error)
{
PDO_STMT_CLEAR_ERR();
MAKE_STD_ZVAL(data);
- if (!do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0 TSRMLS_CC)) {
+ if (flags & PDO_FETCH_GROUP) {
+ 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)) {
FREE_ZVAL(data);
PDO_HANDLE_STMT_ERR();
+ zval_dtor(return_value);
error = 1;
}
}
if (!error) {
- 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 TSRMLS_CC));
+ if ((flags & PDO_FETCH_GROUP)) {
+ do {
+ MAKE_STD_ZVAL(data);
+ } while (do_fetch(stmt, TRUE, data, how, 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));
+ }
FREE_ZVAL(data);
}
-
+
stmt->fetch.cls.ce = old_ce;
stmt->fetch.cls.ctor_args = old_ctor_args;
@@ -1537,7 +1571,7 @@ static void pdo_stmt_iter_move_forwards(zend_object_iterator *iter TSRMLS_DC)
MAKE_STD_ZVAL(I->fetch_ahead);
if (!do_fetch(I->stmt, TRUE, I->fetch_ahead, PDO_FETCH_USE_DEFAULT,
- PDO_FETCH_ORI_NEXT, 0 TSRMLS_CC)) {
+ PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC)) {
pdo_stmt_t *stmt = I->stmt; /* for PDO_HANDLE_STMT_ERR() */
PDO_HANDLE_STMT_ERR();
@@ -1573,7 +1607,7 @@ zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object TSRML
MAKE_STD_ZVAL(I->fetch_ahead);
if (!do_fetch(I->stmt, TRUE, I->fetch_ahead, PDO_FETCH_USE_DEFAULT,
- PDO_FETCH_ORI_NEXT, 0 TSRMLS_CC)) {
+ PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC)) {
PDO_HANDLE_STMT_ERR();
I->key = (ulong)-1;
FREE_ZVAL(I->fetch_ahead);
diff --git a/ext/pdo/php_pdo_driver.h b/ext/pdo/php_pdo_driver.h
index 51d3f80d72..02d30fdaef 100755
--- a/ext/pdo/php_pdo_driver.h
+++ b/ext/pdo/php_pdo_driver.h
@@ -81,6 +81,9 @@ enum pdo_fetch_type {
PDO_FETCH__MAX /* must be last */
};
+#define PDO_FETCH_FLAGS 0xFFFF0000 /* fetchAll() modes or'd to PDO_FETCH_XYZ */
+#define PDO_FETCH_GROUP 0x00010000 /* fetch into groups */
+
/* fetch orientation for scrollable cursors */
enum pdo_fetch_orientation {
PDO_FETCH_ORI_NEXT, /* default: fetch the next available row */