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);
}
}
-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;
}
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) {
}
if (return_value) {
- int i;
+ int i = 0;
if (how == PDO_FETCH_LAZY) {
get_lazy_object(stmt, return_value TSRMLS_CC);
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) {
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);
add_next_index_zval(grp, return_value);
}
zval_dtor(&val);
- i = 1;
- } else {
- i = 0;
+ i++;
}
for (; i < stmt->column_count; i++) {
}
}
}
+ if (flags & PDO_FETCH_CLASSTYPE) {
+ do_fetch_class_finish(stmt, 0 TSRMLS_CC);
+ stmt->fetch.cls.ce = old_ce;
+ }
break;
default:
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;
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:
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);