diff options
Diffstat (limited to 'ext/pdo/pdo_stmt.c')
-rwxr-xr-x | ext/pdo/pdo_stmt.c | 138 |
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); |