]> granicus.if.org Git - php/commitdiff
- Add PDO_FETCH_GROUP to fetchAll()
authorMarcus Boerger <helly@php.net>
Sat, 19 Feb 2005 23:11:23 +0000 (23:11 +0000)
committerMarcus Boerger <helly@php.net>
Sat, 19 Feb 2005 23:11:23 +0000 (23:11 +0000)
ext/pdo/pdo.c
ext/pdo/pdo_stmt.c
ext/pdo/php_pdo_driver.h

index 71ce757a67fce7da423fc03fc032fcc27d5d7d5d..f010a54fe59363c6c1b581feb74438064aeae18b 100755 (executable)
@@ -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);
index 8fb29c665ef15637fb9aa7b643dccb608f182b8d..8b263aba8c8f69f044cfe87d4f2b467868a9d269 100755 (executable)
@@ -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);
index 51d3f80d7214eceda239743bf1cffc53c507b8c8..02d30fdaeff31f9cfabec9e015cf705b69774cce 100755 (executable)
@@ -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 */