abies Sun Aug 10 09:20:38 2003 EDT Modified files: /php-src/ext/interbase interbase.c Log: Changed ibase_query() to free transaction resource if SQL is COMMIT or ROLLBACK Index: php-src/ext/interbase/interbase.c diff -u php-src/ext/interbase/interbase.c:1.123 php-src/ext/interbase/interbase.c:1.124 --- php-src/ext/interbase/interbase.c:1.123 Fri Aug 8 09:47:20 2003 +++ php-src/ext/interbase/interbase.c Sun Aug 10 09:20:38 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: interbase.c,v 1.123 2003/08/08 13:47:20 abies Exp $ */ +/* $Id: interbase.c,v 1.124 2003/08/10 13:20:38 abies Exp $ */ /* TODO: Arrays, roles? @@ -246,27 +246,23 @@ static void _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAMETERS, zval **link_id, ibase_db_link **ib_link, ibase_trans **trans) { int type; - void *resource = NULL; IBDEBUG("Transaction or database link?"); - if ((resource = zend_list_find(Z_LVAL_PP(link_id), &type))) { - IBDEBUG("Found in list"); - if (type == le_trans) { - /* Transaction resource: make sure it refers to one link only, then - fetch it; database link is stored in ib_trans->db_link[]. */ - IBDEBUG("Type is le_trans"); - ZEND_FETCH_RESOURCE(*trans, ibase_trans *, link_id, -1, "InterBase transaction", le_trans); - if ((*trans)->link_cnt > 1) { - _php_ibase_module_error("Link id is ambiguous: transaction spans multiple connections."); - return; - } - *ib_link = (*trans)->db_link[0]; - } else { - IBDEBUG("Type is le_[p]link"); - /* Database link resource, use default transaction. */ - *trans = NULL; - ZEND_FETCH_RESOURCE2(*ib_link, ibase_db_link *, link_id, -1, "InterBase link", le_link, le_plink); - } + if (zend_list_find(Z_LVAL_PP(link_id), &type) && type == le_trans) { + /* Transaction resource: make sure it refers to one link only, then + fetch it; database link is stored in ib_trans->db_link[]. */ + IBDEBUG("Type is le_trans"); + ZEND_FETCH_RESOURCE(*trans, ibase_trans *, link_id, -1, "InterBase transaction", le_trans); + if ((*trans)->link_cnt > 1) { + _php_ibase_module_error("Link id is ambiguous: transaction spans multiple connections."); + return; + } + *ib_link = (*trans)->db_link[0]; + } else { + IBDEBUG("Type is le_[p]link or id not found"); + /* Database link resource, use default transaction. */ + *trans = NULL; + ZEND_FETCH_RESOURCE2(*ib_link, ibase_db_link *, link_id, -1, "InterBase link", le_link, le_plink); } } @@ -685,7 +681,7 @@ php_info_print_table_start(); php_info_print_table_row(2, "Interbase Support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 1.123 $"); + php_info_print_table_row(2, "Revision", "$Revision: 1.124 $"); #ifdef COMPILE_DL_INTERBASE php_info_print_table_row(2, "Dynamic Module", "Yes"); #endif @@ -1897,17 +1893,17 @@ } /* }}} */ -/* {{{ proto resource ibase_query([resource link_identifier [, string query [, int bind_args]]]) +/* {{{ proto resource ibase_query([resource link_identifier [, resource link_identifier ] ,] string query [, int bind_args]) Execute a query */ PHP_FUNCTION(ibase_query) { zval ***args, **bind_args = NULL; - int i, bind_n = 0; - char *query; + int i, bind_n = 0, trans_id = 0; + char *query, item_type[] = {isc_info_sql_stmt_type}, result[8]; ibase_db_link *ib_link = NULL; ibase_trans *trans = NULL; ibase_query *ib_query; - ibase_result *ib_result; + ibase_result *ib_result = NULL; RESET_ERRMSG; @@ -1988,11 +1984,21 @@ case 2: /* one id was passed, could be db or trans id */ _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, args[0], &ib_link, &trans); + + if (trans != NULL) { + /* argument was a trans id */ + convert_to_long_ex(args[0]); + trans_id = Z_LVAL_PP(args[0]); + } break; case 3: /* two ids were passed, first should be link and second should be trans; */ ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link*, args[0], -1, "InterBase link", le_link, le_plink); ZEND_FETCH_RESOURCE(trans, ibase_trans*, args[1], -1, "InterBase transaction", le_trans); + + convert_to_long_ex(args[1]); + trans_id = Z_LVAL_PP(args[1]); + break; default: /* more than two arguments preceed the SQL string */ @@ -2011,7 +2017,7 @@ } /* open default transaction */ - if (_php_ibase_def_trans(ib_link, &trans TSRMLS_CC) == FAILURE) { + if (ib_link == NULL || _php_ibase_def_trans(ib_link, &trans TSRMLS_CC) == FAILURE) { free_alloca(args); RETURN_FALSE; } @@ -2019,21 +2025,21 @@ if (_php_ibase_alloc_query(&ib_query, ib_link->link, trans->handle, query, ib_link->dialect TSRMLS_CC) == FAILURE) { free_alloca(args); RETURN_FALSE; - } else { + } - /* find out if the statement is a SET TRANSACTION, because we have to execute it - with a NULL trans handle */ - char item_type[] = {isc_info_sql_stmt_type}, result[8]; - - if (isc_dsql_sql_info(IB_STATUS, &ib_query->stmt, sizeof(item_type), item_type, sizeof(result), result)) { - _php_ibase_error(TSRMLS_C); - RETURN_FALSE; - } + /* find out if what kind of statement was prepared */ + if (isc_dsql_sql_info(IB_STATUS, &ib_query->stmt, sizeof(item_type), item_type, sizeof(result), result)) { + _php_ibase_error(TSRMLS_C); + RETURN_FALSE; + } - if (result[0] == isc_info_sql_stmt_type && - isc_vax_integer(&result[3], isc_vax_integer(&result[1],2)) == isc_info_sql_stmt_start_trans) { - - isc_tr_handle tr = NULL; + switch (result[3]) { + isc_tr_handle tr; + + case isc_info_sql_stmt_start_trans: + + /* a SET TRANSACTION statement should be executed with a NULL trans handle */ + tr = NULL; ibase_tr_list **l; if (isc_dsql_execute_immediate(IB_STATUS, &ib_link->link, &tr, 0, query, ib_link->dialect, NULL)) { @@ -2047,7 +2053,7 @@ trans->handle = tr; trans->link_cnt = 1; trans->db_link[0] = ib_link; - + if (ib_link->tr_list == NULL) { ib_link->tr_list = (ibase_tr_list *) emalloc(sizeof(ibase_tr_list)); ib_link->tr_list->trans = NULL; @@ -2059,21 +2065,38 @@ *l = (ibase_tr_list *) emalloc(sizeof(ibase_tr_list)); (*l)->trans = trans; (*l)->next = NULL; - + ZEND_REGISTER_RESOURCE(return_value, trans, le_trans); - + _php_ibase_free_query(ib_query TSRMLS_CC); free_alloca(args); return; - } - } - if (_php_ibase_exec(&ib_result, ib_query, bind_n, bind_args TSRMLS_CC) == FAILURE) { - _php_ibase_free_query(ib_query TSRMLS_CC); - free_alloca(args); - RETURN_FALSE; + case isc_info_sql_stmt_commit: + case isc_info_sql_stmt_rollback: + + if (isc_dsql_execute_immediate(IB_STATUS, &ib_link->link, &trans->handle, 0, query, ib_link->dialect, NULL)) { + _php_ibase_error(TSRMLS_C); + _php_ibase_free_query(ib_query TSRMLS_CC); + free_alloca(args); + RETURN_FALSE; + } + + if (trans->handle == NULL && trans_id != 0) { + /* transaction was a registered resource, so we have to release it */ + zend_list_delete(trans_id); + } + break; + + default: + + if (_php_ibase_exec(&ib_result, ib_query, bind_n, bind_args TSRMLS_CC) == FAILURE) { + _php_ibase_free_query(ib_query TSRMLS_CC); + free_alloca(args); + RETURN_FALSE; + } } - + free_alloca(args); if (ib_result) { /* select statement */ @@ -2175,7 +2198,7 @@ } } else { Z_STRLEN_P(val) = sprintf(string_data, "%.0" ISC_INT64_FORMAT "d", - (ISC_INT64) *(ISC_INT64 *) data); + *(ISC_INT64 *) data); } Z_STRVAL_P(val) = estrdup(string_data);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php