}
/* }}} */
-static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno TSRMLS_DC) /* {{{ */
+static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno, int *type_override TSRMLS_DC) /* {{{ */
{
struct pdo_column_data *col;
char *value = NULL;
unsigned long value_len = 0;
int caller_frees = 0;
+ int type;
col = &stmt->columns[colno];
+ type = type_override ? PDO_PARAM_TYPE(*type_override) : PDO_PARAM_TYPE(col->param_type);
value = NULL;
value_len = 0;
stmt->methods->get_col(stmt, colno, &value, &value_len, &caller_frees TSRMLS_CC);
- switch (PDO_PARAM_TYPE(col->param_type)) {
+ switch (type) {
case PDO_PARAM_INT:
if (value && value_len == sizeof(long)) {
ZVAL_LONG(dest, *(long*)value);
zval_dtor(param->parameter);
/* set new value */
- fetch_value(stmt, param->parameter, param->paramno TSRMLS_CC);
+ fetch_value(stmt, param->parameter, param->paramno, ¶m->param_type TSRMLS_CC);
/* TODO: some smart thing that avoids duplicating the value in the
* general loop below. For now, if you're binding output columns,
case PDO_FETCH_COLUMN:
if (stmt->fetch.column >= 0 && stmt->fetch.column < stmt->column_count) {
- fetch_value(stmt, return_value, stmt->fetch.column TSRMLS_CC);
+ fetch_value(stmt, return_value, stmt->fetch.column, NULL TSRMLS_CC);
if (!return_all) {
return 1;
} else {
do_fetch_opt_finish(stmt, 0 TSRMLS_CC);
INIT_PZVAL(&val);
- fetch_value(stmt, &val, i++ TSRMLS_CC);
+ fetch_value(stmt, &val, i++, NULL 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) {
if (return_all) {
INIT_PZVAL(&grp_val);
- fetch_value(stmt, &grp_val, i TSRMLS_CC);
+ fetch_value(stmt, &grp_val, i, NULL TSRMLS_CC);
convert_to_string(&grp_val);
if (how == PDO_FETCH_COLUMN) {
i = stmt->column_count; /* no more data to fetch */
for (idx = 0; i < stmt->column_count; i++, idx++) {
zval *val;
MAKE_STD_ZVAL(val);
- fetch_value(stmt, val, i TSRMLS_CC);
+ fetch_value(stmt, val, i, NULL TSRMLS_CC);
switch (how) {
case PDO_FETCH_ASSOC:
RETURN_FALSE;
}
- fetch_value(stmt, return_value, col_n TSRMLS_CC);
+ fetch_value(stmt, return_value, col_n, NULL TSRMLS_CC);
}
/* }}} */
if (Z_TYPE_P(member) == IS_LONG) {
if (Z_LVAL_P(member) >= 0 && Z_LVAL_P(member) < stmt->column_count) {
- fetch_value(stmt, return_value, Z_LVAL_P(member) TSRMLS_CC);
+ fetch_value(stmt, return_value, Z_LVAL_P(member), NULL TSRMLS_CC);
}
} else {
convert_to_string(member);
* numbers */
for (colno = 0; colno < stmt->column_count; colno++) {
if (strcmp(stmt->columns[colno].name, Z_STRVAL_P(member)) == 0) {
- fetch_value(stmt, return_value, colno TSRMLS_CC);
+ fetch_value(stmt, return_value, colno, NULL TSRMLS_CC);
break;
}
}
for (i = 0; i < stmt->column_count; i++) {
zval *val;
MAKE_STD_ZVAL(val);
- fetch_value(stmt, val, i TSRMLS_CC);
+ fetch_value(stmt, val, i, NULL TSRMLS_CC);
add_assoc_zval(tmp, stmt->columns[i].name, val);
}