nobbie          Tue Oct  7 05:36:39 2003 EDT

  Modified files:              (Branch: PHP_4_3)
    /php-src/ext/informix       ifx.ec 
  Log:
  MFH: - Fixed bug #18534 (ifx_close() leaves open session)
  MFH: - (ifx_do_close) Added
  
  
Index: php-src/ext/informix/ifx.ec
diff -u php-src/ext/informix/ifx.ec:1.69.2.20 php-src/ext/informix/ifx.ec:1.69.2.21
--- php-src/ext/informix/ifx.ec:1.69.2.20       Thu Sep 11 19:51:12 2003
+++ php-src/ext/informix/ifx.ec Tue Oct  7 05:36:38 2003
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: ifx.ec,v 1.69.2.20 2003/09/11 23:51:12 sniper Exp $ */
+/* $Id: ifx.ec,v 1.69.2.21 2003/10/07 09:36:38 nobbie Exp $ */
 
 /* -------------------------------------------------------------------
  * if you want a function reference : "grep '^\*\*' ifx.ec" will give
@@ -278,36 +278,70 @@
        return(ifx_err_msg);
 }
 
-static void _close_ifx_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
+static void ifx_do_close(link)
 EXEC SQL BEGIN DECLARE SECTION;
-       char *link;
+       PARAMETER char *link;
 EXEC SQL END DECLARE SECTION;
-
-       link=(char *)rsrc->ptr;
+{
 
        EXEC SQL SET CONNECTION :link;
+                
        if (ifx_check() >= 0) {
-               EXEC SQL close database;
-               EXEC SQL DISCONNECT CURRENT;
+               EXEC SQL DISCONNECT :link;
+
+               /* check if were in a transaction */
+               if (SQLCODE == -1800)   {
+                       EXEC SQL SET CONNECTION :link;
+                       EXEC SQL ROLLBACK WORK;
+                       if (ifx_check() == 0)   {
+                               /* DISCONNECT again, after rollback */
+                               EXEC SQL DISCONNECT :link;
+                               if (ifx_check() < 0)   {
+                                       IFXG(sv_sqlcode) = SQLCODE;
+                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Disconnect link %s after Automatic Rollback fails (%s)", link, ifx_error(link));
+                               }
+                       }
+                       if (ifx_check() < 0)   {
+                               /* CLOSE database if rollback or disconnect fails */
+                               EXEC SQL CLOSE DATABASE;
+                               if (ifx_check() < 0)   {
+                                       IFXG(sv_sqlcode) = SQLCODE;
+                                       php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Close database fails %s (%s)", link, ifx_error(link));
+                               }
+                       }
+               }
+               else if (SQLCODE < 0)   {
+                       IFXG(sv_sqlcode) = SQLCODE;
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Disconnect link 
%s fails (%s)", link, ifx_error(link));
+               }
+       }       
+       else   {
+               IFXG(sv_sqlcode) = SQLCODE;
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Set connection %s fails 
(%s)", link, ifx_error(link));
        }
+
+}
+
+static void _close_ifx_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+{
+       char *link;
+
+       link=(char *)rsrc->ptr;
+
+       ifx_do_close(link);
+
        efree(link);
        IFXG(num_links)--;
 }
 
 static void _close_ifx_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC)
 {
-EXEC SQL BEGIN DECLARE SECTION;
        char *link;
-EXEC SQL END DECLARE SECTION;
 
        link = (char *)rsrc->ptr;
 
-       EXEC SQL SET CONNECTION :link;
-       if (ifx_check() >= 0) {
-               EXEC SQL close database;
-               EXEC SQL DISCONNECT CURRENT;
-       }
+       ifx_do_close(link);
+
        free(link);
        IFXG(num_persistent)--;
        IFXG(num_links)--;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to