abies Fri Aug 8 09:47:20 2003 EDT
Modified files:
/php-src/ext/interbase interbase.c
Log:
Changes ibase_query() to support SET TRANSACTION statements
@- Added support for SET TRANSACTION statements in ibase_query() (Ard)
Index: php-src/ext/interbase/interbase.c
diff -u php-src/ext/interbase/interbase.c:1.122 php-src/ext/interbase/interbase.c:1.123
--- php-src/ext/interbase/interbase.c:1.122 Fri Aug 8 07:04:12 2003
+++ php-src/ext/interbase/interbase.c Fri Aug 8 09:47:20 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: interbase.c,v 1.122 2003/08/08 11:04:12 abies Exp $ */
+/* $Id: interbase.c,v 1.123 2003/08/08 13:47:20 abies Exp $ */
/* TODO: Arrays, roles?
@@ -685,7 +685,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "Interbase Support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision: 1.122 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.123 $");
#ifdef COMPILE_DL_INTERBASE
php_info_print_table_row(2, "Dynamic Module", "Yes");
#endif
@@ -1801,7 +1801,7 @@
case 0:
ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL,
IBG(default_link), "InterBase link", le_link, le_plink);
- if (ib_link->tr_list == NULL) {
+ 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");
RETURN_FALSE;
@@ -1992,45 +1992,6 @@
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);
-
-#if abies_0
- /* as yet undocumented: passing a non-resource as trans
argument allows SET TRANSACTION stmt */
- if (Z_TYPE_PP(args[1]) != IS_RESOURCE) {
- isc_tr_handle tr = NULL;
-
- if (isc_dsql_execute_immediate(IB_STATUS,
&ib_link->link, &tr, 0, query, SQL_DIALECT_CURRENT, NULL)) {
- _php_ibase_error(TSRMLS_C);
- free_alloca(args);
- RETURN_FALSE;
- }
- if (tr != NULL) {
- ibase_tr_list **l;
-
- trans = (ibase_trans *)
emalloc(sizeof(ibase_trans));
- trans->handle = tr;
- trans->link_cnt = 1;
- trans->db_link[0] = ib_link;
-
- if (ib_link->trans == NULL) {
- ib_link->trans = (ibase_tr_list *)
emalloc(sizeof(ibase_tr_list));
- ib_link->trans->trans = NULL;
- ib_link->trans->next = NULL;
- }
-
- /* link the transaction into the
connection-transaction list */
- for (l = &ib_link->trans; *l != NULL; l =
&(*l)->next);
- *l = (ibase_tr_list *)
emalloc(sizeof(ibase_tr_list));
- (*l)->trans = trans;
- (*l)->next = NULL;
-
- ZEND_REGISTER_RESOURCE(return_value, trans,
le_trans);
-
- free_alloca(args);
- return;
- }
- }
-#endif
-
ZEND_FETCH_RESOURCE(trans, ibase_trans*, args[1], -1,
"InterBase transaction", le_trans);
break;
default:
@@ -2058,6 +2019,53 @@
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;
+ }
+
+ 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;
+ ibase_tr_list **l;
+
+ if (isc_dsql_execute_immediate(IB_STATUS, &ib_link->link, &tr,
0, query, ib_link->dialect, NULL)) {
+ _php_ibase_error(TSRMLS_C);
+ _php_ibase_free_query(ib_query TSRMLS_CC);
+ free_alloca(args);
+ RETURN_FALSE;
+ }
+
+ trans = (ibase_trans *) emalloc(sizeof(ibase_trans));
+ 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;
+ ib_link->tr_list->next = NULL;
+ }
+
+ /* link the transaction into the connection-transaction list */
+ for (l = &ib_link->tr_list; *l != NULL; l = &(*l)->next);
+ *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 CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php