summaryrefslogtreecommitdiff
path: root/ext/pdo/pdo_stmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pdo/pdo_stmt.c')
-rwxr-xr-xext/pdo/pdo_stmt.c138
1 files changed, 41 insertions, 97 deletions
diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c
index f82261f6a8..053a3ef46c 100755
--- a/ext/pdo/pdo_stmt.c
+++ b/ext/pdo/pdo_stmt.c
@@ -41,34 +41,28 @@
ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_execute, 0, 0, 0)
ZEND_ARG_INFO(0, bound_input_params) /* array */
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_fetch, 0, 0, 0)
ZEND_ARG_INFO(0, how)
ZEND_ARG_INFO(0, orientation)
ZEND_ARG_INFO(0, offset)
ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_fetchobject, 0, 0, 0)
+ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_fetchobject, 0, 0, 1)
ZEND_ARG_INFO(0, class_name)
ZEND_ARG_INFO(0, ctor_args) /* array */
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_fetchcolumn, 0, 0, 0)
ZEND_ARG_INFO(0, column_number)
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_fetchall, 0, 0, 0)
ZEND_ARG_INFO(0, how)
ZEND_ARG_INFO(0, class_name)
ZEND_ARG_INFO(0, ctor_args) /* array */
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_bindvalue, 0, 0, 2)
ZEND_ARG_INFO(0, paramno)
ZEND_ARG_INFO(0, param)
ZEND_ARG_INFO(0, type)
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_bindparam, 0, 0, 2)
ZEND_ARG_INFO(0, paramno)
ZEND_ARG_INFO(1, param)
@@ -76,7 +70,6 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_bindparam, 0, 0, 2)
ZEND_ARG_INFO(0, maxlen)
ZEND_ARG_INFO(0, driverdata)
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_bindcolumn, 0, 0, 2)
ZEND_ARG_INFO(0, column)
ZEND_ARG_INFO(1, param)
@@ -84,20 +77,16 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_bindcolumn, 0, 0, 2)
ZEND_ARG_INFO(0, maxlen)
ZEND_ARG_INFO(0, driverdata)
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO(arginfo_pdostatement_setattribute, 0)
ZEND_ARG_INFO(0, attribute)
ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO(arginfo_pdostatement_getattribute, 0)
ZEND_ARG_INFO(0, attribute)
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO(arginfo_pdostatement_getcolumnmeta, 0)
ZEND_ARG_INFO(0, column)
ZEND_END_ARG_INFO()
-
ZEND_BEGIN_ARG_INFO_EX(arginfo_pdostatement_setfetchmode, 0, 0, 1)
ZEND_ARG_INFO(0, mode)
ZEND_ARG_INFO(0, params)
@@ -589,8 +578,6 @@ static inline void fetch_value(pdo_stmt_t *stmt, zval *dest, int colno, int *typ
case PDO_PARAM_LOB:
if (value == NULL) {
ZVAL_NULL(dest);
- } else if (value[0] == '\0') {
- ZVAL_EMPTY_STRING(dest);
} else if (value_len == 0) {
if (stmt->dbh->stringify || new_type == PDO_PARAM_STR) {
char *buf = NULL;
@@ -786,7 +773,7 @@ static int do_fetch_class_prepare(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
static int make_callable_ex(pdo_stmt_t *stmt, zval *callable, zend_fcall_info * fci, zend_fcall_info_cache * fcc, int num_args TSRMLS_DC) /* {{{ */
{
- zval *object = NULL, **method = NULL;
+ zval **object = NULL, **method = NULL;
char *fname = NULL, *cname;
zend_class_entry * ce = NULL, **pce;
zend_function *function_handler;
@@ -796,19 +783,19 @@ static int make_callable_ex(pdo_stmt_t *stmt, zval *callable, zend_fcall_info *
pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied function must be a valid callback" TSRMLS_CC);
return 0;
}
- object = *(zval**)Z_ARRVAL_P(callable)->pListHead->pData;
+ object = (zval**)Z_ARRVAL_P(callable)->pListHead->pData;
method = (zval**)Z_ARRVAL_P(callable)->pListHead->pListNext->pData;
- if (Z_TYPE_P(object) == IS_STRING) { /* static call */
- if (zend_lookup_class(Z_STRVAL_P(object), Z_STRLEN_P(object), &pce TSRMLS_CC) == FAILURE) {
+ 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_P(object) == IS_OBJECT) { /* object call */
- ce = Z_OBJCE_P(object);
+ } else if (Z_TYPE_PP(object) == IS_OBJECT) { /* object call */
+ ce = Z_OBJCE_PP(object);
} else {
pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "user-supplied function must be a valid callback; bogus object/class name" TSRMLS_CC);
return 0;
@@ -868,13 +855,13 @@ static int make_callable_ex(pdo_stmt_t *stmt, zval *callable, zend_fcall_info *
fci->symbol_table = NULL;
fci->param_count = num_args; /* probably less */
fci->params = safe_emalloc(sizeof(zval**), num_args, 0);
- fci->object_ptr = object;
+ fci->object_pp = object;
fcc->initialized = 1;
fcc->function_handler = function_handler;
fcc->calling_scope = EG(scope);
- fcc->called_scope = object ? Z_OBJCE_P(object) : NULL;
- fcc->object_ptr = object;
+ fcc->called_scope = object ? Z_OBJCE_PP(object) : NULL;
+ fcc->object_pp = object;
return 1;
}
@@ -920,7 +907,7 @@ static int do_fetch_opt_finish(pdo_stmt_t *stmt, int free_ctor_agrs TSRMLS_DC) /
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, idx, old_arg_count = 0;
+ int flags = how & PDO_FETCH_FLAGS, idx, old_arg_count = 0;
zend_class_entry *ce = NULL, *old_ce = NULL;
zval grp_val, *grp, **pgrp, *retval, *old_ctor_args = NULL;
int colno;
@@ -928,7 +915,6 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
if (how == PDO_FETCH_USE_DEFAULT) {
how = stmt->default_fetch_type;
}
- flags = how & PDO_FETCH_FLAGS;
how = how & ~PDO_FETCH_FLAGS;
if (!do_fetch_common(stmt, ori, offset, do_bind TSRMLS_CC)) {
@@ -1042,8 +1028,8 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
}
}
if (ce->constructor && (flags & PDO_FETCH_PROPS_LATE)) {
- stmt->fetch.cls.fci.object_ptr = return_value;
- stmt->fetch.cls.fcc.object_ptr = return_value;
+ 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;
@@ -1242,8 +1228,8 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value,
switch (how) {
case PDO_FETCH_CLASS:
if (ce->constructor && !(flags & PDO_FETCH_PROPS_LATE)) {
- stmt->fetch.cls.fci.object_ptr = return_value;
- stmt->fetch.cls.fcc.object_ptr = return_value;
+ 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;
@@ -1395,7 +1381,7 @@ static PHP_METHOD(PDOStatement, fetch)
}
/* }}} */
-/* {{{ proto mixed PDOStatement::fetchObject([string class_name [, NULL|array ctor_args]])
+/* {{{ proto mixed PDOStatement::fetchObject(string class_name [, NULL|array ctor_args])
Fetches the next row and returns it as an object. */
static PHP_METHOD(PDOStatement, fetchObject)
{
@@ -1503,7 +1489,7 @@ static PHP_METHOD(PDOStatement, fetchAll)
zval *arg2;
zend_class_entry *old_ce;
zval *old_ctor_args, *ctor_args = NULL;
- int error = 0, flags, old_arg_count;
+ int error = 0, old_arg_count;
PHP_STMT_GET_OBJ;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lzz", &how, &arg2, &ctor_args)) {
@@ -1595,10 +1581,7 @@ static PHP_METHOD(PDOStatement, fetchAll)
}
}
- flags = how & PDO_FETCH_FLAGS;
-
if ((how & ~PDO_FETCH_FLAGS) == PDO_FETCH_USE_DEFAULT) {
- flags |= stmt->default_fetch_type & PDO_FETCH_FLAGS;
how |= stmt->default_fetch_type & ~PDO_FETCH_FLAGS;
}
@@ -1613,7 +1596,7 @@ static PHP_METHOD(PDOStatement, fetchAll)
} else {
return_all = 0;
}
- if (!do_fetch(stmt, TRUE, data, how | flags, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC)) {
+ if (!do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC)) {
FREE_ZVAL(data);
error = 2;
}
@@ -1622,15 +1605,15 @@ static PHP_METHOD(PDOStatement, fetchAll)
if ((how & PDO_FETCH_GROUP)) {
do {
MAKE_STD_ZVAL(data);
- } while (do_fetch(stmt, TRUE, data, how | flags, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
+ } while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
} else if (how == PDO_FETCH_KEY_PAIR || (how == PDO_FETCH_USE_DEFAULT && stmt->default_fetch_type == PDO_FETCH_KEY_PAIR)) {
- while (do_fetch(stmt, TRUE, data, how | flags, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
+ 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 | flags, PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC));
+ } while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC));
}
FREE_ZVAL(data);
}
@@ -1766,10 +1749,6 @@ static PHP_METHOD(PDOStatement, errorCode)
return;
}
- if (stmt->error_code[0] == '\0') {
- RETURN_NULL();
- }
-
RETURN_STRING(stmt->error_code, 1);
}
/* }}} */
@@ -1778,10 +1757,6 @@ static PHP_METHOD(PDOStatement, errorCode)
Fetch extended error information associated with the last operation on the statement handle */
static PHP_METHOD(PDOStatement, errorInfo)
{
- int error_count;
- int error_count_diff = 0;
- int error_expected_count = 3;
-
PHP_STMT_GET_OBJ;
if (zend_parse_parameters_none() == FAILURE) {
@@ -1794,17 +1769,6 @@ static PHP_METHOD(PDOStatement, errorInfo)
if (stmt->dbh->methods->fetch_err) {
stmt->dbh->methods->fetch_err(stmt->dbh, stmt, return_value TSRMLS_CC);
}
-
- error_count = zend_hash_num_elements(Z_ARRVAL_P(return_value));
-
- if (error_expected_count > error_count) {
- int current_index;
-
- error_count_diff = error_expected_count - error_count;
- for (current_index = 0; current_index < error_count_diff; current_index++) {
- add_next_index_null(return_value);
- }
- }
}
/* }}} */
@@ -1948,7 +1912,7 @@ static PHP_METHOD(PDOStatement, getColumnMeta)
int pdo_stmt_setup_fetch_mode(INTERNAL_FUNCTION_PARAMETERS, pdo_stmt_t *stmt, int skip)
{
long mode = PDO_FETCH_BOTH;
- int flags, argc = ZEND_NUM_ARGS() - skip;
+ int argc = ZEND_NUM_ARGS() - skip;
zval ***args;
zend_class_entry **cep;
@@ -1981,7 +1945,6 @@ fail_out:
convert_to_long_ex(args[skip]);
mode = Z_LVAL_PP(args[skip]);
- flags = mode & PDO_FETCH_FLAGS;
if (!pdo_stmt_verify_mode(stmt, mode, 0 TSRMLS_CC)) {
efree(args);
@@ -2009,30 +1972,21 @@ fail_out:
break;
case PDO_FETCH_CLASS:
- /* Gets its class name from 1st column */
- if ((flags & PDO_FETCH_CLASSTYPE) == PDO_FETCH_CLASSTYPE) {
- if (argc != 1) {
- goto fail_out;
- }
- stmt->fetch.cls.ce = NULL;
- } else {
- if (argc < 2 || argc > 3) {
- goto fail_out;
- }
- convert_to_string_ex(args[skip+1]);
-
- if (FAILURE == zend_lookup_class(Z_STRVAL_PP(args[skip+1]),
- Z_STRLEN_PP(args[skip+1]), &cep TSRMLS_CC)) {
- goto fail_out;
- }
-
- if (!cep || !*cep) {
- goto fail_out;
- }
-
- stmt->fetch.cls.ce = *cep;
+ if (argc < 2 || argc > 3) {
+ goto fail_out;
}
+ convert_to_string_ex(args[skip+1]);
+ if (FAILURE == zend_lookup_class(Z_STRVAL_PP(args[skip+1]),
+ Z_STRLEN_PP(args[skip+1]), &cep TSRMLS_CC)) {
+ goto fail_out;
+ }
+
+ if (!cep || !*cep) {
+ goto fail_out;
+ }
+
+ stmt->fetch.cls.ce = *cep;
stmt->fetch.cls.ctor_args = NULL;
#ifdef ilia_0 /* we'll only need this when we have persistent statements, if ever */
if (stmt->dbh->is_persistent) {
@@ -2203,21 +2157,18 @@ static PHP_METHOD(PDOStatement, debugDumpParams)
char *str;
uint len;
ulong num;
- int res;
- res = zend_hash_get_current_key_ex(stmt->bound_params, &str, &len, &num, 0, &pos);
- if (res == HASH_KEY_IS_LONG) {
- php_stream_printf(out TSRMLS_CC, "Key: Position #%ld:\n", num);
- } else if (res == HASH_KEY_IS_STRING) {
+ if (zend_hash_get_current_key_ex(stmt->bound_params, &str, &len, &num, 0, &pos) == HASH_KEY_IS_STRING) {
+ php_stream_printf(out TSRMLS_CC, "Key: Position #%d:\n", num);
+ } else {
php_stream_printf(out TSRMLS_CC, "Key: Name: [%d] %.*s\n", len, len, str);
}
- php_stream_printf(out TSRMLS_CC, "paramno=%d\nname=[%d] \"%.*s\"\nis_param=%d\nparam_type=%d\n",
- param->paramno, param->namelen, param->namelen, param->name ? param->name : "",
+ php_stream_printf(out TSRMLS_CC, "paramno=%d\nname=[%d] %.*s\nis_param=%d\nparam_type=%d\n",
+ param->paramno, param->namelen, param->namelen, param->name,
param->is_param,
param->param_type);
- zend_hash_move_forward_ex(stmt->bound_params, &pos);
}
}
@@ -2625,7 +2576,6 @@ static zval *row_prop_or_dim_read(zval *object, zval *member, int type TSRMLS_DC
int colno = -1;
MAKE_STD_ZVAL(return_value);
- RETVAL_NULL();
if (Z_TYPE_P(member) == IS_LONG) {
if (Z_LVAL_P(member) >= 0 && Z_LVAL_P(member) < stmt->column_count) {
@@ -2638,15 +2588,9 @@ static zval *row_prop_or_dim_read(zval *object, zval *member, int type TSRMLS_DC
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, NULL TSRMLS_CC);
- Z_SET_REFCOUNT_P(return_value, 0);
- Z_UNSET_ISREF_P(return_value);
- return return_value;
+ break;
}
}
- if (strcmp(Z_STRVAL_P(member), "queryString") == 0) {
- zval_ptr_dtor(&return_value);
- return std_object_handlers.read_property(object, member, IS_STRING TSRMLS_CC);
- }
}
Z_SET_REFCOUNT_P(return_value, 0);