]> granicus.if.org Git - php/commitdiff
- Add fetch flag PDO_FETCH_CLASSTYPE
authorMarcus Boerger <helly@php.net>
Sun, 20 Feb 2005 16:12:57 +0000 (16:12 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 20 Feb 2005 16:12:57 +0000 (16:12 +0000)
ext/pdo/pdo.c
ext/pdo/pdo_stmt.c
ext/pdo/php_pdo_driver.h

index 0788ff2c6ffea201fcf80cad461d26bd3e242939..117729636d7f6843ccabfc2dbddfacec0fe348d4 100755 (executable)
@@ -239,6 +239,7 @@ PHP_MINIT_FUNCTION(pdo)
        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_FETCH_UNIQUE",(long)PDO_FETCH_UNIQUE, CONST_CS|CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PDO_FETCH_CLASSTYPE",(long)PDO_FETCH_CLASSTYPE, 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 aaa3a71f8929a2df123cafd33e82d6aa7c95400e..77d93717ac9491edc55dc09c09e2679554ac995b 100755 (executable)
@@ -570,14 +570,14 @@ static int do_fetch_class_prepare(pdo_stmt_t *stmt TSRMLS_DC)
        }
 }
 
-static int do_fetch_class_finish(pdo_stmt_t *stmt TSRMLS_DC)
+static int do_fetch_class_finish(pdo_stmt_t *stmt, int free_ctor_agrs TSRMLS_DC)
 {
        /* fci.size is used to check if it is valid */
        if (stmt->fetch.cls.fci.size && stmt->fetch.cls.fci.params) {
                efree(stmt->fetch.cls.fci.params);
                stmt->fetch.cls.fci.size = 0;
        }
-       if (stmt->fetch.cls.ctor_args) {
+       if (stmt->fetch.cls.ctor_args && free_ctor_agrs) {
                FREE_ZVAL(stmt->fetch.cls.ctor_args);
                stmt->fetch.cls.ctor_args = NULL;
        }
@@ -590,7 +590,7 @@ 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;
-       zend_class_entry * ce;
+       zend_class_entry * ce, * old_ce;
 
        how = how & ~PDO_FETCH_FLAGS;
        if (how == PDO_FETCH_USE_DEFAULT) {
@@ -607,7 +607,7 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
        }
 
        if (return_value) {
-               int i;
+               int i = 0;
 
                if (how == PDO_FETCH_LAZY) {
                        get_lazy_object(stmt, return_value TSRMLS_CC);
@@ -633,6 +633,27 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
                                break;
 
                        case PDO_FETCH_CLASS:
+                               if (flags & PDO_FETCH_CLASSTYPE) {
+                                       zval val;
+                                       zend_class_entry **cep;
+
+                                       do_fetch_class_finish(stmt, 0 TSRMLS_CC);
+                                       old_ce = stmt->fetch.cls.ce;
+
+                                       INIT_PZVAL(&val);
+                                       fetch_value(stmt, &val, i++ TSRMLS_CC);
+                                       if (Z_TYPE(val) != IS_NULL) {
+                                               convert_to_string(&val);
+                                               if (zend_lookup_class(Z_STRVAL(val), Z_STRLEN(val), &cep TSRMLS_CC) == FAILURE) {
+                                                       stmt->fetch.cls.ce = ZEND_STANDARD_CLASS_DEF_PTR;
+                                               } else {
+                                                       stmt->fetch.cls.ce = *cep;
+                                               }
+                                       }
+
+                                       do_fetch_class_prepare(stmt TSRMLS_CC);
+                                       zval_dtor(&val);
+                               }
                                ce = stmt->fetch.cls.ce;
                                object_init_ex(return_value, ce);
                                if (!stmt->fetch.cls.fci.size) {
@@ -662,7 +683,7 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
                if (return_all) {
                        zval val, *grp, **pgrp;
                        INIT_PZVAL(&val);
-                       fetch_value(stmt, &val, 0 TSRMLS_CC);
+                       fetch_value(stmt, &val, i TSRMLS_CC);
                        convert_to_string(&val);
                        if ((flags & PDO_FETCH_UNIQUE) == PDO_FETCH_UNIQUE) {
                                add_assoc_zval(return_all, Z_STRVAL(val), return_value);
@@ -677,9 +698,7 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
                                add_next_index_zval(grp, return_value);
                        }
                        zval_dtor(&val);
-                       i = 1;
-               } else {
-                       i = 0;
+                       i++;
                }
 
                for (; i < stmt->column_count; i++) {
@@ -734,6 +753,10 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
                                                }
                                        }
                                }
+                               if (flags & PDO_FETCH_CLASSTYPE) {
+                                       do_fetch_class_finish(stmt, 0 TSRMLS_CC);
+                                       stmt->fetch.cls.ce = old_ce;
+                               }
                                break;
                        
                        default:
@@ -932,7 +955,7 @@ static PHP_METHOD(PDOStatement, fetchAll)
        stmt->fetch.cls.ce = old_ce;
        stmt->fetch.cls.ctor_args = old_ctor_args;
        
-       do_fetch_class_finish(stmt TSRMLS_CC);
+       do_fetch_class_finish(stmt, 1 TSRMLS_CC);
 
        if (error) {
                RETURN_FALSE;
@@ -1148,7 +1171,7 @@ int pdo_stmt_setup_fetch_mode(INTERNAL_FUNCTION_PARAMETERS, pdo_stmt_t *stmt, in
        
        switch (stmt->default_fetch_type) {
                case PDO_FETCH_CLASS:
-                       do_fetch_class_finish(stmt TSRMLS_CC);
+                       do_fetch_class_finish(stmt, 1 TSRMLS_CC);
                        break;
 
                case PDO_FETCH_INTO:
@@ -1523,7 +1546,7 @@ static void free_statement(pdo_stmt_t *stmt TSRMLS_DC)
                FREE_HASHTABLE(stmt->bound_columns);
        }
        
-       do_fetch_class_finish(stmt TSRMLS_CC);
+       do_fetch_class_finish(stmt, 1 TSRMLS_CC);
 
        zend_objects_store_del_ref(&stmt->database_object_handle TSRMLS_CC);
        efree(stmt);
index c46bff5f9034f706762c7cc25e8af45b557738b9..9e8f0cb9b1ce868131c536ebecdd54e98a30da1c 100755 (executable)
@@ -84,6 +84,7 @@ enum pdo_fetch_type {
 #define PDO_FETCH_FLAGS     0xFFFF0000  /* fetchAll() modes or'd to PDO_FETCH_XYZ */
 #define PDO_FETCH_GROUP     0x00010000  /* fetch into groups */
 #define PDO_FETCH_UNIQUE    0x00030000  /* fetch into groups assuming first col is unique */
+#define PDO_FETCH_CLASSTYPE 0x00040000  /* fetch class gets its class name from 1st column */
 
 /* fetch orientation for scrollable cursors */
 enum pdo_fetch_orientation {