From 9dc4271531e599426a36e15a1378f66ffd86d46d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 23 Nov 2008 20:00:51 +0000 Subject: [PATCH] - New parameter parsing API --- ext/interbase/ibase_query.c | 217 +++++++----------- ext/interbase/interbase.c | 4 + ext/interbase/tests/bug45373.phpt | 8 +- ext/interbase/tests/ibase_num_fields_001.phpt | 8 +- 4 files changed, 99 insertions(+), 138 deletions(-) diff --git a/ext/interbase/ibase_query.c b/ext/interbase/ibase_query.c index 000fcdecd43..f85c44f2a13 100644 --- a/ext/interbase/ibase_query.c +++ b/ext/interbase/ibase_query.c @@ -1211,42 +1211,32 @@ PHP_FUNCTION(ibase_query) PHP_FUNCTION(ibase_affected_rows) { ibase_trans *trans = NULL; - + ibase_db_link *ib_link; + zval *arg; + RESET_ERRMSG; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &arg) == FAILURE) { + return; + } - switch (ZEND_NUM_ARGS()) { + if (ZEND_NUM_ARGS() == 0) { + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link), LE_LINK, le_link, le_plink); + if (ib_link->tr_list == NULL || ib_link->tr_list->trans == NULL) { + RETURN_FALSE; + } + trans = ib_link->tr_list->trans; + } else { + /* one id was passed, could be db or trans id */ + _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, &arg, &ib_link, &trans); + if (trans == NULL) { + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, &arg, -1, LE_LINK, le_link, le_plink); - ibase_db_link *ib_link; - zval **arg; - - case 0: - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link), LE_LINK, - le_link, le_plink); if (ib_link->tr_list == NULL || ib_link->tr_list->trans == NULL) { RETURN_FALSE; } trans = ib_link->tr_list->trans; - break; - - case 1: - if (zend_get_parameters_ex(1, &arg) == FAILURE) { - RETURN_FALSE; - } - /* one id was passed, could be db or trans id */ - _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, arg, &ib_link, &trans); - if (trans == NULL) { - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, arg, -1, LE_LINK, le_link, le_plink); - - if (ib_link->tr_list == NULL || ib_link->tr_list->trans == NULL) { - RETURN_FALSE; - } - trans = ib_link->tr_list->trans; - } - break; - - default: - WRONG_PARAM_COUNT; - break; + } } RETURN_LONG(trans->affected_rows); } @@ -1277,21 +1267,20 @@ PHP_FUNCTION(ibase_num_rows) * sets. */ - zval **result_arg; + zval *result_arg; ibase_result *ib_result; static char info_count[] = {isc_info_sql_records}; char result[64]; RESET_ERRMSG; - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result_arg) == FAILURE) { - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result_arg) == FAILURE) { + return; } - ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result_arg, -1, LE_RESULT, le_result); + ZEND_FETCH_RESOURCE(ib_result, ibase_result *, &result_arg, -1, LE_RESULT, le_result); - if (isc_dsql_sql_info(IB_STATUS, &ib_result->stmt, sizeof(info_count), info_count, - sizeof(result), result)) { + if (isc_dsql_sql_info(IB_STATUS, &ib_result->stmt, sizeof(info_count), info_count, sizeof(result), result)) { _php_ibase_error(TSRMLS_C); RETURN_FALSE; } @@ -1494,40 +1483,25 @@ static int _php_ibase_arr_zval(zval *ar_zval, char *data, unsigned long data_siz static void _php_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int fetch_type) /* {{{ */ { - zval **result_arg, **flag_arg; + zval *result_arg; + long flag_arg; long i, array_cnt = 0, flag = 0; ibase_result *ib_result; RESET_ERRMSG; - switch (ZEND_NUM_ARGS()) { - case 1: - if (FAILURE == zend_get_parameters_ex(1, &result_arg)) { - RETURN_FALSE; - } - break; - case 2: - if (FAILURE == zend_get_parameters_ex(2, &result_arg, &flag_arg)) { - RETURN_FALSE; - } - convert_to_long_ex(flag_arg); - flag = Z_LVAL_PP(flag_arg); - break; - default: - WRONG_PARAM_COUNT; - break; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &result_arg, &flag)) { + return; } - ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result_arg, -1, LE_RESULT, le_result); + ZEND_FETCH_RESOURCE(ib_result, ibase_result *, &result_arg, -1, LE_RESULT, le_result); if (ib_result->out_sqlda == NULL || !ib_result->has_more_rows) { RETURN_FALSE; } if (ib_result->statement_type != isc_info_sql_stmt_exec_procedure) { - if (isc_dsql_fetch(IB_STATUS, &ib_result->stmt, 1, ib_result->out_sqlda)) { - ib_result->has_more_rows = 0; if (IB_STATUS[0] && IB_STATUS[1]) { /* error in fetch */ _php_ibase_error(TSRMLS_C); @@ -1722,19 +1696,20 @@ PHP_FUNCTION(ibase_fetch_object) Assign a name to a result for use with ... WHERE CURRENT OF statements */ PHP_FUNCTION(ibase_name_result) { - zval **result_arg, **name_arg; + zval *result_arg; + char *name_arg; + int name_arg_len; ibase_result *ib_result; RESET_ERRMSG; - if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &result_arg, &name_arg) == FAILURE) { - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &result_arg, &name_arg, &name_arg_len) == FAILURE) { + return; } - ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result_arg, -1, LE_RESULT, le_result); - convert_to_string_ex(name_arg); + ZEND_FETCH_RESOURCE(ib_result, ibase_result *, &result_arg, -1, LE_RESULT, le_result); - if (isc_dsql_set_cursor_name(IB_STATUS, &ib_result->stmt, Z_STRVAL_PP(name_arg), 0)) { + if (isc_dsql_set_cursor_name(IB_STATUS, &ib_result->stmt, name_arg, 0)) { _php_ibase_error(TSRMLS_C); RETURN_FALSE; } @@ -1747,81 +1722,64 @@ PHP_FUNCTION(ibase_name_result) Free the memory used by a result */ PHP_FUNCTION(ibase_free_result) { - zval **result_arg; + zval *result_arg; ibase_result *ib_result; RESET_ERRMSG; - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result_arg) == FAILURE) { - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result_arg) == FAILURE) { + return; } - ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result_arg, -1, LE_RESULT, le_result); - zend_list_delete(Z_LVAL_PP(result_arg)); + ZEND_FETCH_RESOURCE(ib_result, ibase_result *, &result_arg, -1, LE_RESULT, le_result); + zend_list_delete(Z_RESVAL_P(result_arg)); RETURN_TRUE; } /* }}} */ -/* {{{ proto resource ibase_prepare([resource link_identifier, ] string query) +/* {{{ proto resource ibase_prepare(resource link_identifier[, string query [, resource trans_identifier ]]) Prepare a query for later execution */ PHP_FUNCTION(ibase_prepare) { - zval **link_arg, **trans_arg, **query_arg; + zval *link_arg, *trans_arg; ibase_db_link *ib_link; ibase_trans *trans = NULL; - int trans_res_id = 0; + int query_len, trans_res_id = 0; ibase_query *ib_query; char *query; RESET_ERRMSG; + + if (ZEND_NUM_ARGS() == 1) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &query, &query_len) == FAILURE) { + return; + } + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link), LE_LINK, le_link, le_plink); + } else if (ZEND_NUM_ARGS() == 2) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &link_arg, &query, &query_len) == FAILURE) { + return; + } + _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, &link_arg, &ib_link, &trans); - switch (ZEND_NUM_ARGS()) { - case 1: - if (zend_get_parameters_ex(1, &query_arg) == FAILURE) { - RETURN_FALSE; - } - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link), LE_LINK, - le_link, le_plink); - break; - case 2: - if (zend_get_parameters_ex(2, &link_arg, &query_arg) == FAILURE) { - RETURN_FALSE; - } - _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans); - - if (trans != NULL) { - convert_to_long_ex(link_arg); - trans_res_id = Z_LVAL_PP(link_arg); - } - - break; - case 3: - if (zend_get_parameters_ex(3, &link_arg, &trans_arg, &query_arg) == FAILURE) { - RETURN_FALSE; - } - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link*, link_arg, -1, LE_LINK, le_link, le_plink); - ZEND_FETCH_RESOURCE(trans, ibase_trans*, trans_arg, -1, LE_TRANS, le_trans); - - convert_to_long_ex(trans_arg); - trans_res_id = Z_LVAL_PP(trans_arg); - - break; - default: - WRONG_PARAM_COUNT; - break; + if (trans != NULL) { + trans_res_id = Z_RESVAL_P(link_arg); + } + } else { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rrs", &link_arg, &trans_arg, &query, &query_len) == FAILURE) { + return; + } + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, &link_arg, -1, LE_LINK, le_link, le_plink); + ZEND_FETCH_RESOURCE(trans, ibase_trans *, &trans_arg, -1, LE_TRANS, le_trans); + trans_res_id = Z_RESVAL_P(trans_arg); } - convert_to_string_ex(query_arg); - query = Z_STRVAL_PP(query_arg); - if (FAILURE == _php_ibase_def_trans(ib_link, &trans TSRMLS_CC)) { RETURN_FALSE; } ib_query = (ibase_query *) emalloc(sizeof(ibase_query)); - if (FAILURE == _php_ibase_alloc_query(ib_query, ib_link, trans, query, ib_link->dialect, - trans_res_id TSRMLS_CC)) { + if (FAILURE == _php_ibase_alloc_query(ib_query, ib_link, trans, query, ib_link->dialect, trans_res_id TSRMLS_CC)) { efree(ib_query); RETURN_FALSE; } @@ -1911,17 +1869,17 @@ PHP_FUNCTION(ibase_execute) Free memory used by a query */ PHP_FUNCTION(ibase_free_query) { - zval **query_arg; + zval *query_arg; ibase_query *ib_query; RESET_ERRMSG; - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &query_arg) == FAILURE) { - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &query_arg) == FAILURE) { + return; } - ZEND_FETCH_RESOURCE(ib_query, ibase_query *, query_arg, -1, LE_QUERY, le_query); - zend_list_delete(Z_LVAL_PP(query_arg)); + ZEND_FETCH_RESOURCE(ib_query, ibase_query *, &query_arg, -1, LE_QUERY, le_query); + zend_list_delete(Z_RESVAL_P(query_arg)); RETURN_TRUE; } /* }}} */ @@ -1930,29 +1888,29 @@ PHP_FUNCTION(ibase_free_query) Get the number of fields in result */ PHP_FUNCTION(ibase_num_fields) { - zval **result; + zval *result; int type; XSQLDA *sqlda; RESET_ERRMSG; - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &result)==FAILURE) { - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) { + return; } - zend_list_find(Z_LVAL_PP(result), &type); + zend_list_find(Z_RESVAL_P(result), &type); if (type == le_query) { ibase_query *ib_query; - ZEND_FETCH_RESOURCE(ib_query, ibase_query *, result, -1, LE_QUERY, le_query); + ZEND_FETCH_RESOURCE(ib_query, ibase_query *, &result, -1, LE_QUERY, le_query); sqlda = ib_query->out_sqlda; } else { ibase_result *ib_result; - ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result, -1, LE_RESULT, le_result); + ZEND_FETCH_RESOURCE(ib_result, ibase_result *, &result, -1, LE_RESULT, le_result); sqlda = ib_result->out_sqlda; - } + } if (sqlda == NULL) { RETURN_LONG(0); @@ -2053,27 +2011,28 @@ static void _php_ibase_field_info(zval *return_value, XSQLVAR *var) /* {{{ */ Get information about a field */ PHP_FUNCTION(ibase_field_info) { - zval **result_arg, **field_arg; + zval *result_arg; + long field_arg; int type; XSQLDA *sqlda; RESET_ERRMSG; - if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &result_arg, &field_arg)==FAILURE) { - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result_arg, &field_arg) == FAILURE) { + return; } - zend_list_find(Z_LVAL_PP(result_arg), &type); + zend_list_find(Z_RESVAL_P(result_arg), &type); if (type == le_query) { ibase_query *ib_query; - ZEND_FETCH_RESOURCE(ib_query, ibase_query *, result_arg, -1, LE_QUERY, le_query); + ZEND_FETCH_RESOURCE(ib_query, ibase_query *, &result_arg, -1, LE_QUERY, le_query); sqlda = ib_query->out_sqlda; } else { ibase_result *ib_result; - ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result_arg, -1, LE_RESULT, le_result); + ZEND_FETCH_RESOURCE(ib_result, ibase_result *, &result_arg, -1, LE_RESULT, le_result); sqlda = ib_result->out_sqlda; } @@ -2082,12 +2041,10 @@ PHP_FUNCTION(ibase_field_info) RETURN_FALSE; } - convert_to_long_ex(field_arg); - - if (Z_LVAL_PP(field_arg) < 0 || Z_LVAL_PP(field_arg) >= sqlda->sqld) { + if (field_arg < 0 || field_arg >= sqlda->sqld) { RETURN_FALSE; } - _php_ibase_field_info(return_value,sqlda->sqlvar + Z_LVAL_PP(field_arg)); + _php_ibase_field_info(return_value, sqlda->sqlvar + field_arg); } /* }}} */ diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c index e77a0773099..26ceb81d925 100644 --- a/ext/interbase/interbase.c +++ b/ext/interbase/interbase.c @@ -43,6 +43,8 @@ #define COMMIT 1 #define RETAIN 2 +#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } } + ZEND_DECLARE_MODULE_GLOBALS(ibase) static PHP_GINIT_FUNCTION(ibase); @@ -1061,6 +1063,7 @@ PHP_FUNCTION(ibase_close) if (ZEND_NUM_ARGS() == 0) { link_id = IBG(default_link); + CHECK_LINK(link_id); IBG(default_link) = -1; } else { link_id = Z_RESVAL_P(link_arg); @@ -1089,6 +1092,7 @@ PHP_FUNCTION(ibase_drop_db) if (ZEND_NUM_ARGS() == 0) { link_id = IBG(default_link); + CHECK_LINK(link_id); IBG(default_link) = -1; } else { link_id = Z_RESVAL_P(link_arg); diff --git a/ext/interbase/tests/bug45373.phpt b/ext/interbase/tests/bug45373.phpt index bbaccd1289a..8b16ef00f2f 100644 --- a/ext/interbase/tests/bug45373.phpt +++ b/ext/interbase/tests/bug45373.phpt @@ -33,7 +33,7 @@ array(2) { string(32) "test table not created with isql" } -Notice: ibase_execute(): Statement expects 2 arguments, 3 given in %sbug45373.php on line %d +Notice: ibase_execute(): Statement expects 2 arguments, 3 given in %s on line %d array(2) { ["I"]=> int(1) @@ -41,7 +41,7 @@ array(2) { string(32) "test table not created with isql" } -Warning: ibase_execute(): Statement expects 2 arguments, 1 given in %sbug45373.php on line %d +Warning: ibase_execute(): Statement expects 2 arguments, 1 given in %s on line %d -Warning: ibase_fetch_assoc(): supplied argument is not a valid Firebird/InterBase result resource in %sbug45373.php on line %d -bool(false) +Warning: ibase_fetch_assoc() expects parameter 1 to be resource, boolean given in %s on line %d +NULL diff --git a/ext/interbase/tests/ibase_num_fields_001.phpt b/ext/interbase/tests/ibase_num_fields_001.phpt index 510b0f6f58d..f1e0e4ab4f8 100644 --- a/ext/interbase/tests/ibase_num_fields_001.phpt +++ b/ext/interbase/tests/ibase_num_fields_001.phpt @@ -18,8 +18,8 @@ var_dump(ibase_num_fields()); --EXPECTF-- int(2) -Warning: ibase_num_fields(): supplied argument is not a valid Firebird/InterBase result resource in %s on line %d -bool(false) - -Warning: Wrong parameter count for ibase_num_fields() in %s on line %d +Warning: ibase_num_fields() expects parameter 1 to be resource, integer given in %s on line %d +NULL + +Warning: ibase_num_fields() expects exactly 1 parameter, 0 given in %s on line %d NULL