diff options
author | Jouni Ahto <jah@php.net> | 2000-06-24 16:24:29 +0000 |
---|---|---|
committer | Jouni Ahto <jah@php.net> | 2000-06-24 16:24:29 +0000 |
commit | 8f1ff9e85e7b717ea896a7ad4220e11f8980cfe1 (patch) | |
tree | e973c40b5853f5b72ac5010afe1926b7227f3d11 | |
parent | 303dc9e96a7b3a099bc9ea5b93ef6d6103ef3a7f (diff) | |
download | php-git-8f1ff9e85e7b717ea896a7ad4220e11f8980cfe1.tar.gz |
- Close cursor immediately before reuse so that calling ibase_free_result is
not necessary anymore. Seems to also prevent a a situation where at request
shutdown cursor was first dropped and tried to close it afterwards when
all the resources were not manually freed, and could occasionally segfault.
-rw-r--r-- | ext/interbase/interbase.c | 28 | ||||
-rw-r--r-- | ext/interbase/php_interbase.h | 1 |
2 files changed, 23 insertions, 6 deletions
diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c index 2c46cda538..a99211ab8e 100644 --- a/ext/interbase/interbase.c +++ b/ext/interbase/interbase.c @@ -356,10 +356,15 @@ static void _php_ibase_free_result(ibase_result *ib_result) _php_ibase_error(); } } else { + /* Shouldn't be here unless query was select and had parameter + placeholders, in which case ibase_execute handles this??? + */ 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); @@ -531,17 +536,17 @@ PHP_MINFO_FUNCTION(ibase) php_info_print_table_row(2, "Allow Persistent Links", (IBG(allow_persistent)?"Yes":"No") ); if (IBG(max_persistent) == -1) { - snprintf(tmp, 31, "%d/unlimited", IBG(num_persistent)); + snprintf(tmp, 31, "%ld/unlimited", IBG(num_persistent)); } else { - snprintf(tmp, 31, "%d/%ld", IBG(num_persistent), IBG(max_persistent)); + snprintf(tmp, 31, "%ld/%ld", IBG(num_persistent), IBG(max_persistent)); } tmp[31]=0; php_info_print_table_row(2, "Persistent Links", tmp ); if (IBG(max_links) == -1) { - snprintf(tmp, 31, "%d/unlimited", IBG(num_links)); + snprintf(tmp, 31, "%ld/unlimited", IBG(num_links)); } else { - snprintf(tmp, 31, "%d/%ld", IBG(num_links), IBG(max_links)); + snprintf(tmp, 31, "%ld/%ld", IBG(num_links), IBG(max_links)); } tmp[31]=0; php_info_print_table_row(2, "Total Links", tmp ); @@ -2128,6 +2133,7 @@ PHP_FUNCTION(ibase_prepare) if (_php_ibase_alloc_query(&ib_query, ib_link->link, ib_link->trans[trans_n], query, ib_link->dialect) == FAILURE) { RETURN_FALSE; } + ib_query->cursor_open = 0; zend_list_addref(link_id); @@ -2165,16 +2171,27 @@ PHP_FUNCTION(ibase_execute) bind_args = args[1]; } + /* Have we used this cursor before and it's still open? */ + if (ib_query->cursor_open) { + IBDEBUG("Implicitly closing a cursor"); + if (isc_dsql_free_statement(IB_STATUS, &ib_query->stmt, DSQL_close)){ + efree(args); + _php_ibase_error(); + } + } + if ( _php_ibase_exec(&ib_result, ib_query, ZEND_NUM_ARGS()-1, bind_args) == FAILURE) { efree(args); RETURN_FALSE; } efree(args); - + if (ib_result) { /* select statement */ + ib_query->cursor_open = 1; ZEND_REGISTER_RESOURCE(return_value, ib_result, IBG(le_result)); } else { + ib_query->cursor_open = 0; RETURN_TRUE; } } @@ -2268,7 +2285,6 @@ PHP_FUNCTION(ibase_timefmt) PHP_FUNCTION(ibase_num_fields) { pval **result; - int type; ibase_result *ib_result; diff --git a/ext/interbase/php_interbase.h b/ext/interbase/php_interbase.h index ba0a27c9c4..a534907e1d 100644 --- a/ext/interbase/php_interbase.h +++ b/ext/interbase/php_interbase.h @@ -122,6 +122,7 @@ typedef struct { ibase_array *in_array, *out_array; int in_array_cnt, out_array_cnt; int dialect; + int cursor_open; } ibase_query; typedef struct { |