abies Wed Aug 20 15:47:01 2003 EDT Modified files: /php-src/ext/interbase php_interbase.h interbase.c Log: Reuse result data structure and resource id for consecutive executions of a prepared query # As previous resources are invalidated anyway because their statement # handle is reused, we don't have to allocate a new result for every # execution of a prepared query
Index: php-src/ext/interbase/php_interbase.h diff -u php-src/ext/interbase/php_interbase.h:1.55 php-src/ext/interbase/php_interbase.h:1.56 --- php-src/ext/interbase/php_interbase.h:1.55 Wed Aug 20 12:13:51 2003 +++ php-src/ext/interbase/php_interbase.h Wed Aug 20 15:47:00 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_interbase.h,v 1.55 2003/08/20 16:13:51 abies Exp $ */ +/* $Id: php_interbase.h,v 1.56 2003/08/20 19:47:00 abies Exp $ */ #ifndef PHP_INTERBASE_H #define PHP_INTERBASE_H @@ -144,13 +144,24 @@ typedef struct { ibase_db_link *link; ibase_trans *trans; + struct _ibase_query *query; + isc_stmt_handle stmt; + XSQLDA *out_sqlda; + ibase_array *out_array; + unsigned char has_more_rows; + char statement_type; +} ibase_result; + +typedef struct _ibase_query { + ibase_db_link *link; + ibase_trans *trans; + ibase_result *result; + int result_res_id; isc_stmt_handle stmt; - int drop_stmt; XSQLDA *in_sqlda, *out_sqlda; ibase_array *in_array, *out_array; int in_array_cnt, out_array_cnt; unsigned short dialect; - int cursor_open; char statement_type; char *query; int trans_res_id; @@ -158,18 +169,7 @@ typedef struct { ibase_db_link *link; - ibase_trans *trans; - isc_stmt_handle stmt; - int drop_stmt; - XSQLDA *out_sqlda; - ibase_array *out_array; - unsigned char has_more_rows; - char statement_type; -} ibase_result; - -typedef struct { int link_res_id; - ibase_db_link *link; ISC_LONG event_id; unsigned short event_count; char **events; Index: php-src/ext/interbase/interbase.c diff -u php-src/ext/interbase/interbase.c:1.158 php-src/ext/interbase/interbase.c:1.159 --- php-src/ext/interbase/interbase.c:1.158 Wed Aug 20 12:13:51 2003 +++ php-src/ext/interbase/interbase.c Wed Aug 20 15:47:00 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: interbase.c,v 1.158 2003/08/20 16:13:51 abies Exp $ */ +/* $Id: interbase.c,v 1.159 2003/08/20 19:47:00 abies Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -433,22 +433,11 @@ ibase_result *ib_result = (ibase_result *) rsrc->ptr; IBDEBUG("Freeing result by dtor..."); - if (ib_result) { + if (ib_result && ib_result->query == NULL) { /* doesn't belong to a query */ _php_ibase_free_xsqlda(ib_result->out_sqlda); - if (ib_result->drop_stmt && ib_result->stmt) { + if (ib_result->stmt) { IBDEBUG("Dropping statement handle (free_result dtor)..."); isc_dsql_free_statement(IB_STATUS, &ib_result->stmt, DSQL_drop); - } else { - /* Shouldn't be here unless query was select and had parameter - placeholders, in which case ibase_execute handles this??? - (Testing seems to confirm the decision was a right one.) - */ - IBDEBUG("Closing statement handle..."); - /* - if (isc_dsql_free_statement(IB_STATUS, &ib_result->stmt, DSQL_close)) { - _php_ibase_error(); - } - */ } if (ib_result->out_array) { efree(ib_result->out_array); @@ -471,6 +460,14 @@ } if (ib_query->stmt) { IBDEBUG("Dropping statement handle (free_query)..."); + if (ib_query->result) { + _php_ibase_free_xsqlda(ib_query->result->out_sqlda); + + if (ib_query->result->out_array) { + efree(ib_query->result->out_array); + } + efree(ib_query->result); + } if (isc_dsql_free_statement(IB_STATUS, &ib_query->stmt, DSQL_drop)) { _php_ibase_error(TSRMLS_C); } @@ -685,7 +682,7 @@ php_info_print_table_start(); php_info_print_table_row(2, "Interbase Support", "enabled"); - php_info_print_table_row(2, "Revision", "$Revision: 1.158 $"); + php_info_print_table_row(2, "Revision", "$Revision: 1.159 $"); #ifdef COMPILE_DL_INTERBASE php_info_print_table_row(2, "Dynamic Module", "Yes"); #endif @@ -1162,15 +1159,14 @@ ib_query->link = link; ib_query->trans = trans; + ib_query->result = NULL; + ib_query->result_res_id = 0; ib_query->stmt = NULL; - ib_query->out_sqlda = NULL; - ib_query->in_sqlda = NULL; ib_query->in_array = NULL; ib_query->in_array_cnt = 0; ib_query->out_array = NULL; ib_query->out_array_cnt = 0; ib_query->dialect = dialect; - ib_query->statement_type = '\0'; ib_query->query = estrdup(query); ib_query->trans_res_id = trans_res_id; @@ -1616,30 +1612,33 @@ /* allocate sqlda and output buffers */ if (ib_query->out_sqlda) { /* output variables in select, select for update */ IBDEBUG("Query wants XSQLDA for output"); - IB_RESULT = emalloc(sizeof(ibase_result)); - IB_RESULT->link = ib_query->link; - IB_RESULT->trans = ib_query->trans; - IB_RESULT->stmt = ib_query->stmt; - IB_RESULT->statement_type = ib_query->statement_type; - IB_RESULT->drop_stmt = 0; /* when free result close but not drop!*/ - - out_sqlda = IB_RESULT->out_sqlda = emalloc(XSQLDA_LENGTH(ib_query->out_sqlda->sqld)); - memcpy(out_sqlda, ib_query->out_sqlda, XSQLDA_LENGTH(ib_query->out_sqlda->sqld)); - _php_ibase_alloc_xsqlda(out_sqlda); - - if (ib_query->out_array) { - IB_RESULT->out_array = safe_emalloc(sizeof(ibase_array), ib_query->out_array_cnt, 0); - memcpy(IB_RESULT->out_array, ib_query->out_array, sizeof(ibase_array) * ib_query->out_array_cnt); - } else { - IB_RESULT->out_array = NULL; + if (IB_RESULT == NULL) { + IB_RESULT = emalloc(sizeof(ibase_result)); + IB_RESULT->link = ib_query->link; + IB_RESULT->trans = ib_query->trans; + IB_RESULT->stmt = ib_query->stmt; + IB_RESULT->statement_type = ib_query->statement_type; + IB_RESULT->out_sqlda = NULL; + + out_sqlda = IB_RESULT->out_sqlda = emalloc(XSQLDA_LENGTH(ib_query->out_sqlda->sqld)); + memcpy(out_sqlda, ib_query->out_sqlda, XSQLDA_LENGTH(ib_query->out_sqlda->sqld)); + _php_ibase_alloc_xsqlda(out_sqlda); + + if (ib_query->out_array) { + IB_RESULT->out_array = safe_emalloc(sizeof(ibase_array), ib_query->out_array_cnt, 0); + memcpy(IB_RESULT->out_array, ib_query->out_array, sizeof(ibase_array) * ib_query->out_array_cnt); + } else { + IB_RESULT->out_array = NULL; + } } + IB_RESULT->has_more_rows = 1; } if (ib_query->in_sqlda) { /* has placeholders */ IBDEBUG("Query wants XSQLDA for input"); if (ib_query->in_sqlda->sqld != argc) { _php_ibase_module_error("Placeholders (%d) and variables (%d) mismatch", ib_query->in_sqlda->sqld, argc); - goto _php_ibase_exec_error; /* yes mommy, goto! */ + goto _php_ibase_exec_error; } in_sqlda = emalloc(XSQLDA_LENGTH(ib_query->in_sqlda->sqld)); memcpy(in_sqlda, ib_query->in_sqlda, XSQLDA_LENGTH(ib_query->in_sqlda->sqld)); @@ -1660,7 +1659,6 @@ _php_ibase_error(TSRMLS_C); goto _php_ibase_exec_error; } - ib_query->trans->affected_rows = 0; switch (ib_query->statement_type) { @@ -2028,8 +2026,7 @@ int i, bind_n = 0, trans_res_id = 0; ibase_db_link *ib_link = NULL; ibase_trans *trans = NULL; - ibase_query ib_query; - ibase_result *ib_result = NULL; + ibase_query ib_query= { NULL, NULL, NULL, 0 }; char *query; RESET_ERRMSG; @@ -2154,7 +2151,7 @@ RETURN_FALSE; } - if (_php_ibase_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, &ib_result, &ib_query, bind_n, bind_args) == FAILURE) { + if (_php_ibase_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, &ib_query.result, &ib_query, bind_n, bind_args) == FAILURE) { _php_ibase_free_query(&ib_query TSRMLS_CC); free_alloca(args); RETURN_FALSE; @@ -2162,10 +2159,9 @@ free_alloca(args); - if (ib_result) { /* select statement */ - ib_result->drop_stmt = 1; /* drop stmt when free result */ - ib_result->has_more_rows = 1; - ZEND_REGISTER_RESOURCE(return_value, ib_result, le_result); + if (ib_query.result != NULL) { /* select statement */ + ib_query.result->query = NULL; /* drop stmt when free result */ + ZEND_REGISTER_RESOURCE(return_value, ib_query.result, le_result); ib_query.stmt = NULL; /* keep stmt when free query */ } @@ -2827,8 +2823,6 @@ efree(ib_query); RETURN_FALSE; } - ib_query->cursor_open = 0; - ZEND_REGISTER_RESOURCE(return_value, ib_query, le_query); } /* }}} */ @@ -2839,7 +2833,6 @@ { zval ***args, **bind_args = NULL; ibase_query *ib_query; - ibase_result *ib_result = NULL; RESET_ERRMSG; @@ -2861,14 +2854,14 @@ } /* Have we used this cursor before and it's still open? */ - if (ib_query->cursor_open) { + if (ib_query->result != NULL) { IBDEBUG("Implicitly closing a cursor"); if (isc_dsql_free_statement(IB_STATUS, &ib_query->stmt, DSQL_close)) { _php_ibase_error(TSRMLS_C); } } - - if (_php_ibase_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, &ib_result, ib_query, ZEND_NUM_ARGS() - 1, bind_args) == FAILURE) { + + if (_php_ibase_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, &ib_query->result, ib_query, ZEND_NUM_ARGS() - 1, bind_args) == FAILURE) { free_alloca(args); RETURN_FALSE; } @@ -2880,12 +2873,19 @@ free_alloca(args); - if (ib_result) { /* select statement */ - ib_query->cursor_open = 1; - ib_result->has_more_rows = 1; - ZEND_REGISTER_RESOURCE(return_value, ib_result, le_result); - } else { - ib_query->cursor_open = 0; + if (ib_query->result != NULL) { + int type; + + ib_query->result->query = ib_query; + + /* return the same resource at every execution if it hasn't been freed */ + if (ib_query->result_res_id == 0 || + !zend_list_find(ib_query->result_res_id, &type) || + type != le_result) { + + ib_query->result_res_id = zend_list_insert(ib_query->result, le_result); + } + RETURN_RESOURCE(ib_query->result_res_id); } } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php