diff options
Diffstat (limited to 'ext/interbase')
-rw-r--r-- | ext/interbase/ibase_events.c | 75 | ||||
-rw-r--r-- | ext/interbase/ibase_query.c | 260 | ||||
-rw-r--r-- | ext/interbase/ibase_service.c | 9 | ||||
-rw-r--r-- | ext/interbase/interbase.c | 193 | ||||
-rwxr-xr-x | ext/interbase/tests/interbase.inc | 3 |
5 files changed, 312 insertions, 228 deletions
diff --git a/ext/interbase/ibase_events.c b/ext/interbase/ibase_events.c index 64842dd505..b4c204ba26 100644 --- a/ext/interbase/ibase_events.c +++ b/ext/interbase/ibase_events.c @@ -126,9 +126,8 @@ static void _php_ibase_event_block(ibase_db_link *ib_link, unsigned short count, Waits for any one of the passed Interbase events to be posted by the database, and returns its name */ PHP_FUNCTION(ibase_wait_event) { - zval ***args; + zval **args[16]; ibase_db_link *ib_link; - int num_args; char *event_buffer, *result_buffer, *events[15]; unsigned short i = 0, event_count = 0, buffer_size; unsigned long occurred_event[15]; @@ -140,25 +139,22 @@ PHP_FUNCTION(ibase_wait_event) WRONG_PARAM_COUNT; } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &num_args) == FAILURE) { - return; + if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) { + RETURN_FALSE; } if (Z_TYPE_PP(args[0]) == IS_RESOURCE) { - if (!ZEND_FETCH_RESOURCE2_NO_RETURN(ib_link, ibase_db_link *, args[0], -1, "InterBase link", le_link, le_plink)) { - efree(args); - RETURN_FALSE; - } + + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, args[0], -1, "InterBase link", le_link, le_plink); i = 1; + } else { + if (ZEND_NUM_ARGS() > 15) { - efree(args); WRONG_PARAM_COUNT; } - if (!ZEND_FETCH_RESOURCE2_NO_RETURN(ib_link, ibase_db_link *, NULL, IBG(default_link), "InterBase link", le_link, le_plink)) { - efree(args); - RETURN_FALSE; - } + + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link), "InterBase link", le_link, le_plink); } for (; i < ZEND_NUM_ARGS(); ++i) { @@ -173,7 +169,6 @@ PHP_FUNCTION(ibase_wait_event) if (isc_wait_for_event(IB_STATUS, &ib_link->handle, buffer_size, event_buffer, result_buffer)) { _php_ibase_error(TSRMLS_C); _php_ibase_event_free(event_buffer,result_buffer); - efree(args); RETURN_FALSE; } @@ -183,7 +178,6 @@ PHP_FUNCTION(ibase_wait_event) if (occurred_event[i]) { char *result = estrdup(events[i]); _php_ibase_event_free(event_buffer,result_buffer); - efree(args); RETURN_STRING(result,0); } } @@ -191,7 +185,6 @@ PHP_FUNCTION(ibase_wait_event) /* If we reach this line, isc_wait_for_event() did return, but we don't know which event fired. */ _php_ibase_event_free(event_buffer,result_buffer); - efree(args); RETURN_FALSE; } /* }}} */ @@ -267,71 +260,55 @@ PHP_FUNCTION(ibase_set_event_handler) * link resource id (int) as arguments. The value returned from the function is * used to determine if the event handler should remain set. */ - char *cb_name; - zval ***args, **cb_arg; + + zval **args[17], **cb_arg; ibase_db_link *ib_link; ibase_event *event; unsigned short i = 1, buffer_size; - int link_res_id, num_args; + int link_res_id; RESET_ERRMSG; - - /* Minimum and maximum number of arguments allowed */ + + /* no more than 15 events */ if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 17) { WRONG_PARAM_COUNT; } - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &num_args) == FAILURE) { - return; + if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) { + RETURN_FALSE; } /* get a working link */ if (Z_TYPE_PP(args[0]) != IS_STRING) { - /* resource, callback, event_1 [, ... event_15] - * No more than 15 events - */ - if (ZEND_NUM_ARGS() < 3 || ZEND_NUM_ARGS() > 17) { - efree(args); - WRONG_PARAM_COUNT; - } cb_arg = args[1]; i = 2; - if (!ZEND_FETCH_RESOURCE2_NO_RETURN(ib_link, ibase_db_link *, args[0], -1, "InterBase link", le_link, le_plink)) { - efree(args); - RETURN_FALSE; - } + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, args[0], -1, + "InterBase link", le_link, le_plink); convert_to_long_ex(args[0]); link_res_id = Z_LVAL_PP(args[0]); } else { - /* callback, event_1 [, ... event_15] - * No more than 15 events - */ - if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 16) { - efree(args); + + if (ZEND_NUM_ARGS() > 16) { WRONG_PARAM_COUNT; } cb_arg = args[0]; - if (!ZEND_FETCH_RESOURCE2_NO_RETURN(ib_link, ibase_db_link *, NULL, IBG(default_link), "InterBase link", le_link, le_plink)) { - efree(args); - RETURN_FALSE; - } + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link), + "InterBase link", le_link, le_plink); link_res_id = IBG(default_link); } /* get the callback */ - if (!zend_is_callable(*cb_arg, 0, &cb_name TSRMLS_CC)) { - _php_ibase_module_error("Callback argument %s is not a callable function" TSRMLS_CC, cb_name); - efree(cb_name); - efree(args); + if (!zend_is_callable(*cb_arg, 0, NULL TSRMLS_CC)) { + _php_ibase_module_error("Callback argument %s is not a callable function" + TSRMLS_CC, Z_STRVAL_PP(cb_arg)); RETURN_FALSE; } - efree(cb_name); /* allocate the event resource */ event = (ibase_event *) safe_emalloc(sizeof(ibase_event), 1, 0); @@ -362,7 +339,6 @@ PHP_FUNCTION(ibase_set_event_handler) _php_ibase_error(TSRMLS_C); efree(event); - efree(args); RETURN_FALSE; } @@ -371,7 +347,6 @@ PHP_FUNCTION(ibase_set_event_handler) ZEND_REGISTER_RESOURCE(return_value, event, le_event); zend_list_addref(Z_LVAL_P(return_value)); - efree(args); } /* }}} */ diff --git a/ext/interbase/ibase_query.c b/ext/interbase/ibase_query.c index 9bc7b5102b..5f24ff84ec 100644 --- a/ext/interbase/ibase_query.c +++ b/ext/interbase/ibase_query.c @@ -1070,7 +1070,7 @@ PHP_FUNCTION(ibase_query) { zval *zlink, *ztrans, ***bind_args = NULL; char *query; - int bind_i, query_len, bind_num; + int bind_i, query_len; long trans_res_id = 0; ibase_db_link *ib_link = NULL; ibase_trans *trans = NULL; @@ -1176,9 +1176,11 @@ PHP_FUNCTION(ibase_query) if (bind_n < expected_n) { break; } - } else if (bind_n > 0) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &bind_args, &bind_num) == FAILURE) { - return; + } else if (bind_n > 0) { + bind_args = (zval ***) safe_emalloc(sizeof(zval **), ZEND_NUM_ARGS(), 0); + + if (FAILURE == zend_get_parameters_array_ex(ZEND_NUM_ARGS(), bind_args)) { + break; } } @@ -1211,32 +1213,42 @@ 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; - } - 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); + switch (ZEND_NUM_ARGS()) { + + 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); } @@ -1267,20 +1279,21 @@ 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_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result_arg) == FAILURE) { - return; + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result_arg) == FAILURE) { + WRONG_PARAM_COUNT; } - 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; } @@ -1488,24 +1501,40 @@ 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; + zval **result_arg, **flag_arg; long i, array_cnt = 0, flag = 0; ibase_result *ib_result; RESET_ERRMSG; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &result_arg, &flag)) { - return; + 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; } - 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); @@ -1700,20 +1729,19 @@ PHP_FUNCTION(ibase_fetch_object) Assign a name to a result for use with ... WHERE CURRENT OF <name> statements */ PHP_FUNCTION(ibase_name_result) { - zval *result_arg; - char *name_arg; - int name_arg_len; + zval **result_arg, **name_arg; ibase_result *ib_result; RESET_ERRMSG; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &result_arg, &name_arg, &name_arg_len) == FAILURE) { - return; + if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &result_arg, &name_arg) == FAILURE) { + WRONG_PARAM_COUNT; } - 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); + convert_to_string_ex(name_arg); - if (isc_dsql_set_cursor_name(IB_STATUS, &ib_result->stmt, name_arg, 0)) { + if (isc_dsql_set_cursor_name(IB_STATUS, &ib_result->stmt, Z_STRVAL_PP(name_arg), 0)) { _php_ibase_error(TSRMLS_C); RETURN_FALSE; } @@ -1726,64 +1754,81 @@ 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_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result_arg) == FAILURE) { - return; + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result_arg) == FAILURE) { + WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(ib_result, ibase_result *, &result_arg, -1, LE_RESULT, le_result); - zend_list_delete(Z_RESVAL_P(result_arg)); + ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result_arg, -1, LE_RESULT, le_result); + zend_list_delete(Z_LVAL_PP(result_arg)); RETURN_TRUE; } /* }}} */ -/* {{{ proto resource ibase_prepare(resource link_identifier[, string query [, resource trans_identifier ]]) +/* {{{ proto resource ibase_prepare([resource link_identifier, ] string query) Prepare a query for later execution */ PHP_FUNCTION(ibase_prepare) { - zval *link_arg, *trans_arg; + zval **link_arg, **trans_arg, **query_arg; ibase_db_link *ib_link; ibase_trans *trans = NULL; - int query_len, trans_res_id = 0; + int 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); - 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); + 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; } + 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; } @@ -1817,17 +1862,16 @@ PHP_FUNCTION(ibase_execute) if (bind_n != expected_n) { php_error_docref(NULL TSRMLS_CC, (bind_n < expected_n) ? E_WARNING : E_NOTICE, "Statement expects %d arguments, %d given", expected_n, bind_n); - if (bind_n < expected_n) { break; } - } - /* have variables to bind */ - args = (zval ***) do_alloca((expected_n + 1) * sizeof(zval **), use_heap); + } else if (bind_n > 0) { /* have variables to bind */ + args = (zval ***) do_alloca(ZEND_NUM_ARGS() * sizeof(zval **), use_heap); - if (FAILURE == zend_get_parameters_array_ex((expected_n + 1), args)) { - break; + if (FAILURE == zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args)) { + break; + } } /* Have we used this cursor before and it's still open (exec proc has no cursor) ? */ @@ -1873,17 +1917,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_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &query_arg) == FAILURE) { - return; + if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &query_arg) == FAILURE) { + WRONG_PARAM_COUNT; } - ZEND_FETCH_RESOURCE(ib_query, ibase_query *, &query_arg, -1, LE_QUERY, le_query); - zend_list_delete(Z_RESVAL_P(query_arg)); + ZEND_FETCH_RESOURCE(ib_query, ibase_query *, query_arg, -1, LE_QUERY, le_query); + zend_list_delete(Z_LVAL_PP(query_arg)); RETURN_TRUE; } /* }}} */ @@ -1892,29 +1936,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_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) { - return; + if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &result)==FAILURE) { + WRONG_PARAM_COUNT; } - zend_list_find(Z_RESVAL_P(result), &type); + zend_list_find(Z_LVAL_PP(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); @@ -2015,28 +2059,27 @@ static void _php_ibase_field_info(zval *return_value, XSQLVAR *var) /* {{{ */ Get information about a field */ PHP_FUNCTION(ibase_field_info) { - zval *result_arg; - long field_arg; + zval **result_arg, **field_arg; int type; XSQLDA *sqlda; RESET_ERRMSG; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result_arg, &field_arg) == FAILURE) { - return; + if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &result_arg, &field_arg)==FAILURE) { + WRONG_PARAM_COUNT; } - zend_list_find(Z_RESVAL_P(result_arg), &type); + zend_list_find(Z_LVAL_PP(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; } @@ -2045,10 +2088,12 @@ PHP_FUNCTION(ibase_field_info) RETURN_FALSE; } - if (field_arg < 0 || field_arg >= sqlda->sqld) { + convert_to_long_ex(field_arg); + + if (Z_LVAL_PP(field_arg) < 0 || Z_LVAL_PP(field_arg) >= sqlda->sqld) { RETURN_FALSE; } - _php_ibase_field_info(return_value, sqlda->sqlvar + field_arg); + _php_ibase_field_info(return_value,sqlda->sqlvar + Z_LVAL_PP(field_arg)); } /* }}} */ @@ -2056,16 +2101,16 @@ PHP_FUNCTION(ibase_field_info) Get the number of params in a prepared query */ PHP_FUNCTION(ibase_num_params) { - zval *result; + zval **result; ibase_query *ib_query; RESET_ERRMSG; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) { - return; + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result) == FAILURE) { + WRONG_PARAM_COUNT; } - 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); if (ib_query->in_sqlda == NULL) { RETURN_LONG(0); @@ -2079,27 +2124,28 @@ PHP_FUNCTION(ibase_num_params) Get information about a parameter */ PHP_FUNCTION(ibase_param_info) { - zval *result_arg; - long field_arg; + zval **result_arg, **field_arg; ibase_query *ib_query; RESET_ERRMSG; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result_arg, &field_arg) == FAILURE) { - return; + if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &result_arg, &field_arg) == FAILURE) { + WRONG_PARAM_COUNT; } - 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); if (ib_query->in_sqlda == NULL) { RETURN_FALSE; } - if (field_arg < 0 || field_arg >= ib_query->in_sqlda->sqld) { + convert_to_long_ex(field_arg); + + if (Z_LVAL_PP(field_arg) < 0 || Z_LVAL_PP(field_arg) >= ib_query->in_sqlda->sqld) { RETURN_FALSE; } - _php_ibase_field_info(return_value,ib_query->in_sqlda->sqlvar + field_arg); + _php_ibase_field_info(return_value,ib_query->in_sqlda->sqlvar + Z_LVAL_PP(field_arg)); } /* }}} */ diff --git a/ext/interbase/ibase_service.c b/ext/interbase/ibase_service.c index 087ebaca52..9107ae6634 100644 --- a/ext/interbase/ibase_service.c +++ b/ext/interbase/ibase_service.c @@ -229,7 +229,8 @@ PHP_FUNCTION(ibase_service_attach) user, isc_spb_password, (char)plen, pass, host); if (spb_len > sizeof(buf) || spb_len == -1) { - _php_ibase_module_error("Internal error: insufficient buffer space for SPB (%d)" TSRMLS_CC, spb_len); + _php_ibase_module_error("Internal error: insufficient buffer space for SPB (%ld)" + TSRMLS_CC, spb_len); RETURN_FALSE; } @@ -450,7 +451,8 @@ static void _php_ibase_backup_restore(INTERNAL_FUNCTION_PARAMETERS, char operati } if (spb_len > sizeof(buf) || spb_len <= 0) { - _php_ibase_module_error("Internal error: insufficient buffer space for SPB (%d)" TSRMLS_CC, spb_len); + _php_ibase_module_error("Internal error: insufficient buffer space for SPB (%ld)" + TSRMLS_CC, spb_len); RETURN_FALSE; } @@ -558,7 +560,8 @@ options_argument: } if (spb_len > sizeof(buf) || spb_len == -1) { - _php_ibase_module_error("Internal error: insufficient buffer space for SPB (%d)" TSRMLS_CC, spb_len); + _php_ibase_module_error("Internal error: insufficient buffer space for SPB (%ld)" + TSRMLS_CC, spb_len); RETURN_FALSE; } diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c index 4c769c39e0..63f440223e 100644 --- a/ext/interbase/interbase.c +++ b/ext/interbase/interbase.c @@ -43,18 +43,19 @@ #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); /* {{{ arginfo */ +static ZEND_BEGIN_ARG_INFO(arginfo_ibase_errmsg, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO(arginfo_ibase_errcode, 0) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_connect, 0, 0, 1) ZEND_ARG_INFO(0, database) ZEND_ARG_INFO(0, username) @@ -65,6 +66,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_connect, 0, 0, 1) ZEND_ARG_INFO(0, role) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_pconnect, 0, 0, 1) ZEND_ARG_INFO(0, database) ZEND_ARG_INFO(0, username) @@ -75,14 +77,17 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_pconnect, 0, 0, 1) ZEND_ARG_INFO(0, role) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_close, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_drop_db, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_trans, 0, 0, 0) ZEND_ARG_INFO(0, trans_args) ZEND_ARG_INFO(0, link_identifier) @@ -90,70 +95,85 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_trans, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_commit, 0, 0, 1) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_rollback, 0, 0, 1) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_commit_ret, 0, 0, 1) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_rollback_ret, 0, 0, 1) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_gen_id, 0, 0, 1) ZEND_ARG_INFO(0, generator) ZEND_ARG_INFO(0, increment) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_blob_create, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_blob_open, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, blob_id) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_blob_add, 0, 0, 2) ZEND_ARG_INFO(0, blob_handle) ZEND_ARG_INFO(0, data) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_blob_get, 0, 0, 2) ZEND_ARG_INFO(0, blob_handle) ZEND_ARG_INFO(0, len) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_blob_close, 0, 0, 1) ZEND_ARG_INFO(0, blob_handle) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_blob_cancel, 0, 0, 1) ZEND_ARG_INFO(0, blob_handle) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_blob_info, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, blob_id) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_blob_echo, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, blob_id) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_blob_import, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, file) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_query, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, link_identifier) @@ -162,73 +182,88 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_query, 0, 0, 0) ZEND_ARG_INFO(0, bind_arg) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_affected_rows, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_END_ARG_INFO() #if abies_0 +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_num_rows, 0, 0, 1) ZEND_ARG_INFO(0, result_identifier) ZEND_END_ARG_INFO() #endif +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_fetch_row, 0, 0, 1) ZEND_ARG_INFO(0, result) ZEND_ARG_INFO(0, fetch_flags) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_fetch_assoc, 0, 0, 1) ZEND_ARG_INFO(0, result) ZEND_ARG_INFO(0, fetch_flags) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_fetch_object, 0, 0, 1) ZEND_ARG_INFO(0, result) ZEND_ARG_INFO(0, fetch_flags) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_name_result, 0, 0, 2) ZEND_ARG_INFO(0, result) ZEND_ARG_INFO(0, name) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_free_result, 0, 0, 1) ZEND_ARG_INFO(0, result) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_prepare, 0, 0, 0) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, query) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_execute, 0, 0, 1) ZEND_ARG_INFO(0, query) ZEND_ARG_INFO(0, bind_arg) ZEND_ARG_INFO(0, bind_arg) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_free_query, 0, 0, 1) ZEND_ARG_INFO(0, query) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_num_fields, 0, 0, 1) ZEND_ARG_INFO(0, query_result) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_field_info, 0, 0, 2) ZEND_ARG_INFO(0, query_result) ZEND_ARG_INFO(0, field_number) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_num_params, 0, 0, 1) ZEND_ARG_INFO(0, query) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_param_info, 0, 0, 2) ZEND_ARG_INFO(0, query) ZEND_ARG_INFO(0, field_number) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_add_user, 0, 0, 3) ZEND_ARG_INFO(0, service_handle) ZEND_ARG_INFO(0, user_name) @@ -238,6 +273,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_add_user, 0, 0, 3) ZEND_ARG_INFO(0, last_name) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_modify_user, 0, 0, 3) ZEND_ARG_INFO(0, service_handle) ZEND_ARG_INFO(0, user_name) @@ -247,6 +283,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_modify_user, 0, 0, 3) ZEND_ARG_INFO(0, last_name) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_delete_user, 0, 0, 3) ZEND_ARG_INFO(0, service_handle) ZEND_ARG_INFO(0, user_name) @@ -256,16 +293,19 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_delete_user, 0, 0, 3) ZEND_ARG_INFO(0, last_name) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_service_attach, 0, 0, 3) ZEND_ARG_INFO(0, host) ZEND_ARG_INFO(0, dba_username) ZEND_ARG_INFO(0, dba_password) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_service_detach, 0, 0, 1) ZEND_ARG_INFO(0, service_handle) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_backup, 0, 0, 3) ZEND_ARG_INFO(0, service_handle) ZEND_ARG_INFO(0, source_db) @@ -274,6 +314,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_backup, 0, 0, 3) ZEND_ARG_INFO(0, verbose) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_restore, 0, 0, 3) ZEND_ARG_INFO(0, service_handle) ZEND_ARG_INFO(0, source_file) @@ -282,6 +323,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_restore, 0, 0, 3) ZEND_ARG_INFO(0, verbose) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_maintain_db, 0, 0, 3) ZEND_ARG_INFO(0, service_handle) ZEND_ARG_INFO(0, db) @@ -289,6 +331,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_maintain_db, 0, 0, 3) ZEND_ARG_INFO(0, argument) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_db_info, 0, 0, 3) ZEND_ARG_INFO(0, service_handle) ZEND_ARG_INFO(0, db) @@ -296,17 +339,20 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_db_info, 0, 0, 3) ZEND_ARG_INFO(0, argument) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_server_info, 0, 0, 2) ZEND_ARG_INFO(0, service_handle) ZEND_ARG_INFO(0, action) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_wait_event, 0, 0, 1) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, event) ZEND_ARG_INFO(0, event2) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_set_event_handler, 0, 0, 2) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, handler) @@ -314,6 +360,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_set_event_handler, 0, 0, 2) ZEND_ARG_INFO(0, event2) ZEND_END_ARG_INFO() +static ZEND_BEGIN_ARG_INFO_EX(arginfo_ibase_free_event_handler, 0, 0, 1) ZEND_ARG_INFO(0, event) ZEND_END_ARG_INFO() @@ -1051,25 +1098,30 @@ PHP_FUNCTION(ibase_pconnect) Close an InterBase connection */ PHP_FUNCTION(ibase_close) { - zval *link_arg = NULL; + zval **link_arg = NULL; ibase_db_link *ib_link; int link_id; RESET_ERRMSG; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &link_arg) == FAILURE) { - return; - } - - 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); + switch (ZEND_NUM_ARGS()) { + case 0: + link_id = IBG(default_link); + IBG(default_link) = -1; + break; + case 1: + if (zend_get_parameters_ex(1, &link_arg) == FAILURE) { + RETURN_FALSE; + } + convert_to_long_ex(link_arg); + link_id = Z_LVAL_PP(link_arg); + break; + default: + WRONG_PARAM_COUNT; + break; } - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, &link_arg, link_id, LE_LINK, le_link, le_plink); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, LE_LINK, le_link, le_plink); zend_list_delete(link_id); RETURN_TRUE; } @@ -1079,26 +1131,31 @@ PHP_FUNCTION(ibase_close) Drop an InterBase database */ PHP_FUNCTION(ibase_drop_db) { - zval *link_arg = NULL; + zval **link_arg = NULL; ibase_db_link *ib_link; ibase_tr_list *l; int link_id; RESET_ERRMSG; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &link_arg) == FAILURE) { - return; - } - - 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); + + switch (ZEND_NUM_ARGS()) { + case 0: + link_id = IBG(default_link); + IBG(default_link) = -1; + break; + case 1: + if (zend_get_parameters_ex(1, &link_arg) == FAILURE) { + RETURN_FALSE; + } + convert_to_long_ex(link_arg); + link_id = Z_LVAL_PP(link_arg); + break; + default: + WRONG_PARAM_COUNT; + break; } - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, &link_arg, link_id, LE_LINK, le_link, le_plink); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, LE_LINK, le_link, le_plink); if (isc_drop_database(IB_STATUS, &ib_link->handle)) { _php_ibase_error(TSRMLS_C); @@ -1140,9 +1197,9 @@ PHP_FUNCTION(ibase_trans) long trans_argl = 0; char *tpb; ISC_TEB *teb; - zval ***args = NULL; + zval ***args = (zval ***) safe_emalloc(sizeof(zval **),argn,0); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &argn) == FAILURE) { + if (zend_get_parameters_array_ex(argn, args) == FAILURE) { efree(args); efree(ib_link); RETURN_FALSE; @@ -1157,13 +1214,8 @@ PHP_FUNCTION(ibase_trans) if (Z_TYPE_PP(args[i]) == IS_RESOURCE) { - if (!ZEND_FETCH_RESOURCE2_NO_RETURN(ib_link[link_cnt], ibase_db_link *, args[i], -1, LE_LINK, le_link, le_plink)) { - efree(teb); - efree(tpb); - efree(ib_link); - efree(args); - RETURN_FALSE; - } + ZEND_FETCH_RESOURCE2(ib_link[link_cnt], ibase_db_link *, args[i], -1, + LE_LINK, le_link, le_plink); /* copy the most recent modifier string into tbp[] */ memcpy(&tpb[TPB_MAX_SIZE * link_cnt], last_tpb, TPB_MAX_SIZE); @@ -1227,10 +1279,8 @@ PHP_FUNCTION(ibase_trans) if (link_cnt == 0) { link_cnt = 1; - if (!ZEND_FETCH_RESOURCE2_NO_RETURN(ib_link[0], ibase_db_link *, NULL, IBG(default_link), LE_LINK, le_link, le_plink)) { - efree(ib_link); - RETURN_FALSE; - } + ZEND_FETCH_RESOURCE2(ib_link[0], ibase_db_link *, NULL, IBG(default_link), LE_LINK, + le_link, le_plink); result = isc_start_transaction(IB_STATUS, &tr_handle, 1, &ib_link[0]->handle, tpb_len, last_tpb); } @@ -1310,42 +1360,55 @@ static void _php_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit) /* {{ ibase_trans *trans = NULL; int res_id = 0; ISC_STATUS result; - ibase_db_link *ib_link; - zval *arg = NULL; - int type; RESET_ERRMSG; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &arg) == FAILURE) { - return; - } - 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) { - /* this link doesn't have a default transaction */ - _php_ibase_module_error("Default link has no default transaction" TSRMLS_CC); - RETURN_FALSE; - } - trans = ib_link->tr_list->trans; - } else { - /* one id was passed, could be db or trans id */ - if (zend_list_find(Z_RESVAL_P(arg), &type) && type == le_trans) { - ZEND_FETCH_RESOURCE(trans, ibase_trans *, &arg, -1, LE_TRANS, le_trans); - res_id = Z_RESVAL_P(arg); - } else { - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, &arg, -1, LE_LINK, le_link, le_plink); + switch (ZEND_NUM_ARGS()) { + + ibase_db_link *ib_link; + zval **arg; + int type; + 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) { /* this link doesn't have a default transaction */ - _php_ibase_module_error("Link has no default transaction" TSRMLS_CC); + _php_ibase_module_error("Default link has no default transaction" TSRMLS_CC); 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 */ + if (zend_list_find(Z_LVAL_PP(arg), &type) && type == le_trans) { + ZEND_FETCH_RESOURCE(trans, ibase_trans *, arg, -1, LE_TRANS, le_trans); + + convert_to_long_ex(arg); + res_id = Z_LVAL_PP(arg); + } else { + 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) { + /* this link doesn't have a default transaction */ + _php_ibase_module_error("Link has no default transaction" TSRMLS_CC); + RETURN_FALSE; + } + trans = ib_link->tr_list->trans; + } + break; + + default: + WRONG_PARAM_COUNT; + break; } switch (commit) { + default: /* == case ROLLBACK: */ result = isc_rollback_transaction(IB_STATUS, &trans->handle); break; @@ -1366,7 +1429,7 @@ static void _php_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit) /* {{ } /* Don't try to destroy implicitly opened transaction from list... */ - if ((commit & RETAIN) == 0 && res_id != 0) { + if ( (commit & RETAIN) == 0 && res_id != 0) { zend_list_delete(res_id); } RETURN_TRUE; diff --git a/ext/interbase/tests/interbase.inc b/ext/interbase/tests/interbase.inc index 42eb6e5915..1401d9b821 100755 --- a/ext/interbase/tests/interbase.inc +++ b/ext/interbase/tests/interbase.inc @@ -104,9 +104,6 @@ function rand_number($len , $prec = -1, $sign = 1) } } else if ($prec == 0) { $n = substr(rand() . rand(), 0, rand() % $len + 1); - } else if (($prec - $len) == 0) { - $n = substr(rand() . rand(), 0, 1); - $n .= "." . substr(rand(), 0, $prec); } else { $n = substr(rand() . rand(), 0, rand() % ($len - $prec) + 1); $n .= "." . substr(rand(), 0, $prec); |