Author: anagappan
Date: 2007-09-27 06:31:33 -0400 (Thu, 27 Sep 2007)
New Revision: 86473

Modified:
   trunk/mcs/class/System.Data/System.Data.Odbc/ChangeLog
   trunk/mcs/class/System.Data/System.Data.Odbc/OdbcTransaction.cs
Log:
* OdbcTransaction.cs: AutoCommit and BeginTransaction fix. Thanks to
  Mads Bondo Dydensborg <[EMAIL PROTECTED]> and Amc <[EMAIL PROTECTED]> for
  providing this patch.

Modified: trunk/mcs/class/System.Data/System.Data.Odbc/ChangeLog
===================================================================
--- trunk/mcs/class/System.Data/System.Data.Odbc/ChangeLog      2007-09-27 
10:29:29 UTC (rev 86472)
+++ trunk/mcs/class/System.Data/System.Data.Odbc/ChangeLog      2007-09-27 
10:31:33 UTC (rev 86473)
@@ -1,3 +1,9 @@
+2007-09-27  Nagappan A <[EMAIL PROTECTED]> 
+
+       * OdbcTransaction.cs: AutoCommit and BeginTransaction fix. Thanks to
+         Mads Bondo Dydensborg <[EMAIL PROTECTED]> and Amc <[EMAIL PROTECTED]> 
for
+         providing this patch.
+
 2007-09-25  Nagappan A  <[EMAIL PROTECTED]>
 
        * OdbcParameter.cs (ResetOdbcType, ResetDbType): Implemented

Modified: trunk/mcs/class/System.Data/System.Data.Odbc/OdbcTransaction.cs
===================================================================
--- trunk/mcs/class/System.Data/System.Data.Odbc/OdbcTransaction.cs     
2007-09-27 10:29:29 UTC (rev 86472)
+++ trunk/mcs/class/System.Data/System.Data.Odbc/OdbcTransaction.cs     
2007-09-27 10:31:33 UTC (rev 86473)
@@ -51,9 +51,7 @@
                internal OdbcTransaction(OdbcConnection conn, IsolationLevel 
isolationlevel)
                {
                        // Set Auto-commit (102) to false
-                       OdbcReturn ret=libodbc.SQLSetConnectAttr(conn.hDbc, 
OdbcConnectionAttribute.AutoCommit, IntPtr.Zero, 0); 
-                       if ((ret!=OdbcReturn.Success) && 
(ret!=OdbcReturn.SuccessWithInfo)) 
-                               throw new OdbcException(new 
OdbcError("SQLSetConnectAttr",OdbcHandleType.Dbc,conn.hDbc));
+                       SetAutoCommit(conn, false);
                        // Handle isolation level
                        int lev=0;
                        switch (isolationlevel)
@@ -76,12 +74,24 @@
                                default:
                                        throw new NotSupportedException();
                        }
-                       libodbc.SQLSetConnectAttr(conn.hDbc, 
OdbcConnectionAttribute.TransactionIsolation, (IntPtr) lev, 0);
+                       // mbd: Getting the return code of the second call to 
SQLSetConnectAttr is missing from original code!
+                       OdbcReturn ret = libodbc.SQLSetConnectAttr(conn.hDbc, 
OdbcConnectionAttribute.TransactionIsolation, (IntPtr) lev, 0);
                        if ((ret!=OdbcReturn.Success) && 
(ret!=OdbcReturn.SuccessWithInfo)) 
                                throw new OdbcException(new 
OdbcError("SQLSetConnectAttr",OdbcHandleType.Dbc,conn.hDbc));
                        this.isolationlevel=isolationlevel;
                        connection=conn;
                }
+        
+               // Set Auto-commit (102) connection attribute
+               // [MonoTODO]: nice to have before svn: define 
libodbc.SQL_IS_UINTEGER = -5
+               private static void SetAutoCommit(OdbcConnection conn, bool 
isAuto)
+               {
+                       OdbcReturn ret=libodbc.SQLSetConnectAttr(
+                               conn.hDbc, OdbcConnectionAttribute.AutoCommit, 
(IntPtr)(isAuto ? 1 : 0), -5
+                ); 
+                       if ((ret!=OdbcReturn.Success) && 
(ret!=OdbcReturn.SuccessWithInfo)) 
+                               throw new OdbcException(new 
OdbcError("SQLSetConnectAttr",OdbcHandleType.Dbc,conn.hDbc));
+               }
 
                #region Implementation of IDisposable
 
@@ -117,8 +127,9 @@
                        if (connection.transaction==this)
                        {
                                OdbcReturn ret=libodbc.SQLEndTran((short) 
OdbcHandleType.Dbc, connection.hDbc, 0);
-                               if ((ret!=OdbcReturn.Success) && 
(ret!=OdbcReturn.SuccessWithInfo)) 
-                                       throw new OdbcException(new 
OdbcError("SQLEndTran",OdbcHandleType.Dbc,connection.hDbc));
+                               if ((ret != OdbcReturn.Success) && (ret != 
OdbcReturn.SuccessWithInfo)) 
+                                       throw new OdbcException (new OdbcError 
("SQLEndTran", OdbcHandleType.Dbc, connection.hDbc));
+                               SetAutoCommit(connection, true);    // restore 
default auto-commit
                                connection.transaction=null;
                        }
                        else
@@ -136,6 +147,7 @@
                                OdbcReturn ret=libodbc.SQLEndTran((short) 
OdbcHandleType.Dbc, connection.hDbc, 1);
                                if ((ret!=OdbcReturn.Success) && 
(ret!=OdbcReturn.SuccessWithInfo)) 
                                        throw new OdbcException(new 
OdbcError("SQLEndTran",OdbcHandleType.Dbc,connection.hDbc));
+                                       SetAutoCommit(connection, true);    // 
restore default auto-commit
                                connection.transaction=null;
                        }
                        else

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to