cvs: php4 /ext/interbase interbase.c
| From: | Jouni Ahto | Date: | Sun, 09 Jul 2000 07:30:15 +0000 |
| Subject: | cvs: php4 /ext/interbase interbase.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-671@lists.php.net to get a copy of this message | ||
jah Sun Jul 9 00:30:15 2000 EDT
Modified files:
/php4/ext/interbase interbase.c
Log:
- I must be getting demented. Forgot to add and register list destructor
function when creating new list entry type. Several other modifications
too related to this. Blobs still not working.
Index: php4/ext/interbase/interbase.c
diff -u php4/ext/interbase/interbase.c:1.39 php4/ext/interbase/interbase.c:1.40
--- php4/ext/interbase/interbase.c:1.39 Fri Jul 7 05:06:05 2000
+++ php4/ext/interbase/interbase.c Sun Jul 9 00:30:15 2000
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: interbase.c,v 1.39 2000/07/07 12:06:05 jah Exp $ */
+/* $Id: interbase.c,v 1.40 2000/07/09 07:30:15 jah Exp $ */
/* TODO: Arrays, roles?
@@ -134,7 +134,7 @@
/* Fill ib_link and trans_n with the correct database link and transaction slot number. */
-static void get_link_trans(INTERNAL_FUNCTION_PARAMETERS, zval **link_id, ibase_db_link **ib_link,
int *trans_n) {
+static void get_link_trans(INTERNAL_FUNCTION_PARAMETERS, zval **link_id, ibase_db_link **ib_link,
int *trans_n, int *trans_id) {
int type;
void *resource = NULL;
ibase_tr_link *ib_trans;
@@ -142,14 +142,13 @@
IBDEBUG("Transaction or database link?");
if (Z_TYPE_PP(link_id) == IS_RESOURCE) {
- int trans = IBG(le_trans);
-
- if (resource = zend_list_find(Z_LVAL_PP(link_id), &type)) {
+ if ((resource = zend_list_find(Z_LVAL_PP(link_id), &type))) {
IBDEBUG("Found in list");
if (type == IBG(le_trans)) {
/* Transaction resource. Fetch it, database link resource
is stored in ib_trans->link_rsrc. */
IBDEBUG("Type is le_trans");
+ *trans_id = (Z_LVAL_PP(link_id));
ZEND_FETCH_RESOURCE(ib_trans, ibase_tr_link *, link_id, -1, "InterBase transaction",
IBG(le_trans));
*trans_n = ib_trans->trans_num;
ZEND_FETCH_RESOURCE2(resource, ibase_db_link *, link_id, ib_trans->link_rsrc,
"InterBase link", IBG(le_link), IBG(le_plink));
@@ -442,6 +441,30 @@
/* }}} */
+/* {{{ _php_ibase_free_trans() */
+static void _php_ibase_free_trans(ibase_tr_link *ib_trans)
+{
+ zval **dummy;
+ ibase_db_link *ib_link;
+ IBLS_FETCH();
+
+ ib_link = (ibase_db_link *) zend_fetch_resource(dummy, ib_trans->link_rsrc, "InterBase
link", NULL, 2, IBG(le_link), IBG(le_plink));
+
+ if (ib_link) {
+ if (ib_link->trans[ib_trans->trans_num] != NULL) {
+ IBDEBUG("Rolling back unhandled transaction...");
+ if (isc_rollback_transaction(IB_STATUS, &ib_link->trans[ib_trans->trans_num])) {
+ _php_ibase_error();
+ }
+ ib_link->trans[ib_trans->trans_num] = NULL;
+ }
+ }
+
+ efree(ib_trans);
+}
+/* }}} */
+
+
/* {{{ startup, shutdown and info functions */
PHP_INI_BEGIN()
STD_PHP_INI_BOOLEAN("ibase.allow_persistent", "1", PHP_INI_SYSTEM,
OnUpdateInt, allow_persistent, zend_ibase_globals, ibase_globals)
@@ -476,6 +499,7 @@
IBG(le_blob) = register_list_destructors(_php_ibase_free_blob, NULL);
IBG(le_link) = register_list_destructors(_php_ibase_close_link, NULL);
IBG(le_plink) = register_list_destructors(_php_ibase_commit_link, _php_ibase_close_plink);
+ IBG(le_trans) = register_list_destructors(_php_ibase_free_trans, NULL);
REGISTER_LONG_CONSTANT("IBASE_DEFAULT", PHP_IBASE_DEFAULT, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IBASE_TEXT", PHP_IBASE_TEXT, CONST_PERSISTENT);
@@ -557,7 +581,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "Interbase Support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision: 1.39 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.40 $");
#ifdef COMPILE_DL_INTERBASE
php_info_print_table_row(2, "Dynamic Module", "yes");
#endif
@@ -1489,7 +1513,7 @@
RETURN_FALSE;
}
- ib_trans = (ibase_tr_link *) malloc(sizeof(ibase_tr_link));
+ ib_trans = (ibase_tr_link *) emalloc(sizeof(ibase_tr_link));
ib_trans->trans_num = trans_n;
ib_trans->link_rsrc = link_id;
ZEND_REGISTER_RESOURCE(return_value, ib_trans, IBG(le_trans));
@@ -1519,8 +1543,8 @@
#define ROLLBACK 0
static void _php_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit)
{
- pval **link_trans_arg;
- int link_id = 0, trans_n = 0;
+ pval **link_trans_arg = NULL;
+ int link_id = 0, trans_n = 0, trans_id = 0;
ibase_db_link *ib_link;
IBLS_FETCH();
@@ -1535,13 +1559,18 @@
if (zend_get_parameters_ex(1, &link_trans_arg) == FAILURE) {
RETURN_FALSE;
}
- get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_trans_arg, &ib_link, &trans_n);
+ get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_trans_arg, &ib_link, &trans_n,
&trans_id);
break;
default:
WRONG_PARAM_COUNT;
break;
}
+ if (ib_link->trans[trans_n] == NULL) {
+ php_error(E_WARNING, "Trying to commit or rollback an already handled transaction");
+ RETURN_FALSE;
+ }
+
if (commit) {
if (isc_commit_transaction(IB_STATUS, &ib_link->trans[trans_n])) {
_php_ibase_error();
@@ -1554,6 +1583,11 @@
}
}
ib_link->trans[trans_n] = NULL;
+
+ /* Don't try to destroy imnplicitly opened transaction from list... */
+ if (trans_id) {
+ zend_list_delete(trans_id);
+ }
RETURN_TRUE;
}
@@ -1583,7 +1617,7 @@
PHP_FUNCTION(ibase_query)
{
pval ***args, **bind_args = NULL, **dummy = NULL;
- int i, link_id = 0, trans_n = 0, bind_n = 0;
+ int i, link_id = 0, trans_n = 0, bind_n = 0, trans_id = 0;
char *query;
ibase_db_link *ib_link;
ibase_query *ib_query;
@@ -1604,7 +1638,7 @@
i = 0;
if ((*args[i])->type == IS_RESOURCE) { /* link or transaction argument */
- get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, args[i], &ib_link, &trans_n);
+ get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, args[i], &ib_link, &trans_n,
&trans_id);
i++; /* next arg */
} else {
link_id = IBG(default_link);
@@ -2111,7 +2145,7 @@
PHP_FUNCTION(ibase_prepare)
{
zval **link_arg, **query_arg;
- int link_id, trans_n = 0;
+ int link_id, trans_n = 0, trans_id = 0;
ibase_db_link *ib_link;
ibase_query *ib_query;
char *query;
@@ -2131,7 +2165,7 @@
if (zend_get_parameters_ex(2, &link_arg, &query_arg) == FAILURE) {
RETURN_FALSE;
}
- get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans_n);
+ get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans_n,
&trans_id);
break;
default:
WRONG_PARAM_COUNT;
@@ -2463,7 +2497,7 @@
PHP_FUNCTION(ibase_blob_create)
{
zval **link_arg;
- int trans_n = 0, link_id;
+ int trans_n = 0, trans_id = 0, link_id;
ibase_db_link *ib_link;
ibase_blob_handle *ib_blob;
IBLS_FETCH();
@@ -2479,7 +2513,7 @@
if (zend_get_parameters_ex(1, &link_arg) == FAILURE) {
RETURN_FALSE;
}
- get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans_n);
+ get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans_n,
&trans_id);
break;
default:
WRONG_PARAM_COUNT;
@@ -2820,7 +2854,7 @@
PHP_FUNCTION(ibase_blob_import)
{
zval **link_arg, **file_arg;
- int trans_n, link_id = 0, size, b;
+ int trans_n = 0, link_id = 0, trans_id = 0, size, b;
int issock=0, socketd=0;
ibase_blob_handle ib_blob;
ibase_db_link *ib_link;
@@ -2836,13 +2870,12 @@
RETURN_FALSE;
}
link_id = IBG(default_link);
- ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, "InterBase link",
IBG(le_link), IBG(le_plink));
break;
case 2:
if (zend_get_parameters_ex(2, &link_arg, &file_arg) == FAILURE) {
RETURN_FALSE;
}
- get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans_n);
+ get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans_n,
&trans_id);
break;
default:
WRONG_PARAM_COUNT;