helly           Thu May 11 22:43:44 2006 UTC

  Modified files:              (Branch: PHP_5_2)
    /php-src/ext/pdo    pdo.c pdo_dbh.c pdo_stmt.c php_pdo.h 
                        php_pdo_driver.h php_pdo_int.h 
  Log:
  - MFH
    . Fix iterator based access
    . Add new attribute ATTR_DEFAULT_FETCH_MODE: $bdh->setAttribute()
    . Add new fetch mode: FETCH_PROPS_LATE, this fills object member
      variables after calling the constructor (fixes #36428).
  
  
http://cvs.php.net/viewcvs.cgi/php-src/ext/pdo/pdo.c?r1=1.57.2.17.2.1&r2=1.57.2.17.2.2&diff_format=u
Index: php-src/ext/pdo/pdo.c
diff -u php-src/ext/pdo/pdo.c:1.57.2.17.2.1 php-src/ext/pdo/pdo.c:1.57.2.17.2.2
--- php-src/ext/pdo/pdo.c:1.57.2.17.2.1 Tue May  9 23:54:48 2006
+++ php-src/ext/pdo/pdo.c       Thu May 11 22:43:44 2006
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: pdo.c,v 1.57.2.17.2.1 2006/05/09 23:54:48 helly Exp $ */
+/* $Id: pdo.c,v 1.57.2.17.2.2 2006/05/11 22:43:44 helly Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -53,11 +53,23 @@
 /* for exceptional circumstances */
 zend_class_entry *pdo_exception_ce;
 
-PDO_API zend_class_entry *php_pdo_get_exception(void)
+PDO_API zend_class_entry *php_pdo_get_dbh_ce()
+{
+       return pdo_dbh_ce;
+}
+
+PDO_API zend_class_entry *php_pdo_get_exception()
 {
        return pdo_exception_ce;
 }
 
+PDO_API char *php_pdo_str_tolower_dup(const char *src, int len)
+{
+       char *dest = emalloc(len + 1);
+       zend_str_tolower_copy(dest, src, len);
+       return dest;
+}
+
 PDO_API zend_class_entry *php_pdo_get_exception_base(int root TSRMLS_DC)
 {
 #if can_handle_soft_dependency_on_SPL && defined(HAVE_SPL) && 
((PHP_MAJOR_VERSION > 5) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 1))
@@ -74,7 +86,7 @@
                }
        }
 #endif
-#if (PHP_MAJOR_VERSION <= 5) && (PHP_MINOR_VERSION < 2)
+#if (PHP_MAJOR_VERSION == 5) && (PHP_MINOR_VERSION < 2)
        return zend_exception_get_default();
 #else
        return zend_exception_get_default(TSRMLS_C);
@@ -83,7 +95,7 @@
 
 zend_class_entry *pdo_dbh_ce, *pdo_dbstmt_ce, *pdo_row_ce;
 
-/* proto array pdo_drivers()
+/* {{{ proto array pdo_drivers()
  Return array of available PDO drivers */
 PHP_FUNCTION(pdo_drivers)
 {
@@ -133,7 +145,7 @@
        PHP_RINIT(pdo),
        PHP_RSHUTDOWN(pdo),
        PHP_MINFO(pdo),
-       "1.0.3",
+       "1.0.4dev",
        STANDARD_MODULE_PROPERTIES
 };
 /* }}} */
@@ -303,7 +315,7 @@
 PHP_MINIT_FUNCTION(pdo)
 {
        zend_class_entry ce;
-       
+
        spl_ce_RuntimeException = NULL;
 
        ZEND_INIT_MODULE_GLOBALS(pdo, php_pdo_init_globals, NULL);
http://cvs.php.net/viewcvs.cgi/php-src/ext/pdo/pdo_dbh.c?r1=1.82.2.31&r2=1.82.2.31.2.1&diff_format=u
Index: php-src/ext/pdo/pdo_dbh.c
diff -u php-src/ext/pdo/pdo_dbh.c:1.82.2.31 
php-src/ext/pdo/pdo_dbh.c:1.82.2.31.2.1
--- php-src/ext/pdo/pdo_dbh.c:1.82.2.31 Wed May  3 21:58:38 2006
+++ php-src/ext/pdo/pdo_dbh.c   Thu May 11 22:43:44 2006
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: pdo_dbh.c,v 1.82.2.31 2006/05/03 21:58:38 pollita Exp $ */
+/* $Id: pdo_dbh.c,v 1.82.2.31.2.1 2006/05/11 22:43:44 helly Exp $ */
 
 /* The PDO Database Handle Class */
 
@@ -36,12 +36,13 @@
 #include "zend_object_handlers.h"
 #include "zend_hash.h"
 
-void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char 
*sqlstate, const char *supp TSRMLS_DC)
+static int pdo_dbh_attribute_set(pdo_dbh_t *dbh, long attr, zval *value 
TSRMLS_DC);
+
+void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char 
*sqlstate, const char *supp TSRMLS_DC) /* {{{ */
 {
        pdo_error_type *pdo_err = &dbh->error_code;
        char *message = NULL;
        const char *msg;
-       
 
        if (dbh->error_mode == PDO_ERRMODE_SILENT) {
 #if 0
@@ -98,8 +99,9 @@
                efree(message);
        }
 }
+/* }}} */
 
-void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt TSRMLS_DC)
+void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
 {
        pdo_error_type *pdo_err = &dbh->error_code;
        const char *msg = "<<Unknown>>";
@@ -178,8 +180,9 @@
                efree(supp);
        }
 }
+/* }}} */
 
-static char *dsn_from_uri(char *uri, char *buf, size_t buflen TSRMLS_DC)
+static char *dsn_from_uri(char *uri, char *buf, size_t buflen TSRMLS_DC) /* 
{{{ */
 {
        php_stream *stream;
        char *dsn = NULL;
@@ -191,6 +194,7 @@
        }
        return dsn;
 }
+/* }}} */
 
 /* {{{ proto void PDO::__construct(string dsn, string username, string passwd 
[, array options])
    */
@@ -350,6 +354,7 @@
        dbh->data_source = (const char*)pestrdup(colon + 1, is_persistent);
        dbh->username = username ? pestrdup(username, is_persistent) : NULL;
        dbh->password = password ? pestrdup(password, is_persistent) : NULL;
+       dbh->default_fetch_type = PDO_FETCH_BOTH;
 
        dbh->auto_commit = pdo_attr_lval(options, PDO_ATTR_AUTOCOMMIT, 1 
TSRMLS_CC);
 
@@ -383,6 +388,21 @@
                }
 
                dbh->driver = driver;
+
+               if (options) {
+                       zval **attr_value;
+                       char *str_key;
+                       long long_key;
+                       
+                       zend_hash_internal_pointer_reset(Z_ARRVAL_P(options));
+                       while (SUCCESS == 
zend_hash_get_current_data(Z_ARRVAL_P(options), (void**)&attr_value) 
+                                 && HASH_KEY_IS_LONG == 
zend_hash_get_current_key(Z_ARRVAL_P(options), &str_key, &long_key, 0)) {
+                               
+                               pdo_dbh_attribute_set(dbh, long_key, 
*attr_value TSRMLS_CC);
+                               zend_hash_move_forward(Z_ARRVAL_P(options));
+                       }
+               }
+
                return; 
        }
 
@@ -497,7 +517,7 @@
                        || zend_lookup_class(Z_STRVAL_PP(item), 
Z_STRLEN_PP(item), &pce TSRMLS_CC) == FAILURE
                ) {
                        pdo_raise_impl_error(dbh, NULL, "HY000", 
-                               "PDO::ATTR_STATEMENT_CLASS requires format 
array(classname, ctor_args); "
+                               "PDO::ATTR_STATEMENT_CLASS requires format 
array(classname, array(ctor_args)); "
                                "the classname must be a string specifying an 
existing class"
                                TSRMLS_CC);
                        PDO_HANDLE_DBH_ERR();
@@ -546,7 +566,7 @@
        /* unconditionally keep this for later reference */
        stmt->query_string = estrndup(statement, statement_len);
        stmt->query_stringlen = statement_len;
-       stmt->default_fetch_type = PDO_FETCH_BOTH;
+       stmt->default_fetch_type = dbh->default_fetch_type;
        stmt->dbh = dbh;
        /* give it a reference to me */
        zend_objects_store_add_ref(getThis() TSRMLS_CC);
@@ -644,20 +664,8 @@
 }
 /* }}} */
 
-/* {{{ proto bool PDO::setAttribute(long attribute, mixed value)
-   Set an attribute */
-static PHP_METHOD(PDO, setAttribute)
+static int pdo_dbh_attribute_set(pdo_dbh_t *dbh, long attr, zval *value 
TSRMLS_DC) /* {{{ */
 {
-       pdo_dbh_t *dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
-       long attr;
-       zval *value = NULL;
-
-       if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz!", 
&attr, &value)) {
-               RETURN_FALSE;
-       }
-
-       PDO_CONSTRUCT_CHECK;
-
        switch (attr) {
                case PDO_ATTR_ERRMODE:
                        convert_to_long(value);
@@ -666,13 +674,13 @@
                                case PDO_ERRMODE_WARNING:
                                case PDO_ERRMODE_EXCEPTION:
                                        dbh->error_mode = Z_LVAL_P(value);
-                                       RETURN_TRUE;
+                                       return SUCCESS;
                                default:
                                        pdo_raise_impl_error(dbh, NULL, 
"HY000", "invalid error mode" TSRMLS_CC);
                                        PDO_HANDLE_DBH_ERR();
-                                       RETURN_FALSE;
+                                       return FAILURE;
                        }
-                       RETURN_FALSE;
+                       return FAILURE;
 
                case PDO_ATTR_CASE:
                        convert_to_long(value);
@@ -681,23 +689,32 @@
                                case PDO_CASE_UPPER:
                                case PDO_CASE_LOWER:
                                        dbh->desired_case = Z_LVAL_P(value);
-                                       RETURN_TRUE;
+                                       return SUCCESS;
                                default:
                                        pdo_raise_impl_error(dbh, NULL, 
"HY000", "invalid case folding mode" TSRMLS_CC);
                                        PDO_HANDLE_DBH_ERR();
-                                       RETURN_FALSE;
+                                       return FAILURE;
                        }
-                       RETURN_FALSE;
+                       return FAILURE;
 
                case PDO_ATTR_ORACLE_NULLS:
                        convert_to_long(value);
                        dbh->oracle_nulls = Z_LVAL_P(value);
-                       RETURN_TRUE;
+                       return SUCCESS;
+
+               case PDO_ATTR_DEFAULT_FETCH_MODE:
+                       convert_to_long(value);
+                       if (Z_LVAL_P(value) == PDO_FETCH_USE_DEFAULT) {
+                               pdo_raise_impl_error(dbh, NULL, "HY000", 
"invalid fetch mode type" TSRMLS_CC);
+                               return FAILURE;
+                       }
+                       dbh->default_fetch_type = Z_LVAL_P(value);
+                       return SUCCESS;
 
                case PDO_ATTR_STRINGIFY_FETCHES:
                        convert_to_long(value);
                        dbh->stringify = Z_LVAL_P(value) ? 1 : 0;
-                       RETURN_TRUE;
+                       return SUCCESS;
                        
                case PDO_ATTR_STATEMENT_CLASS: {
                        /* array(string classname, array(mixed ctor_args)) */
@@ -709,7 +726,7 @@
                                        "PDO::ATTR_STATEMENT_CLASS cannot be 
used with persistent PDO instances"
                                        TSRMLS_CC);
                                PDO_HANDLE_DBH_ERR();
-                               RETURN_FALSE;
+                               return FAILURE;
                        }
                        if (Z_TYPE_P(value) != IS_ARRAY
                                || zend_hash_index_find(Z_ARRVAL_P(value), 0, 
(void**)&item) == FAILURE
@@ -721,19 +738,19 @@
                                        "the classname must be a string 
specifying an existing class"
                                        TSRMLS_CC);
                                PDO_HANDLE_DBH_ERR();
-                               RETURN_FALSE;
+                               return FAILURE;
                        }
                        if (!instanceof_function(*pce, pdo_dbstmt_ce 
TSRMLS_CC)) {
                                pdo_raise_impl_error(dbh, NULL, "HY000", 
                                        "user-supplied statement class must be 
derived from PDOStatement" TSRMLS_CC);
                                PDO_HANDLE_DBH_ERR();
-                               RETURN_FALSE;
+                               return FAILURE;
                        }
                        if ((*pce)->constructor && 
!((*pce)->constructor->common.fn_flags & 
(ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED))) {
                                pdo_raise_impl_error(dbh, NULL, "HY000", 
                                        "user-supplied statement class cannot 
have a public constructor" TSRMLS_CC);
                                PDO_HANDLE_DBH_ERR();
-                               RETURN_FALSE;
+                               return FAILURE;
                        }
                        dbh->def_stmt_ce = *pce;
                        if (dbh->def_stmt_ctor_args) {
@@ -747,12 +764,12 @@
                                                "ctor_args must be an array"
                                        TSRMLS_CC);
                                        PDO_HANDLE_DBH_ERR();
-                                       RETURN_FALSE;
+                                       return FAILURE;
                                }
                                (*item)->refcount++;
                                dbh->def_stmt_ctor_args = *item;
                        }
-                       RETURN_TRUE;
+                       return SUCCESS;
                }
                        
                default:
@@ -765,7 +782,7 @@
 
        PDO_DBH_CLEAR_ERR();
        if (dbh->methods->set_attribute(dbh, attr, value TSRMLS_CC)) {
-               RETURN_TRUE;
+               return SUCCESS;
        }
 
 fail:
@@ -776,7 +793,28 @@
        } else {
                PDO_HANDLE_DBH_ERR();
        }
-       RETURN_FALSE;
+       return FAILURE;
+}
+/* }}} */
+ 
+/* {{{ proto bool PDO::setAttribute(long attribute, mixed value)
+   Set an attribute */
+static PHP_METHOD(PDO, setAttribute)
+{
+       pdo_dbh_t *dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
+       long attr;
+       zval *value = NULL;
+
+       if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz!", 
&attr, &value)) {
+               RETURN_FALSE;
+       }
+
+       PDO_CONSTRUCT_CHECK;
+
+       if (pdo_dbh_attribute_set(dbh, attr, value TSRMLS_CC)) {
+               RETURN_TRUE;
+       }
+       RETURN_FALSE;
 }
 /* }}} */
 
@@ -819,6 +857,9 @@
                                add_next_index_zval(return_value, 
dbh->def_stmt_ctor_args);
                        }
                        return;
+               case PDO_ATTR_DEFAULT_FETCH_MODE:
+                       RETURN_LONG(dbh->default_fetch_type);
+
        }
        
        if (!dbh->methods->get_attribute) {
@@ -968,7 +1009,8 @@
        /* unconditionally keep this for later reference */
        stmt->query_string = estrndup(statement, statement_len);
        stmt->query_stringlen = statement_len;
-       stmt->default_fetch_type = PDO_FETCH_BOTH;
+
+       stmt->default_fetch_type = dbh->default_fetch_type;
        stmt->active_query_string = stmt->query_string;
        stmt->active_query_stringlen = statement_len;
        stmt->dbh = dbh;
@@ -980,6 +1022,8 @@
 
        if (dbh->methods->preparer(dbh, statement, statement_len, stmt, NULL 
TSRMLS_CC)) {
                if (ZEND_NUM_ARGS() == 1 || SUCCESS == 
pdo_stmt_setup_fetch_mode(INTERNAL_FUNCTION_PARAM_PASSTHRU, stmt, 1)) {
+                       PDO_STMT_CLEAR_ERR();
+
                        /* now execute the statement */
                        PDO_STMT_CLEAR_ERR();
                        if (stmt->methods->executer(stmt TSRMLS_CC)) {
@@ -1005,6 +1049,11 @@
                zval_dtor(return_value);
        }
 
+       PDO_HANDLE_STMT_ERR();
+               
+       /* kill the object handle for the stmt here */
+       zval_dtor(return_value);
+
        RETURN_FALSE;
 }
 /* }}} */
@@ -1075,8 +1124,8 @@
 
 zend_function_entry pdo_dbh_functions[] = {
        ZEND_MALIAS(PDO, __construct, dbh_constructor,  NULL,                   
ZEND_ACC_PUBLIC)
-       PHP_ME(PDO, prepare,            NULL,                                   
ZEND_ACC_PUBLIC)
-       PHP_ME(PDO, beginTransaction,NULL,                                      
ZEND_ACC_PUBLIC)
+       PHP_ME(PDO, prepare,                            NULL,                   
ZEND_ACC_PUBLIC)
+       PHP_ME(PDO, beginTransaction,           NULL,                   
ZEND_ACC_PUBLIC)
        PHP_ME(PDO, commit,                     NULL,                           
        ZEND_ACC_PUBLIC)
        PHP_ME(PDO, rollBack,           NULL,                                   
ZEND_ACC_PUBLIC)
        PHP_ME(PDO, setAttribute,       NULL,                                   
ZEND_ACC_PUBLIC)
@@ -1204,32 +1253,6 @@
 
 static zend_object_handlers pdo_dbh_object_handlers;
 
-PDO_API void php_pdo_declare_stringl_constant(const char *const_name,
-               size_t name_len, const char *value, size_t value_len TSRMLS_DC)
-{
-#if PHP_MAJOR_VERSION > 5 || PHP_MINOR_VERSION >= 1
-       zend_declare_class_constant_stringl(pdo_dbh_ce, (char*)const_name, 
name_len, (char*)value, value_len TSRMLS_CC);
-#else
-       zval *constant = malloc(sizeof(*constant));
-       ZVAL_STRINGL(constant, zend_strndup(value, value_len), value_len, 0);
-       INIT_PZVAL(constant);
-       zend_hash_update(&pdo_dbh_ce->constants_table, (char*)const_name, 
name_len+1, &constant, sizeof(zval*), NULL);
-#endif
-}
-
-PDO_API void php_pdo_declare_long_constant(const char *const_name,
-               size_t name_len, long value TSRMLS_DC)
-{
-#if PHP_MAJOR_VERSION > 5 || PHP_MINOR_VERSION >= 1
-       zend_declare_class_constant_long(pdo_dbh_ce, (char*)const_name, 
name_len, value TSRMLS_CC);
-#else
-       zval *constant = malloc(sizeof(*constant));
-       ZVAL_LONG(constant, value);
-       INIT_PZVAL(constant);
-       zend_hash_update(&pdo_dbh_ce->constants_table, (char*)const_name, 
name_len+1, &constant, sizeof(zval*), NULL);
-#endif
-}
-
 void pdo_dbh_init(TSRMLS_D)
 {
        zend_class_entry ce;
@@ -1274,6 +1297,7 @@
 #if PHP_MAJOR_VERSION > 5 || PHP_MINOR_VERSION >= 1
        
REGISTER_PDO_CLASS_CONST_LONG("FETCH_SERIALIZE",(long)PDO_FETCH_SERIALIZE);
 #endif
+       
REGISTER_PDO_CLASS_CONST_LONG("FETCH_PROPS_LATE",(long)PDO_FETCH_PROPS_LATE);
        REGISTER_PDO_CLASS_CONST_LONG("FETCH_NAMED",(long)PDO_FETCH_NAMED);
 
        REGISTER_PDO_CLASS_CONST_LONG("ATTR_AUTOCOMMIT",        
(long)PDO_ATTR_AUTOCOMMIT);
@@ -1296,6 +1320,7 @@
        
REGISTER_PDO_CLASS_CONST_LONG("ATTR_STRINGIFY_FETCHES",(long)PDO_ATTR_STRINGIFY_FETCHES);
        
REGISTER_PDO_CLASS_CONST_LONG("ATTR_MAX_COLUMN_LEN",(long)PDO_ATTR_MAX_COLUMN_LEN);
        
REGISTER_PDO_CLASS_CONST_LONG("ATTR_EMULATE_PREPARES",(long)PDO_ATTR_EMULATE_PREPARES);
+       
REGISTER_PDO_CLASS_CONST_LONG("ATTR_DEFAULT_FETCH_MODE",(long)PDO_ATTR_DEFAULT_FETCH_MODE);
        
        REGISTER_PDO_CLASS_CONST_LONG("ERRMODE_SILENT", 
(long)PDO_ERRMODE_SILENT);
        REGISTER_PDO_CLASS_CONST_LONG("ERRMODE_WARNING",        
(long)PDO_ERRMODE_WARNING);
@@ -1339,7 +1364,7 @@
 static void dbh_free(pdo_dbh_t *dbh TSRMLS_DC)
 {
        int i;
-       
+
        if (--dbh->refcount)
                return;
 
@@ -1361,7 +1386,7 @@
        if (dbh->password) {
                pefree(dbh->password, dbh->is_persistent);
        }
-
+       
        if (dbh->def_stmt_ctor_args) {
                zval_ptr_dtor(&dbh->def_stmt_ctor_args);
        }
http://cvs.php.net/viewcvs.cgi/php-src/ext/pdo/pdo_stmt.c?r1=1.118.2.38&r2=1.118.2.38.2.1&diff_format=u
Index: php-src/ext/pdo/pdo_stmt.c
diff -u php-src/ext/pdo/pdo_stmt.c:1.118.2.38 
php-src/ext/pdo/pdo_stmt.c:1.118.2.38.2.1
--- php-src/ext/pdo/pdo_stmt.c:1.118.2.38       Sat Apr 22 19:10:53 2006
+++ php-src/ext/pdo/pdo_stmt.c  Thu May 11 22:43:44 2006
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: pdo_stmt.c,v 1.118.2.38 2006/04/22 19:10:53 tony2001 Exp $ */
+/* $Id: pdo_stmt.c,v 1.118.2.38.2.1 2006/05/11 22:43:44 helly Exp $ */
 
 /* The PDO Statement Handle Class */
 
@@ -717,6 +717,12 @@
                method = 
(zval**)Z_ARRVAL_P(callable)->pListHead->pListNext->pData;
 
                if (Z_TYPE_PP(object) == IS_STRING) { /* static call */
+                       if (zend_lookup_class(Z_STRVAL_PP(object), 
Z_STRLEN_PP(object), &pce TSRMLS_CC) == FAILURE) {
+                               pdo_raise_impl_error(stmt->dbh, stmt, "HY000", 
"user-supplied class does not exist" TSRMLS_CC);
+                               return 0;
+                       } else {
+                               ce = *pce;
+                       }
                        object = NULL;
                } else if (Z_TYPE_PP(object) == IS_OBJECT) { /* object call */
                        ce = Z_OBJCE_PP(object);
@@ -729,6 +735,8 @@
                        pdo_raise_impl_error(stmt->dbh, stmt, "HY000", 
"user-supplied function must be a valid callback; bogus method name" TSRMLS_CC);
                        return 0;
                }
+       } else if (Z_TYPE_P(callable) == IS_STRING) {
+               method = &callable;
        }
        
        if (!zend_is_callable(callable, 0, &fname)) {
@@ -854,13 +862,14 @@
                RETVAL_FALSE;
 
                switch (how) {
+                       case PDO_FETCH_USE_DEFAULT:
                        case PDO_FETCH_ASSOC:
                        case PDO_FETCH_BOTH:
                        case PDO_FETCH_NUM:
                        case PDO_FETCH_NAMED:
                                if (!return_all) {
                                        ALLOC_HASHTABLE(return_value->value.ht);
-                                       zend_hash_init(return_value->value.ht, 
stmt->column_count, NULL, ZVAL_PTR_DTOR, 0);                     
+                                       zend_hash_init(return_value->value.ht, 
stmt->column_count, NULL, ZVAL_PTR_DTOR, 0);
                                        Z_TYPE_P(return_value) = IS_ARRAY;
                                } else {
                                        array_init(return_value);
@@ -915,6 +924,18 @@
                                                        return 0;
                                                }
                                        }
+                                       if (ce->constructor && (flags & 
PDO_FETCH_PROPS_LATE)) {
+                                               stmt->fetch.cls.fci.object_pp = 
&return_value;
+                                               stmt->fetch.cls.fcc.object_pp = 
&return_value;
+                                               if 
(zend_call_function(&stmt->fetch.cls.fci, &stmt->fetch.cls.fcc TSRMLS_CC) == 
FAILURE) {
+                                                       
pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "could not call class 
constructor" TSRMLS_CC);
+                                                       return 0;
+                                               } else {
+                                                       if 
(stmt->fetch.cls.retval_ptr) {
+                                                               
zval_ptr_dtor(&stmt->fetch.cls.retval_ptr);
+                                                       }
+                                               }
+                                       }
                                }
                                break;
                        
@@ -971,6 +992,7 @@
                                        add_assoc_zval(return_value, 
stmt->columns[i].name, val);
                                        break;
 
+                               case PDO_FETCH_USE_DEFAULT:
                                case PDO_FETCH_BOTH:
                                        add_assoc_zval(return_value, 
stmt->columns[i].name, val);
                                        ZVAL_ADDREF(val);
@@ -1077,7 +1099,7 @@
                
                switch (how) {
                        case PDO_FETCH_CLASS:
-                               if (ce->constructor) {
+                               if (ce->constructor && !(flags & 
PDO_FETCH_PROPS_LATE)) {
                                        stmt->fetch.cls.fci.object_pp = 
&return_value;
                                        stmt->fetch.cls.fcc.object_pp = 
&return_value;
                                        if 
(zend_call_function(&stmt->fetch.cls.fci, &stmt->fetch.cls.fcc TSRMLS_CC) == 
FAILURE) {
@@ -1517,7 +1539,7 @@
 
        param.paramno = -1;
        param.param_type = PDO_PARAM_STR;
-
+       
        if (FAILURE == zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, 
ZEND_NUM_ARGS() TSRMLS_CC,
                        "lz/|l", &param.paramno, &param.parameter, 
&param.param_type)) {
                if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"sz/|l", &param.name,
@@ -2357,11 +2379,15 @@
        NULL
 };
 
-zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object 
TSRMLS_DC)
+zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object, 
int by_ref TSRMLS_DC)
 {
        pdo_stmt_t *stmt = (pdo_stmt_t*)zend_object_store_get_object(object 
TSRMLS_CC);
        struct php_pdo_iterator *I;
 
+       if (by_ref) {
+               zend_error(E_ERROR, "An iterator cannot be used with foreach by 
reference");
+       }
+
        I = ecalloc(1, sizeof(*I));
        I->iter.funcs = &pdo_stmt_iter_funcs;
        I->iter.data = I;
http://cvs.php.net/viewcvs.cgi/php-src/ext/pdo/php_pdo.h?r1=1.7.2.5&r2=1.7.2.5.2.1&diff_format=u
Index: php-src/ext/pdo/php_pdo.h
diff -u php-src/ext/pdo/php_pdo.h:1.7.2.5 php-src/ext/pdo/php_pdo.h:1.7.2.5.2.1
--- php-src/ext/pdo/php_pdo.h:1.7.2.5   Sun Jan  1 12:50:11 2006
+++ php-src/ext/pdo/php_pdo.h   Thu May 11 22:43:44 2006
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: php_pdo.h,v 1.7.2.5 2006/01/01 12:50:11 sniper Exp $ */
+/* $Id: php_pdo.h,v 1.7.2.5.2.1 2006/05/11 22:43:44 helly Exp $ */
 
 #ifndef PHP_PDO_H
 #define PHP_PDO_H
@@ -62,14 +62,17 @@
 # define PDOG(v) (pdo_globals.v)
 #endif
 
-PDO_API void php_pdo_declare_long_constant(const char *const_name, size_t 
name_len, long value TSRMLS_DC);
-PDO_API void php_pdo_declare_stringl_constant(const char *const_name, size_t 
name_len, const char *value, size_t value_len TSRMLS_DC);
-
 #define REGISTER_PDO_CLASS_CONST_LONG(const_name, value) \
-       php_pdo_declare_long_constant(const_name, sizeof(const_name)-1, 
(long)value TSRMLS_CC);
+       zend_declare_class_constant_long(php_pdo_get_dbh_ce(), const_name, 
sizeof(const_name)-1, (long)value TSRMLS_CC);
+
+#define REGISTER_PDO_CONST_LONG(const_name, value) { \
+       zend_class_entry **pce; \
+       if (zend_hash_find(CG(class_table), "pdo", sizeof("pdo"), (void **) 
&pce) != FAILURE)   \
+               zend_declare_class_constant_long(*pce, const_name, 
sizeof(const_name)-1, (long)value TSRMLS_CC);        \
+}      \
 
 #define REGISTER_PDO_CLASS_CONST_STRING(const_name, value) \
-       php_pdo_declare_stringl_constant(const_name, sizeof(const_name)-1, 
value, sizeof(value)-1 TSRMLS_CC);
+       zend_declare_class_constant_stringl(php_pdo_get_dbh_ce(), const_name, 
sizeof(const_name)-1, value, sizeof(value)-1 TSRMLS_CC);
 
 #define PDO_CONSTRUCT_CHECK    \
        if (!dbh->driver) {     \
http://cvs.php.net/viewcvs.cgi/php-src/ext/pdo/php_pdo_driver.h?r1=1.66.2.11&r2=1.66.2.11.2.1&diff_format=u
Index: php-src/ext/pdo/php_pdo_driver.h
diff -u php-src/ext/pdo/php_pdo_driver.h:1.66.2.11 
php-src/ext/pdo/php_pdo_driver.h:1.66.2.11.2.1
--- php-src/ext/pdo/php_pdo_driver.h:1.66.2.11  Sun Apr  9 08:05:01 2006
+++ php-src/ext/pdo/php_pdo_driver.h    Thu May 11 22:43:44 2006
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: php_pdo_driver.h,v 1.66.2.11 2006/04/09 08:05:01 wez Exp $ */
+/* $Id: php_pdo_driver.h,v 1.66.2.11.2.1 2006/05/11 22:43:44 helly Exp $ */
 
 #ifndef PHP_PDO_DRIVER_H
 #define PHP_PDO_DRIVER_H
@@ -44,7 +44,7 @@
 # define FALSE 0
 #endif
 
-#define PDO_DRIVER_API 20060409
+#define PDO_DRIVER_API 20060511
 
 enum pdo_param_type {
        PDO_PARAM_NULL,
@@ -98,6 +98,7 @@
 #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 */
 #define PDO_FETCH_SERIALIZE 0x00080000  /* fetch class instances by calling 
serialize */
+#define PDO_FETCH_PROPS_LATE 0x00100000  /* fetch props after calling ctor */
 
 /* fetch orientation for scrollable cursors */
 enum pdo_fetch_orientation {
@@ -129,6 +130,7 @@
        PDO_ATTR_DRIVER_NAME,             /* name of the driver (as used in the 
constructor) */
        PDO_ATTR_STRINGIFY_FETCHES,     /* converts integer/float types to 
strings during fetch */
        PDO_ATTR_MAX_COLUMN_LEN,        /* make database calculate maximum 
length of data found in a column */
+       PDO_ATTR_DEFAULT_FETCH_MODE, /* Set the default fetch mode */
        PDO_ATTR_EMULATE_PREPARES,  /* use query emulation rather than native */
 
        /* this defines the start of the range for driver specific options.
@@ -340,7 +342,7 @@
        PDO_PARAM_EVT_EXEC_POST,
        PDO_PARAM_EVT_FETCH_PRE,
        PDO_PARAM_EVT_FETCH_POST,
-       PDO_PARAM_EVT_NORMALIZE
+       PDO_PARAM_EVT_NORMALIZE,
 };
 
 typedef int (*pdo_stmt_param_hook_func)(pdo_stmt_t *stmt, struct 
pdo_bound_param_data *param, enum pdo_param_event event_type TSRMLS_DC);
@@ -489,6 +491,7 @@
        pdo_driver_t *driver;
        
        zend_class_entry *def_stmt_ce;
+
        zval *def_stmt_ctor_args;
 
        /* when calling PDO::query(), we need to keep the error
@@ -497,6 +500,9 @@
         * when PDO::query() fails */
        pdo_stmt_t *query_stmt;
        zval query_stmt_zval;
+
+       /* defaults for fetches */
+       enum pdo_fetch_type default_fetch_type;
 };
 
 /* describes a column */
@@ -639,7 +645,8 @@
                unsigned long data_source_len, struct pdo_data_src_parser 
*parsed,
                int nparams);
 
-PDO_API zend_class_entry *php_pdo_get_exception(void);
+PDO_API zend_class_entry *php_pdo_get_dbh_ce();
+PDO_API zend_class_entry *php_pdo_get_exception();
 
 PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, 
        char **outquery, int *outquery_len TSRMLS_DC);
http://cvs.php.net/viewcvs.cgi/php-src/ext/pdo/php_pdo_int.h?r1=1.17.2.6&r2=1.17.2.6.2.1&diff_format=u
Index: php-src/ext/pdo/php_pdo_int.h
diff -u php-src/ext/pdo/php_pdo_int.h:1.17.2.6 
php-src/ext/pdo/php_pdo_int.h:1.17.2.6.2.1
--- php-src/ext/pdo/php_pdo_int.h:1.17.2.6      Sun Jan  1 12:50:11 2006
+++ php-src/ext/pdo/php_pdo_int.h       Thu May 11 22:43:44 2006
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: php_pdo_int.h,v 1.17.2.6 2006/01/01 12:50:11 sniper Exp $ */
+/* $Id: php_pdo_int.h,v 1.17.2.6.2.1 2006/05/11 22:43:44 helly Exp $ */
 
 /* Stuff private to the PDO extension and not for consumption by PDO drivers
  * */
@@ -40,7 +40,7 @@
 extern zend_function_entry pdo_dbstmt_functions[];
 extern zend_class_entry *pdo_dbstmt_ce;
 void pdo_dbstmt_free_storage(pdo_stmt_t *stmt TSRMLS_DC);
-zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object 
TSRMLS_DC);
+zend_object_iterator *pdo_stmt_iter_get(zend_class_entry *ce, zval *object, 
int by_ref TSRMLS_DC);
 extern zend_object_handlers pdo_dbstmt_object_handlers;
 int pdo_stmt_describe_columns(pdo_stmt_t *stmt TSRMLS_DC);
 int pdo_stmt_setup_fetch_mode(INTERNAL_FUNCTION_PARAMETERS, pdo_stmt_t *stmt, 
int skip_first_arg);

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to