You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by dj...@apache.org on 2006/03/09 15:43:35 UTC

svn commit: r384517 - in /db/derby/code/branches/10.1/java: client/org/apache/derby/client/am/ testing/org/apache/derbyTesting/functionTests/master/ testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/ testing/org/apache/derbyTest...

Author: djd
Date: Thu Mar  9 06:43:33 2006
New Revision: 384517

URL: http://svn.apache.org/viewcvs?rev=384517&view=rev
Log:
DERBY-1006 Disallow holdable cursor setting at the connection and statement
level while in a global transaction for the client driver. Matches the embedded
as the holdable cursors are not supported in global (XA) transactions.
Merge of 381549 from trunk

Modified:
    db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out
    db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java

Modified: db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java?rev=384517&r1=384516&r2=384517&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java (original)
+++ db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java Thu Mar  9 06:43:33 2006
@@ -1025,6 +1025,16 @@
             agent_.logWriter_.traceEntry(this, "setHoldability", holdability);
         }
         checkForClosedConnection();
+        // In an XA global transaction do not allow the
+        // holdability to be set to hold cursors across
+        // commits, as the engine does not support it.
+        if (this.isXAConnection_ && this.xaState_ == XA_T1_ASSOCIATED)
+        {
+            if (holdability == ClientDataSource.HOLD_CURSORS_OVER_COMMIT)
+               throw new SqlException(agent_.logWriter_, 
+                 "Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.",
+                 "XJ05C");
+        }
         this.holdability = holdability;
     }
 
@@ -1224,6 +1234,16 @@
         checkForClosedConnection();
         resultSetType = downgradeResultSetType(resultSetType);
         resultSetConcurrency = downgradeResultSetConcurrency(resultSetConcurrency, resultSetType);
+        // In an XA global transaction do not allow the
+        // holdability to be set to hold cursors across
+        // commits, as the engine does not support it.
+        if (this.isXAConnection_ && this.xaState_ == XA_T1_ASSOCIATED)
+        {
+            if (resultSetHoldability == ClientDataSource.HOLD_CURSORS_OVER_COMMIT)
+                throw new SqlException(agent_.logWriter_, 
+                        "Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.",
+                        "XJ05C");
+        }
         Statement s = newStatement_(resultSetType, resultSetConcurrency, resultSetHoldability);
         s.cursorAttributesToSendOnPrepare_ = s.cacheCursorAttributesToSendOnPrepare();
         openStatements_.add(s);

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out?rev=384517&r1=384516&r2=384517&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out Thu Mar  9 06:43:33 2006
@@ -191,5 +191,8 @@
 EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 derby966 complete
 XATest complete

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out?rev=384517&r1=384516&r2=384517&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out Thu Mar  9 06:43:33 2006
@@ -176,5 +176,8 @@
 EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 derby966 complete
 XATest complete

Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java?rev=384517&r1=384516&r2=384517&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java Thu Mar  9 06:43:33 2006
@@ -941,11 +941,42 @@
                 TestUtil.dumpSQLExceptions(e, true);
             }
             pscc.executeQuery().close();
+                   
+            // Test we cannot switch the connection to holdable
+            // or create a statement with holdable.
+            try {
+                conn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
+                System.out.println("FAIL - set holdability in global xact.");
+            } catch (SQLException sqle)
+            {
+                TestUtil.dumpSQLExceptions(sqle, true);
+            }
             
+            try {
+                    conn.createStatement(
+                    ResultSet.TYPE_FORWARD_ONLY,
+                    ResultSet.CONCUR_READ_ONLY,
+                    ResultSet.HOLD_CURSORS_OVER_COMMIT);
+                    System.out.println("FAIL - Statement holdability in global xact.");
+            } catch (SQLException sqle) {
+                TestUtil.dumpSQLExceptions(sqle, true);
+            }
+            try {
+                conn.prepareStatement(
+                "SELECT * FROM APP.FOO",
+                ResultSet.TYPE_FORWARD_ONLY,
+                ResultSet.CONCUR_READ_ONLY,
+                ResultSet.HOLD_CURSORS_OVER_COMMIT);
+                System.out.println("FAIL - PreparedStatement holdability in global xact.");
+        } catch (SQLException sqle) {
+            TestUtil.dumpSQLExceptions(sqle, true);
+        }
             xar.end(xid, XAResource.TMSUCCESS);
             if (xar.prepare(xid) != XAResource.XA_RDONLY)
                 System.out.println("FAIL prepare didn't indicate r/o");
             
+            conn.close();
+            
             System.out.println("derby966 complete");
                 
         } catch (SQLException e) {
@@ -1050,4 +1081,77 @@
         return s + Integer.toString(holdability);
     }
     
+    /*
+     * 5 interleaving transactions.
+     * Taken from the SQL test xaANotherTest.
+     * <code>
+xa_connect user 'mamta' password 'mamta' ;
+
+-- global connection 1
+xa_start xa_noflags 1;
+xa_getconnection;
+insert into APP.foo values (1);
+xa_end xa_suspend 1;
+
+-- global connection 2
+xa_start xa_noflags 2;
+insert into APP.foo values (2);
+xa_end xa_suspend 2;
+
+-- global connection 3
+xa_start xa_noflags 3;
+insert into APP.foo values (3);
+xa_end xa_suspend 3;
+
+-- global connection 4
+xa_start xa_noflags 4;
+insert into APP.foo values (4);
+xa_end xa_suspend 4;
+
+-- global connection 5
+xa_start xa_noflags 5;
+insert into APP.foo values (5);
+xa_end xa_suspend 5;
+
+xa_start xa_resume 1;
+insert into APP.foo values (11);
+xa_end xa_suspend 1;
+
+xa_start xa_resume 5;
+insert into APP.foo values (55);
+xa_end xa_suspend 5;
+
+xa_start xa_resume 2;
+insert into APP.foo values (22);
+xa_end xa_suspend 2;
+
+xa_start xa_resume 4;
+insert into APP.foo values (44);
+xa_end xa_suspend 4;
+
+xa_start xa_resume 3;
+insert into APP.foo values (33);
+xa_end xa_suspend 3;
+
+-- prepare all the global connections except the first one. This way, we will see all
+-- the global transactions prepared so far after the database shutdown and restart.
+xa_end xa_success 2;
+xa_prepare 2;
+xa_end xa_success 3;
+xa_prepare 3;
+xa_end xa_success 4;
+xa_prepare 4;
+xa_end xa_success 5;
+xa_prepare 5;
+
+     * </code>
+     */
+    private static void interleavingTransactions5(XADataSource xads) throws SQLException
+    {
+        System.out.println("interleavingTransactions5");
+        
+        XAConnection xac = xads.getXAConnection("mamta", "mamtapwd");
+        
+    }
+ 
 }