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 km...@apache.org on 2007/03/23 19:38:29 UTC
svn commit: r521854 [1/2] - in
/db/derby/code/trunk/java/testing/org/apache/derbyTesting:
functionTests/master/ functionTests/master/DerbyNetClient/jdk14/
functionTests/suites/ functionTests/tests/jdbcapi/ functionTests/util/ junit/
Author: kmarsden
Date: Fri Mar 23 11:38:28 2007
New Revision: 521854
URL: http://svn.apache.org/viewvc?view=rev&rev=521854
Log:
DERBY-2474: Convert jdbcapi/XATest.java to junit
Added:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/XATestUtil.java
- copied, changed from r520630, db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/XATestUtil.java
Removed:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/XATestUtil.java
Modified:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNetClientUseprocess.exclude
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetclientmats.runall
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/xa.runall
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/J2EEDataSource.java
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNetClientUseprocess.exclude
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNetClientUseprocess.exclude?view=diff&rev=521854&r1=521853&r2=521854
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNetClientUseprocess.exclude (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNetClientUseprocess.exclude Fri Mar 23 11:38:28 2007
@@ -1,4 +1,3 @@
-# DerbyNetClientUseprocess.exclude
# identifies tests that fail when run in a suite with useprocess=false with DerbyNetClient
#
# jdbcapi/HoldabilityTest.junit - test causes subsequent tests to fail because of missing
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetclientmats.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetclientmats.runall?view=diff&rev=521854&r1=521853&r2=521854
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetclientmats.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetclientmats.runall Fri Mar 23 11:38:28 2007
@@ -1,5 +1,4 @@
junitTests/derbyNet/CompatibilityTest.java
jdbcapi/xaSimplePositive.sql
jdbcapi/xaStateTran.sql
-jdbcapi/XATest.java
jdbcapi/checkDataSource.java
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/xa.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/xa.runall?view=diff&rev=521854&r1=521853&r2=521854
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/xa.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/xa.runall Fri Mar 23 11:38:28 2007
@@ -4,7 +4,6 @@
jdbcapi/xaSimplePositive.sql
jdbcapi/xaSimpleNegative.sql
jdbcapi/xaStateTran.sql
-jdbcapi/XATest.java
jdbcapi/xaMorph.sql
store/xaOffline1.sql
store/xab2354.sql
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java?view=diff&rev=521854&r1=521853&r2=521854
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java Fri Mar 23 11:38:28 2007
@@ -1,22 +1,22 @@
-/*
-
- Derby - Class org.apache.derby.impl.services.bytecode.CodeChunk
-
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
+/**
+ * Derby - Class org.apache.derbyTesting.functionTests.tests.jdbapi.XATest
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
*/
package org.apache.derbyTesting.functionTests.tests.jdbcapi;
@@ -25,11 +25,9 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
-import java.util.Properties;
import javax.sql.XAConnection;
import javax.sql.XADataSource;
@@ -37,98 +35,28 @@
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
-import org.apache.derby.tools.JDBCDisplayUtil;
-import org.apache.derby.tools.ij;
-import org.apache.derbyTesting.functionTests.util.TestUtil;
-import org.apache.derbyTesting.functionTests.util.XATestUtil;
+import junit.framework.Test;
+import junit.framework.TestSuite;
-/**
- * XATests harvested from SQL XA tests.
- * Modified so that they can be run with NetworkServer.
- */
-public class XATest {
+import org.apache.derbyTesting.junit.BaseJDBCTestCase;
+import org.apache.derbyTesting.junit.CleanDatabaseTestSetup;
+import org.apache.derbyTesting.junit.J2EEDataSource;
+import org.apache.derbyTesting.junit.JDBC;
+import org.apache.derbyTesting.junit.TestConfiguration;
+import org.apache.derbyTesting.junit.XATestUtil;
- /**
- * Run all the tests.
- */
- public static void main(String[] args) throws Exception {
- ij.getPropertyArg(args);
- Connection dmc = ij.startJBMS();
-
- showHoldStatus("initial ", dmc);
-
- XATestUtil.createXATransactionView(dmc);
- dmc.close();
-
- XADataSource dsx = TestUtil.getXADataSource(cleanProperties());
-
- // tests originally from xaSimplePositive.sql
- singleConnectionOnePhaseCommit(dsx);
- xaShutdown();
- interleavingTransactions(dsx);
-
- xaShutdown();
-
- // tests originally from xaStateTran.sql
- noTransaction(dsx);
-
- // test originally from xaMorph.sql
- morph(dsx);
-
- // DERBY-966 holdability testing
- derby966(dsx);
-
- // for cleaning up, make a clean new connection
- Connection dmc2 = ij.startJBMS();
- cleanUp(dmc2);
+public class XATest extends BaseJDBCTestCase {
- System.out.println("XATest complete");
- }
+ public XATest(String name) {
+ super(name);
- /**
- * Get the basic set of properties for an XADataSource.
- * Only sets databaseName to wombat.
- */
- private static Properties cleanProperties() {
- Properties dsAttrs = new Properties();
- dsAttrs.setProperty("databaseName", "wombat");
- return dsAttrs;
}
/**
- * Shutdown the database through an XADataSource.
- */
- private static void xaShutdown() {
-
- Properties dsAttrs = cleanProperties();
-
- if (TestUtil.isEmbeddedFramework())
- dsAttrs.put("shutdownDatabase", "shutdown");
- else
- dsAttrs.put("connectionAttributes", "shutdown=true");
-
- XADataSource dsx = TestUtil.getXADataSource(dsAttrs);
-
- try {
- dsx.getXAConnection().getConnection();
- } catch (SQLException sqle) {
- if ("08006".equals(sqle.getSQLState()))
- return;
- TestUtil.dumpSQLExceptions(sqle);
- }
- System.out.println("FAIL: no exception on shutdown");
- }
-
- /*
- ** Test cases
- */
-
- /**
* A single connection and 1 phase commit.
*
-
- Original "SQL" from xaSimplePositive.sql
- <code>
+ *
+ * Original "SQL" from xaSimplePositive.sql <code>
xa_connect ;
xa_start xa_noflags 0;
xa_getconnection;
@@ -143,235 +71,217 @@
xa_datasource 'wombat' shutdown;
</code>
- * @throws SQLException
- * @throws XAException
+ *
+ * @throws SQLException
+ * @throws XAException
+ * @throws XAException
*/
- private static void singleConnectionOnePhaseCommit(XADataSource xads) {
- System.out.println("singleConnectionOnePhaseCommit");
- try {
- XAConnection xac = xads.getXAConnection();
+ public void testSingleConnectionOnePhaseCommit() throws SQLException,
+ XAException {
- XAResource xar = xac.getXAResource();
+ XADataSource xads = J2EEDataSource.getXADataSource();
+ J2EEDataSource.setBeanProperty(xads, "databaseName", "wombat");
- Xid xid = XATestUtil.getXid(0, 32, 46);
+ XAConnection xac = xads.getXAConnection();
- xar.start(xid, XAResource.TMNOFLAGS);
+ XAResource xar = xac.getXAResource();
- Connection conn = xac.getConnection();
-
- showHoldStatus("XA ", conn);
+ Xid xid = XATestUtil.getXid(0, 32, 46);
- Statement s = conn.createStatement();
- showHoldStatus("XA ", s);
+ xar.start(xid, XAResource.TMNOFLAGS);
- s.execute("create table foo (a int)");
- s.executeUpdate("insert into foo values (0)");
+ Connection conn = xac.getConnection();
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, conn.getHoldability());
- ResultSet rs = s.executeQuery("select * from foo");
- JDBCDisplayUtil.DisplayResults(System.out, rs, conn);
- rs.close();
+ Statement s = conn.createStatement();
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, s
+ .getResultSetHoldability());
- XATestUtil.showXATransactionView(conn);
+ s.execute("create table foo (a int)");
+ s.executeUpdate("insert into foo values (0)");
- s.close();
- xar.end(xid, XAResource.TMSUCCESS);
+ ResultSet rs = s.executeQuery("select * from foo");
+ JDBC.assertDrainResults(rs, 1);
- // 1 phase commit
- xar.commit(xid, true);
+ String[][] expectedRows = { { "(0", "ACTIVE", "false", "APP",
+ "UserTransaction" } };
- conn.close();
- xac.close();
+ XATestUtil.checkXATransactionView(conn, expectedRows);
+
+ s.close();
+ xar.end(xid, XAResource.TMSUCCESS);
+
+ // 1 phase commit
+ xar.commit(xid, true);
+
+ conn.close();
+ xac.close();
- } catch (SQLException sqle) {
- TestUtil.dumpSQLExceptions(sqle);
- sqle.printStackTrace(System.out);
- } catch (XAException e) {
- XATestUtil.dumpXAException("singleConnectionOnePhaseCommit", e);
- }
}
/*
* Two interleaving transaction and prepare/commit prepare/rollback.
*
* (original test said two connections but only one connection was opened)
-
- <code>
- xa_datasource 'wombat';
- xa_connect user 'sku' password 'testxa' ;
-
- xa_start xa_noflags 1;
- xa_getconnection;
- insert into APP.foo values (1);
- xa_end xa_suspend 1;
-
- xa_start xa_noflags 2;
- insert into APP.foo values (2);
- xa_end xa_suspend 2;
-
- xa_start xa_resume 1;
- insert into APP.foo values (3);
- xa_end xa_suspend 1;
-
- xa_start xa_resume 2;
- insert into APP.foo values (4);
- select * from APP.global_xactTable where gxid is not null order by gxid;
- -- this prepare won't work since transaction 1 has been suspended - XA_PROTO
- xa_prepare 1;
-
- select * from APP.global_xactTable where gxid is not null order by gxid;
- xa_end xa_success 2;
-
- -- this assumes a resume
- xa_end xa_success 1;
- xa_prepare 1;
- xa_prepare 2;
-
- -- both transactions should be prepared
- select * from APP.global_xactTable where gxid is not null order by gxid;
-
- -- NOTE: The following call to "xa_recover xa_startrscan" is apt to
- -- return the result set rows in reverse order when changes to
- -- the Derby engine affect the number of transactions that it takes
- -- to create a database. The transactions are stored in a hash table
- -- based on a global and local id, and when the number of transactions
- -- changes, the (internal) local id can change, which may lead to a
- -- change in the result set order. This order is determined by the
- -- JVM's hashing algorithm. Examples of changes to the engine that
- -- can affect this include ones that cause more commits or that
- -- change the amount of data being stored, such as changes to the
- -- metadata statements (which is what prompted this explanation in
- -- the first place). Ultimately, the problem is that there is no
- -- way to order the return values from "xa_recover" since it is an
- -- ij internal statement, not SQL...
- xa_recover xa_startrscan;
- xa_recover xa_noflags;
-
- xa_commit xa_2Phase 1;
- xa_rollback 2;
-
- -- check results
- xa_start xa_noflags 3;
- select * from APP.global_xactTable where gxid is not null order by gxid;
- select * from APP.foo;
- xa_end xa_success 3;
-
- xa_prepare 3;
-
- -- should fail with XA_NOTA because we prepared a read only transaction
- xa_commit xa_1Phase 3;
- disconnect;
- </code>
+ *
+ * <code> xa_datasource 'wombat'; xa_connect user 'sku' password 'testxa' ;
+ *
+ * xa_start xa_noflags 1; xa_getconnection; insert into APP.foo values (1);
+ * xa_end xa_suspend 1;
+ *
+ * xa_start xa_noflags 2; insert into APP.foo values (2); xa_end xa_suspend
+ * 2;
+ *
+ * xa_start xa_resume 1; insert into APP.foo values (3); xa_end xa_suspend
+ * 1;
+ *
+ * xa_start xa_resume 2; insert into APP.foo values (4); select * from
+ * APP.global_xactTable where gxid is not null order by gxid; -- this
+ * prepare won't work since transaction 1 has been suspended - XA_PROTO
+ * xa_prepare 1;
+ *
+ * select * from APP.global_xactTable where gxid is not null order by gxid;
+ * xa_end xa_success 2; -- this assumes a resume xa_end xa_success 1;
+ * xa_prepare 1; xa_prepare 2; -- both transactions should be prepared
+ * select * from APP.global_xactTable where gxid is not null order by gxid; --
+ * NOTE: The following call to "xa_recover xa_startrscan" is apt to --
+ * return the result set rows in reverse order when changes to -- the Derby
+ * engine affect the number of transactions that it takes -- to create a
+ * database. The transactions are stored in a hash table -- based on a
+ * global and local id, and when the number of transactions -- changes, the
+ * (internal) local id can change, which may lead to a -- change in the
+ * result set order. This order is determined by the -- JVM's hashing
+ * algorithm. Examples of changes to the engine that -- can affect this
+ * include ones that cause more commits or that -- change the amount of data
+ * being stored, such as changes to the -- metadata statements (which is
+ * what prompted this explanation in -- the first place). Ultimately, the
+ * problem is that there is no -- way to order the return values from
+ * "xa_recover" since it is an -- ij internal statement, not SQL...
+ * xa_recover xa_startrscan; xa_recover xa_noflags;
+ *
+ * xa_commit xa_2Phase 1; xa_rollback 2; -- check results xa_start
+ * xa_noflags 3; select * from APP.global_xactTable where gxid is not null
+ * order by gxid; select * from APP.foo; xa_end xa_success 3;
+ *
+ * xa_prepare 3; -- should fail with XA_NOTA because we prepared a read only
+ * transaction xa_commit xa_1Phase 3; disconnect; </code>
*/
- private static void interleavingTransactions(XADataSource xads) {
- System.out.println("interleavingTransactions");
- try {
- XAConnection xac = xads.getXAConnection("sku", "testxa");
- XAResource xar = xac.getXAResource();
+ public void testInterleavingTransactions() throws SQLException, XAException {
+ XADataSource xads = J2EEDataSource.getXADataSource();
- Xid xid1 = XATestUtil.getXid(1, 93, 18);
- Xid xid2 = XATestUtil.getXid(2, 45, 77);
+ XAConnection xac = xads.getXAConnection("sku", "testxa");
+ XAResource xar = xac.getXAResource();
- xar.start(xid1, XAResource.TMNOFLAGS);
+ Xid xid1 = XATestUtil.getXid(1, 93, 18);
+ Xid xid2 = XATestUtil.getXid(2, 45, 77);
- Connection conn = xac.getConnection();
+ xar.start(xid1, XAResource.TMNOFLAGS);
- Statement s = conn.createStatement();
- s.executeUpdate("insert into APP.foo values (1)");
- xar.end(xid1, XAResource.TMSUSPEND);
+ Connection conn = xac.getConnection();
- xar.start(xid2, XAResource.TMNOFLAGS);
- s.executeUpdate("insert into APP.foo values (2)");
- xar.end(xid2, XAResource.TMSUSPEND);
+ Statement s = conn.createStatement();
+ s.executeUpdate("insert into APP.foo values (1)");
+ xar.end(xid1, XAResource.TMSUSPEND);
- xar.start(xid1, XAResource.TMRESUME);
- s.executeUpdate("insert into APP.foo values (3)");
- xar.end(xid1, XAResource.TMSUSPEND);
+ xar.start(xid2, XAResource.TMNOFLAGS);
+ s.executeUpdate("insert into APP.foo values (2)");
+ xar.end(xid2, XAResource.TMSUSPEND);
- xar.start(xid2, XAResource.TMRESUME);
- s.executeUpdate("insert into APP.foo values (4)");
+ xar.start(xid1, XAResource.TMRESUME);
+ s.executeUpdate("insert into APP.foo values (3)");
+ xar.end(xid1, XAResource.TMSUSPEND);
- XATestUtil.showXATransactionView(conn);
+ xar.start(xid2, XAResource.TMRESUME);
+ s.executeUpdate("insert into APP.foo values (4)");
- // this prepare won't work since
- // transaction 1 has been suspended - XA_PROTO
- try {
- xar.prepare(xid1);
- System.out.println("FAIL - prepare on suspended transaction");
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_PROTO)
- XATestUtil.dumpXAException(
- "FAIL - prepare on suspended transaction", e);
+ String[][] expectedRows = {
+ { "(1", "ACTIVE", "false", "SKU", "UserTransaction" },
+ { "(2", "ACTIVE", "false", "SKU", "UserTransaction" } };
- }
+ XATestUtil.checkXATransactionView(conn, expectedRows);
+
+ // this prepare won't work since
+ // transaction 1 has been suspended - XA_PROTO
+ try {
+ xar.prepare(xid1);
+ fail("FAIL - prepare on suspended transaction");
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_PROTO)
+ XATestUtil.dumpXAException(
+ "FAIL - prepare on suspended transaction", e);
- // check it was not prepared
- XATestUtil.showXATransactionView(conn);
+ }
- xar.end(xid2, XAResource.TMSUCCESS);
+ // check it was not prepared
- xar.end(xid1, XAResource.TMSUCCESS);
+ XATestUtil.checkXATransactionView(conn, expectedRows);
- xar.prepare(xid1);
- xar.prepare(xid2);
+ xar.end(xid2, XAResource.TMSUCCESS);
- // both should be prepared.
- XATestUtil.showXATransactionView(conn);
+ xar.end(xid1, XAResource.TMSUCCESS);
- Xid[] recoveredStart = xar.recover(XAResource.TMSTARTRSCAN);
- System.out.println("recovered start " + recoveredStart.length);
- Xid[] recovered = xar.recover(XAResource.TMNOFLAGS);
- System.out.println("recovered " + recovered.length);
- Xid[] recoveredEnd = xar.recover(XAResource.TMENDRSCAN);
- System.out.println("recovered end " + recoveredEnd.length);
-
- for (int i = 0; i < recoveredStart.length; i++) {
- Xid xid = recoveredStart[i];
- if (xid.getFormatId() == 1) {
- // commit 1 with 2pc
- xar.commit(xid, false);
- } else if (xid.getFormatId() == 2) {
- xar.rollback(xid);
- } else {
- System.out.println("FAIL: unknown xact");
- }
+ xar.prepare(xid1);
+ xar.prepare(xid2);
+
+ // both should be prepared.
+ expectedRows = new String[][] {
+ { "(1", "PREPARED", "false", "SKU", "UserTransaction" },
+ { "(2", "PREPARED", "false", "SKU", "UserTransaction" } };
+
+ XATestUtil.checkXATransactionView(conn, expectedRows);
+
+ Xid[] recoveredStart = xar.recover(XAResource.TMSTARTRSCAN);
+ assertEquals(2, recoveredStart.length);
+ Xid[] recovered = xar.recover(XAResource.TMNOFLAGS);
+ assertEquals(0, recovered.length);
+ Xid[] recoveredEnd = xar.recover(XAResource.TMENDRSCAN);
+ assertEquals(0, recoveredEnd.length);
+
+ for (int i = 0; i < recoveredStart.length; i++) {
+ Xid xid = recoveredStart[i];
+ if (xid.getFormatId() == 1) {
+ // commit 1 with 2pc
+ xar.commit(xid, false);
+ } else if (xid.getFormatId() == 2) {
+ xar.rollback(xid);
+ } else {
+ fail("FAIL: unknown xact");
}
+ }
- // check the results
- Xid xid3 = XATestUtil.getXid(3, 2, 101);
- xar.start(xid3, XAResource.TMNOFLAGS);
- XATestUtil.showXATransactionView(conn);
- ResultSet rs = s.executeQuery("select * from APP.foo");
- JDBCDisplayUtil.DisplayResults(System.out, rs, conn);
- rs.close();
- xar.end(xid3, XAResource.TMSUCCESS);
-
- int pr = xar.prepare(xid3);
- if (pr != XAResource.XA_RDONLY)
- System.out.println("FAIL - prepare on read only xact returned "
- + pr);
+ // check the results
+ Xid xid3 = XATestUtil.getXid(3, 2, 101);
+ xar.start(xid3, XAResource.TMNOFLAGS);
+ expectedRows = new String[][] { { "(3", "IDLE", "NULL", "SKU",
+ "UserTransaction" } };
+ XATestUtil.checkXATransactionView(conn, expectedRows);
+ ResultSet rs = s.executeQuery("select * from APP.foo");
+ expectedRows = new String[][] { { "0" }, { "1" }, { "3" } };
+ JDBC.assertFullResultSet(rs, expectedRows);
- try {
- xar.commit(xid3, true);
- System.out.println("FAIL - 2pc commit on read-only xact");
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
+ rs.close();
+ xar.end(xid3, XAResource.TMSUCCESS);
- s.close();
- conn.close();
- xac.close();
- } catch (SQLException sqle) {
- TestUtil.dumpSQLExceptions(sqle);
+ int pr = xar.prepare(xid3);
+ if (pr != XAResource.XA_RDONLY)
+ fail("FAIL - prepare on read only xact returned " + pr);
+
+ try {
+ xar.commit(xid3, true);
+ fail("FAIL - 2pc commit on read-only xact");
} catch (XAException e) {
- XATestUtil.dumpXAException("interleavingTransactions", e);
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
}
+
+ s.close();
+ conn.close();
+ xac.close();
+
}
- /**
- Tests on INIT STATE (no tr
- Original SQL from xaStateTran.sql.
- <code>
+ /**
+ * Tests on INIT STATE (no tr Original SQL from xaStateTran.sql. <code>
-- the following should error XAER_NOTA
xa_start xa_join 11;
@@ -395,875 +305,725 @@
xa_forget 11;
</code>
*/
- private static void noTransaction(XADataSource xads) {
- System.out.println("noTransaction");
- try {
- XAConnection xac = xads.getXAConnection();
- XAResource xar = xac.getXAResource();
+ public void testNoTransaction() throws SQLException, XAException {
+ XADataSource xads = J2EEDataSource.getXADataSource();
+ XAConnection xac = xads.getXAConnection();
+ XAResource xar = xac.getXAResource();
- Xid xid11 = XATestUtil.getXid(11, 3, 128);
+ Xid xid11 = XATestUtil.getXid(11, 3, 128);
- try {
- xar.start(xid11, XAResource.TMJOIN);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
+ try {
+ xar.start(xid11, XAResource.TMJOIN);
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
+ }
- try {
- xar.start(xid11, XAResource.TMRESUME);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
+ try {
+ xar.start(xid11, XAResource.TMRESUME);
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
+ }
- try {
- xar.end(xid11, XAResource.TMSUCCESS);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
- try {
- xar.end(xid11, XAResource.TMFAIL);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
+ try {
+ xar.end(xid11, XAResource.TMSUCCESS);
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
+ }
+ try {
+ xar.end(xid11, XAResource.TMFAIL);
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
+ }
- try {
- xar.end(xid11, XAResource.TMSUSPEND);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
+ try {
+ xar.end(xid11, XAResource.TMSUSPEND);
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
+ }
- try {
- xar.prepare(xid11);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
- try {
- xar.commit(xid11, false);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
- try {
- xar.commit(xid11, true);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
- try {
- xar.rollback(xid11);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
- try {
- xar.forget(xid11);
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_NOTA)
- throw e;
- }
- } catch (SQLException e) {
- TestUtil.dumpSQLExceptions(e);
+ try {
+ xar.prepare(xid11);
} catch (XAException e) {
- XATestUtil.dumpXAException("noTransaction", e);
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
+ }
+ try {
+ xar.commit(xid11, false);
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
+ }
+ try {
+ xar.commit(xid11, true);
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
+ }
+ try {
+ xar.rollback(xid11);
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
+ }
+ try {
+ xar.forget(xid11);
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_NOTA)
+ throw e;
}
}
/**
* Morph a connection between local anf global transactions.
*/
- private static void morph(XADataSource xads) {
- System.out.println("morph");
+ public void testMorph() throws SQLException, XAException {
- try {
- XAConnection xac = xads.getXAConnection();
+ XADataSource xads = J2EEDataSource.getXADataSource();
+ XAConnection xac = xads.getXAConnection();
- XAResource xar = xac.getXAResource();
+ XAResource xar = xac.getXAResource();
- Connection conn = xac.getConnection();
+ Connection conn = xac.getConnection();
- /*
- autocommit off;
- insert into foo values (1);
- select * from global_xactTable where gxid is not null order by gxid,username;
- commit;
- */
- conn.setAutoCommit(false);
- Statement s = conn.createStatement();
- s.executeUpdate("insert into APP.foo values (2001)");
- XATestUtil.showXATransactionView(conn);
- conn.commit();
+ /*
+ * autocommit off; insert into foo values (1); select * from
+ * global_xactTable where gxid is not null order by gxid,username;
+ * commit;
+ */
+ conn.setAutoCommit(false);
+ Statement s = conn.createStatement();
+ s.executeUpdate("insert into APP.foo values (2001)");
+ // no rows expected
+ XATestUtil.checkXATransactionView(conn, null);
+ conn.commit();
- /*
- autocommit on;
- insert into foo values (2);
- select * from global_xactTable where gxid is not null order by gxid,username;
-
- */
+ /*
+ * autocommit on; insert into foo values (2); select * from
+ * global_xactTable where gxid is not null order by gxid,username;
+ *
+ */
+
+ conn.setAutoCommit(true);
+ s.executeUpdate("insert into APP.foo values (2002)");
+ XATestUtil.checkXATransactionView(conn, null);
+
+ /*
+ * -- morph the connection to a global transaction xa_start xa_noflags
+ * 1; select * from global_xactTable where gxid is not null order by
+ * gxid,username; insert into foo values (3);
+ */
+
+ Xid xid = XATestUtil.getXid(1001, 66, 13);
+ xar.start(xid, XAResource.TMNOFLAGS);
+ String[][] expectedRows = { { "(1", "IDLE", "NULL", "APP",
+ "UserTransaction" } };
+ XATestUtil.checkXATransactionView(conn, expectedRows);
+ s.executeUpdate("insert into APP.foo values (2003)");
+
+ /*
+ * -- disallowed commit; -- disallowed rollback; -- disallowed
+ * autocommit on; -- OK autocommit off;
+ */
+ try {
+ conn.commit();
+ fail("FAIL: commit allowed in global xact");
+ } catch (SQLException e) {
+ }
+ try {
+ conn.rollback();
+ fail("FAIL: roll back allowed in global xact");
+ } catch (SQLException e) {
+ }
+ try {
conn.setAutoCommit(true);
- s.executeUpdate("insert into APP.foo values (2002)");
- XATestUtil.showXATransactionView(conn);
+ fail("FAIL: setAutoCommit(true) allowed " + "in global xact");
+ } catch (SQLException e) {
+ }
+ try {
+ conn.setSavepoint();
+ fail("FAIL: setSavepoint() allowed in global xact");
+ } catch (SQLException e) {
+ }
+ try {
+ conn.setSavepoint("badsavepoint");
+ fail("FAIL: setSavepoint(String) allowed in " + "global xact");
+ } catch (SQLException e) {
+ }
- /*
- -- morph the connection to a global transaction
- xa_start xa_noflags 1;
- select * from global_xactTable where gxid is not null order by gxid,username;
- insert into foo values (3);
- */
+ conn.setAutoCommit(false);
- Xid xid = XATestUtil.getXid(1001, 66, 13);
- xar.start(xid, XAResource.TMNOFLAGS);
- XATestUtil.showXATransactionView(conn);
- s.executeUpdate("insert into APP.foo values (2003)");
+ // s was created in local mode so it has holdibilty
+ // set, will execute but ResultSet will have close on commit
- /*
- -- disallowed
- commit;
- -- disallowed
- rollback;
- -- disallowed
- autocommit on;
- -- OK
- autocommit off;
- */
- try {
- conn.commit();
- System.out.println("FAIL: commit allowed in global xact");
- } catch (SQLException e) {
- }
+ // DERBY-1158 query with holdable statement
+ s.executeQuery("select * from APP.foo where A >= 2000").close();
+ s.close();
+
+ // statement created in global xact is CLOSE_CURSORS_AT_COMMIT
+ s = conn.createStatement();
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, s
+ .getResultSetHoldability());
+
+ /*
+ * select * from foo; xa_end xa_success 1; xa_prepare 1;
+ */
+ ResultSet rs = s.executeQuery("select * from APP.foo where A >= 2000");
+ expectedRows = new String[][] { { "2001" }, { "2002" }, { "2003" } };
- try {
- conn.rollback();
- System.out.println("FAIL: roll back allowed in global xact");
- } catch (SQLException e) {
- }
- try {
- conn.setAutoCommit(true);
- System.out
- .println("FAIL: setAutoCommit(true) allowed "+
- "in global xact");
- } catch (SQLException e) {
- }
- try {
- conn.setSavepoint();
- System.out
- .println("FAIL: setSavepoint() allowed in global xact");
- } catch (SQLException e) {}
- try {
- conn.setSavepoint("badsavepoint");
- System.out
- .println("FAIL: setAutoCommit(String) allowed in "+
- "global xact");
- } catch (SQLException e) {}
-
- conn.setAutoCommit(false);
-
- // s was created in local mode so it has holdibilty
- // set, will execute but ResultSet will have close on commit
-
- if (TestUtil.isDerbyNetClientFramework()) { // DERBY-1158
- s.executeQuery("select * from APP.foo where A >= 2000").close();
- System.out.println("OK: query with holdable statement");
- }
- s.close();
-
-
- s = conn.createStatement();
- boolean holdable = s.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT;
- System.out.println("Statement created in global has holdabilty: "
- + holdable);
-
- /*
- select * from foo;
- xa_end xa_success 1;
- xa_prepare 1;
- */
- ResultSet rs = s
- .executeQuery("select * from APP.foo where A >= 2000");
- JDBCDisplayUtil.DisplayResults(System.out, rs, conn);
- rs.close();
-
- xar.end(xid, XAResource.TMSUCCESS);
- xar.prepare(xid);
-
- /*
- -- dup id
- xa_start xa_noflags 1;
- */
- try {
- xar.start(xid, XAResource.TMNOFLAGS);
- System.out.println("FAIL - start with duplicate XID");
- } catch (XAException e) {
- if (e.errorCode != XAException.XAER_DUPID)
- throw e;
- }
+ rs.close();
- /*
- xa_start xa_noflags 2;
- -- still should disallow autommit;
- autocommit on;
- -- still should disallow commit and rollback
- commit;
- rollback;
- select * from global_xactTable where gxid is not null order by gxid,username;
- xa_end xa_suspend 2;
- */
+ xar.end(xid, XAResource.TMSUCCESS);
+ xar.prepare(xid);
- Xid xid2 = XATestUtil.getXid(1002, 23, 3);
- xar.start(xid2, XAResource.TMNOFLAGS);
- try {
- conn.commit();
- System.out.println("FAIL: commit allowed in global xact");
- } catch (SQLException e) {
- }
- try {
- conn.rollback();
- System.out.println("FAIL: roll back allowed in global xact");
- } catch (SQLException e) {
- }
- try {
- conn.setAutoCommit(true);
- System.out
- .println("FAIL: setAutoCommit(true) allowed in global xact");
- } catch (SQLException e) {
- }
- conn.setAutoCommit(false);
+ /*
+ * -- dup id xa_start xa_noflags 1;
+ */
+ try {
+ xar.start(xid, XAResource.TMNOFLAGS);
+ fail("FAIL - start with duplicate XID");
+ } catch (XAException e) {
+ if (e.errorCode != XAException.XAER_DUPID)
+ throw e;
+ }
- xar.end(xid2, XAResource.TMSUSPEND);
+ /*
+ * xa_start xa_noflags 2; -- still should disallow autommit; autocommit
+ * on; -- still should disallow commit and rollback commit; rollback;
+ * select * from global_xactTable where gxid is not null order by
+ * gxid,username; xa_end xa_suspend 2;
+ */
- /*
- -- get local connection again
- xa_getconnection;
+ Xid xid2 = XATestUtil.getXid(1002, 23, 3);
+ xar.start(xid2, XAResource.TMNOFLAGS);
+ try {
+ conn.commit();
+ fail("FAIL: commit allowed in global xact");
+ } catch (SQLException e) {
+ }
+ try {
+ conn.rollback();
+ fail("FAIL: roll back allowed in global xact");
+ } catch (SQLException e) {
+ }
+ try {
+ conn.setAutoCommit(true);
+ fail("FAIL: setAutoCommit(true) allowed in global xact");
+ } catch (SQLException e) {
+ }
+ conn.setAutoCommit(false);
- insert into foo values (5);
+ xar.end(xid2, XAResource.TMSUSPEND);
- -- autocommit should be on by default;
- commit;
+ /*
+ * -- get local connection again xa_getconnection;
+ *
+ * insert into foo values (5); -- autocommit should be on by default;
+ * commit;
+ *
+ * autocommit off; insert into foo values (6); -- commit and rollback is
+ * allowed on local connection rollback;
+ *
+ * insert into foo values (6); commit;
+ */
+ conn = xac.getConnection();
+ s = conn.createStatement();
+ s.executeUpdate("insert into APP.foo values (2005)");
+ conn.commit();
+ conn.setAutoCommit(false);
+ s.executeUpdate("insert into APP.foo values (2006)");
+ conn.rollback();
+ s.executeUpdate("insert into APP.foo values (2007)");
+ conn.commit();
- autocommit off;
- insert into foo values (6);
+ expectedRows = new String[][] {
+ { "(1", "PREPARED", "false", "APP", "UserTransaction" },
+ { "(1", "IDLE", "NULL", "APP", "UserTransaction" } };
+ XATestUtil.checkXATransactionView(conn, expectedRows);
+ /*
+ * -- I am still able to commit other global transactions while I am
+ * attached to a -- local transaction. xa_commit xa_2phase 1; xa_end
+ * xa_success 2; xa_rollback 2;
+ */
+ xar.commit(xid, false);
+ xar.end(xid2, XAResource.TMSUCCESS);
+ xar.rollback(xid2);
+
+ XATestUtil.checkXATransactionView(conn, null);
+ rs = s.executeQuery("select * from APP.foo where A >= 2000");
+ expectedRows = new String[][] { { "2001" }, { "2002" }, { "2003" },
+ { "2005" }, { "2007" } };
+ JDBC.assertFullResultSet(rs, expectedRows);
+ rs.close();
- -- commit and rollback is allowed on local connection
- rollback;
+ conn.close();
- insert into foo values (6);
- commit;
- */
- conn = xac.getConnection();
- s = conn.createStatement();
- s.executeUpdate("insert into APP.foo values (2005)");
- conn.commit();
- conn.setAutoCommit(false);
- s.executeUpdate("insert into APP.foo values (2006)");
- conn.rollback();
- s.executeUpdate("insert into APP.foo values (2007)");
- conn.commit();
+ /*
+ * xa_getconnection; select * from global_xactTable where gxid is not
+ * null order by gxid,username; select * from foo; autocommit off;
+ * delete from foo;
+ */
+ conn = xac.getConnection();
+ conn.setAutoCommit(false);
+ s = conn.createStatement();
+ s.executeUpdate("delete from app.foo");
+ rs = s.executeQuery("select * from APP.foo");
+ JDBC.assertEmpty(rs);
+ rs.close();
- XATestUtil.showXATransactionView(conn);
- /*
- -- I am still able to commit other global transactions while I am attached to a
- -- local transaction.
- xa_commit xa_2phase 1;
- xa_end xa_success 2;
- xa_rollback 2;
- */
- xar.commit(xid, false);
- xar.end(xid2, XAResource.TMSUCCESS);
- xar.rollback(xid2);
-
- XATestUtil.showXATransactionView(conn);
- rs = s.executeQuery("select * from APP.foo where A >= 2000");
- JDBCDisplayUtil.DisplayResults(System.out, rs, conn);
- rs.close();
-
- conn.close();
-
- /*
- xa_getconnection;
- select * from global_xactTable where gxid is not null order by gxid,username;
- select * from foo;
- autocommit off;
- delete from foo;
- */
- conn = xac.getConnection();
- conn.setAutoCommit(false);
- s = conn.createStatement();
- s.executeUpdate("delete from app.foo");
- rs = s.executeQuery("select * from APP.foo");
- JDBCDisplayUtil.DisplayResults(System.out, rs, conn);
- rs.close();
-
- // DERBY-1004
- if (TestUtil.isDerbyNetClientFramework()) {
- System.out.println("DERBY-1004 Call conn.rollback to avoid exception with client");
- conn.rollback();
- }
- /*
- -- yanking a local connection away should rollback the changes
- */
- conn = xac.getConnection();
- conn.setAutoCommit(false);
- s = conn.createStatement();
- rs = s.executeQuery("select * from APP.foo where A >= 2000");
- JDBCDisplayUtil.DisplayResults(System.out, rs, conn);
- rs.close();
-
- /*
- -- cannot morph it if the local transaction is not idle
- xa_start xa_noflags 3;
- commit;
- -- now morph it to a global transaction
- xa_start xa_noflags 3;
- */
- Xid xid3 = XATestUtil.getXid(1003, 27, 9);
- try {
- xar.start(xid3, XAResource.TMNOFLAGS);
- System.out.println("FAIL XAResource.start on a global transaction with an active local transaction (autocommit false)");
- } catch (XAException xae) {
- if (xae.errorCode != XAException.XAER_OUTSIDE)
- throw xae;
- System.out.println("Correct XAException on starting a global transaction with an active local transaction (autocommit false)");
- }
- conn.commit();
+ /*
+ * -- yanking a local connection away should rollback the changes
+ */
+ conn = xac.getConnection();
+ conn.setAutoCommit(false);
+ s = conn.createStatement();
+ rs = s.executeQuery("select * from APP.foo where A >= 2000");
+ expectedRows = new String[][] { { "2001" }, { "2002" }, { "2003" },
+ { "2005" }, { "2007" } };
+ JDBC.assertFullResultSet(rs, expectedRows);
+
+ /*
+ * -- cannot morph it if the local transaction is not idle xa_start
+ * xa_noflags 3; commit; -- now morph it to a global transaction
+ * xa_start xa_noflags 3;
+ */
+ Xid xid3 = XATestUtil.getXid(1003, 27, 9);
+ try {
xar.start(xid3, XAResource.TMNOFLAGS);
+ fail("FAIL XAResource.start on a global transaction with an active local transaction (autocommit false)");
+ } catch (XAException xae) {
+ if (xae.errorCode != XAException.XAER_OUTSIDE)
+ throw xae;
+ }
+ conn.commit();
+ xar.start(xid3, XAResource.TMNOFLAGS);
- /*
- -- now I shouldn't be able to yank it
- xa_getconnection;
- */
- if (TestUtil.isDerbyNetClientFramework()) {
- System.out.println("DERBY-341 - Client skipping XAConnection with active local transaction");
- } else {
+ /*
+ * -- now I shouldn't be able to yank it xa_getconnection;
+ */
+ // DERBY-341 - client skip XAConnection with active local xact
+ if (usingEmbedded()) {
try {
xac.getConnection();
- System.out
- .println("FAIL: getConnection with active global xact");
+ fail("FAIL: getConnection with active global xact");
} catch (SQLException sqle) {
- TestUtil.dumpSQLExceptions(sqle, true);
- }
+ assertSQLState("XJ059", sqle);
}
- /*
- select * from foo;
- delete from foo;
-
- xa_end xa_fail 3;
- xa_rollback 3;
-
- -- local connection again
- xa_getconnection;
- select * from global_xactTable where gxid is not null order by gxid,username;
- select * from foo;
- */
- s = conn.createStatement();
- s.executeUpdate("delete from APP.foo");
- rs = s.executeQuery("select * from APP.foo where A >= 2000");
- JDBCDisplayUtil.DisplayResults(System.out, rs, conn);
- rs.close();
- try {
- xar.end(xid3, XAResource.TMFAIL);
- } catch (XAException e) {
- if (e.errorCode != XAException.XA_RBROLLBACK)
- throw e;
- }
- xar.rollback(xid3);
-
- conn = xac.getConnection();
- s = conn.createStatement();
- rs = s.executeQuery("select * from APP.foo where A >= 2000");
- JDBCDisplayUtil.DisplayResults(System.out, rs, conn);
- rs.close();
-
- s.close();
- conn.close();
+ }
+ /*
+ * select * from foo; delete from foo;
+ *
+ * xa_end xa_fail 3; xa_rollback 3; -- local connection again
+ * xa_getconnection; select * from global_xactTable where gxid is not
+ * null order by gxid,username; select * from foo;
+ */
+ s = conn.createStatement();
+ s.executeUpdate("delete from APP.foo");
+ rs = s.executeQuery("select * from APP.foo where A >= 2000");
+ JDBC.assertEmpty(rs);
- } catch (SQLException e) {
- TestUtil.dumpSQLExceptions(e);
- e.printStackTrace(System.out);
+ rs.close();
+ try {
+ xar.end(xid3, XAResource.TMFAIL);
} catch (XAException e) {
- XATestUtil.dumpXAException("morph", e);
+ if (e.errorCode != XAException.XA_RBROLLBACK)
+ throw e;
}
+ xar.rollback(xid3);
+
+ conn = xac.getConnection();
+ s = conn.createStatement();
+ rs = s.executeQuery("select * from APP.foo where A >= 2000");
+ expectedRows = new String[][] { { "2001" }, { "2002" }, { "2003" },
+ { "2005" }, { "2007" } };
+ JDBC.assertFullResultSet(rs, expectedRows);
+ rs.close();
+
+ s.close();
+ conn.close();
}
-
+
/**
- * Derby-966 holdability and global/location transactions.
- * (work in progress)
+ * Derby-966 holdability and global/location transactions. (work in
+ * progress)
*/
- private static void derby966(XADataSource xads)
- {
- System.out.println("derby966");
-
- try {
- XAConnection xac = xads.getXAConnection();
- XAResource xar = xac.getXAResource();
-
- Xid xid = XATestUtil.getXid(996, 9, 48);
-
- Connection conn = xac.getConnection();
-
- // Obtain Statements and PreparedStatements
- // with all the holdability options.
-
- showHoldStatus("Local ", conn);
-
- Statement sdh = conn.createStatement();
- showHoldStatus("Local(held) default ", sdh);
- checkHeldRS(conn, sdh, sdh.executeQuery("select * from app.foo"));
- PreparedStatement psdh = conn.prepareStatement("SELECT * FROM APP.FOO");
- PreparedStatement psdh_d = conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99");
- showHoldStatus("Local(held) default Prepared", psdh);
- checkHeldRS(conn, psdh, psdh.executeQuery());
-
- Statement shh = conn.createStatement(
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.HOLD_CURSORS_OVER_COMMIT);
- showHoldStatus("Local(held) held ", shh);
- checkHeldRS(conn, shh, shh.executeQuery("select * from app.foo"));
- PreparedStatement pshh =
- conn.prepareStatement("SELECT * FROM APP.FOO",
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.HOLD_CURSORS_OVER_COMMIT);
- PreparedStatement pshh_d =
- conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99",
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.HOLD_CURSORS_OVER_COMMIT);
- showHoldStatus("Local(held) held Prepared", pshh);
- checkHeldRS(conn, pshh, pshh.executeQuery());
-
- Statement sch = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.CLOSE_CURSORS_AT_COMMIT);
- showHoldStatus("Local(held) close ", sch);
- checkHeldRS(conn, sch, sch.executeQuery("select * from app.foo"));
- PreparedStatement psch =
- conn.prepareStatement("SELECT * FROM APP.FOO",
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.CLOSE_CURSORS_AT_COMMIT);
- PreparedStatement psch_d =
- conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99",
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.CLOSE_CURSORS_AT_COMMIT);
- showHoldStatus("Local(held) close Prepared", psch);
- checkHeldRS(conn, psch, psch.executeQuery());
-
- // set the connection's holdabilty to false
- conn.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT);
-
- Statement sdc = conn.createStatement();
- showHoldStatus("Local(close) default ", sdc);
- checkHeldRS(conn, sdc, sdc.executeQuery("select * from app.foo"));
- PreparedStatement psdc = conn.prepareStatement("SELECT * FROM APP.FOO");
- PreparedStatement psdc_d = conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99");
- showHoldStatus("Local(close) default Prepared", psdc);
- checkHeldRS(conn, psdc, psdc.executeQuery());
-
- Statement shc = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.HOLD_CURSORS_OVER_COMMIT);
- showHoldStatus("Local(close) held ", shc);
- checkHeldRS(conn, shc, shc.executeQuery("select * from app.foo"));
- PreparedStatement pshc =
- conn.prepareStatement("SELECT * FROM APP.FOO",
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.HOLD_CURSORS_OVER_COMMIT);
- PreparedStatement pshc_d =
- conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99",
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.HOLD_CURSORS_OVER_COMMIT);
- showHoldStatus("Local(close) held Prepared", pshc);
- checkHeldRS(conn, pshc, pshc.executeQuery());
-
- Statement scc = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.CLOSE_CURSORS_AT_COMMIT);
- showHoldStatus("Local(close) close ", scc);
- checkHeldRS(conn, scc, scc.executeQuery("select * from app.foo"));
- PreparedStatement pscc =
- conn.prepareStatement("SELECT * FROM APP.FOO",
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.CLOSE_CURSORS_AT_COMMIT);
- PreparedStatement pscc_d =
- conn.prepareStatement("DELETE FROM APP.FOO WHERE A < -99",
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.CLOSE_CURSORS_AT_COMMIT);
- showHoldStatus("Local(close) close Prepared", pscc);
- checkHeldRS(conn, pscc, pscc.executeQuery());
-
- // Revert back to holdable
+ public void testDerby966() throws SQLException, XAException {
+ XADataSource xads = J2EEDataSource.getXADataSource();
+ XAConnection xac = xads.getXAConnection();
+ XAResource xar = xac.getXAResource();
+
+ Xid xid = XATestUtil.getXid(996, 9, 48);
+
+ Connection conn = xac.getConnection();
+
+ // Obtain Statements and PreparedStatements
+ // with all the holdability options.
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, conn.getHoldability());
+
+ Statement sdh = conn.createStatement();
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, sdh
+ .getResultSetHoldability());
+
+ checkHeldRS(conn, sdh, sdh.executeQuery("select * from app.foo"));
+ PreparedStatement psdh = conn.prepareStatement("SELECT * FROM APP.FOO");
+ PreparedStatement psdh_d = conn
+ .prepareStatement("DELETE FROM APP.FOO WHERE A < -99");
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, psdh
+ .getResultSetHoldability());
+ checkHeldRS(conn, psdh, psdh.executeQuery());
+
+ Statement shh = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
+ ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, shh
+ .getResultSetHoldability());
+ checkHeldRS(conn, shh, shh.executeQuery("select * from app.foo"));
+ PreparedStatement pshh = conn.prepareStatement("SELECT * FROM APP.FOO",
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
+ ResultSet.HOLD_CURSORS_OVER_COMMIT);
+ PreparedStatement pshh_d = conn.prepareStatement(
+ "DELETE FROM APP.FOO WHERE A < -99",
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
+ ResultSet.HOLD_CURSORS_OVER_COMMIT);
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, shh
+ .getResultSetHoldability());
+ checkHeldRS(conn, pshh, pshh.executeQuery());
+
+ Statement sch = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
+ ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, sch
+ .getResultSetHoldability());
+
+ checkHeldRS(conn, sch, sch.executeQuery("select * from app.foo"));
+ PreparedStatement psch = conn.prepareStatement("SELECT * FROM APP.FOO",
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
+ ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ PreparedStatement psch_d = conn.prepareStatement(
+ "DELETE FROM APP.FOO WHERE A < -99",
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
+ ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psch_d
+ .getResultSetHoldability());
+ checkHeldRS(conn, psch, psch.executeQuery());
+
+ // set the connection's holdabilty to false
+ conn.setHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT);
+
+ Statement sdc = conn.createStatement();
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, sdc
+ .getResultSetHoldability());
+ checkHeldRS(conn, sdc, sdc.executeQuery("select * from app.foo"));
+ PreparedStatement psdc = conn.prepareStatement("SELECT * FROM APP.FOO");
+ PreparedStatement psdc_d = conn
+ .prepareStatement("DELETE FROM APP.FOO WHERE A < -99");
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psdc
+ .getResultSetHoldability());
+ checkHeldRS(conn, psdc, psdc.executeQuery());
+
+ Statement shc = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
+ ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psdc
+ .getResultSetHoldability());
+ checkHeldRS(conn, shc, shc.executeQuery("select * from app.foo"));
+ PreparedStatement pshc = conn.prepareStatement("SELECT * FROM APP.FOO",
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
+ ResultSet.HOLD_CURSORS_OVER_COMMIT);
+ PreparedStatement pshc_d = conn.prepareStatement(
+ "DELETE FROM APP.FOO WHERE A < -99",
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
+ ResultSet.HOLD_CURSORS_OVER_COMMIT);
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, pshc
+ .getResultSetHoldability());
+
+ checkHeldRS(conn, pshc, pshc.executeQuery());
+
+ Statement scc = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
+ ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, scc
+ .getResultSetHoldability());
+ checkHeldRS(conn, scc, scc.executeQuery("select * from app.foo"));
+ PreparedStatement pscc = conn.prepareStatement("SELECT * FROM APP.FOO",
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
+ ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ PreparedStatement pscc_d = conn.prepareStatement(
+ "DELETE FROM APP.FOO WHERE A < -99",
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
+ ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, pscc
+ .getResultSetHoldability());
+
+ checkHeldRS(conn, pscc, pscc.executeQuery());
+
+ // Revert back to holdable
+ conn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
+
+ ResultSet rs = sdh.executeQuery("SELECT * FROM APP.FOO");
+ rs.next();
+ // before commit
+ assertEquals(0, +rs.getInt(1));
+ conn.commit();
+ // aftercommit
+ rs.next();
+ assertEquals(1, rs.getInt(1));
+ rs.close();
+
+ // ensure a transaction is active to test DERBY-1025
+ rs = sdh.executeQuery("SELECT * FROM APP.FOO");
+
+ // This switch to global is ok because conn
+ // is in auto-commit mode, thus the start performs
+ // an implicit commit to complete the local transaction.
+
+ // start a global xact and test those statements.
+ xar.start(xid, XAResource.TMNOFLAGS);
+
+ // Statements not returning ResultSet's should be ok
+ sdh.executeUpdate("DELETE FROM APP.FOO where A < -99");
+ shh.executeUpdate("DELETE FROM APP.FOO where A < -99");
+ sch.executeUpdate("DELETE FROM APP.FOO where A < -99");
+
+ ArrayList openRS = new ArrayList();
+
+ // Statements obtained while default was hold.
+ // All should work, holability will be downgraded
+ // to close on commit for those Statements with hold set.
+ openRS.add(sdh.executeQuery("SELECT * FROM APP.FOO"));
+ openRS.add(shh.executeQuery("SELECT * FROM APP.FOO"));
+ openRS.add(sch.executeQuery("SELECT * FROM APP.FOO"));
+
+ // PreparedStatements obtained while default was hold.
+ // Holdability should be downgraded.
+ openRS.add(psdh.executeQuery());
+ openRS.add(pshh.executeQuery());
+ openRS.add(psch.executeQuery());
+
+ // Statements not returning ResultSet's should be ok
+ psdh_d.executeUpdate();
+ pshh_d.executeUpdate();
+ psch_d.executeUpdate();
+
+ // Statements not returning ResultSet's should be ok
+ sdc.executeUpdate("DELETE FROM APP.FOO where A < -99");
+ shc.executeUpdate("DELETE FROM APP.FOO where A < -99");
+ scc.executeUpdate("DELETE FROM APP.FOO where A < -99");
+
+ // Statements obtained while default was close.
+ // all should return close on commit ResultSets
+ openRS.add(sdc.executeQuery("SELECT * FROM APP.FOO"));
+ openRS.add(shc.executeQuery("SELECT * FROM APP.FOO"));
+ openRS.add(scc.executeQuery("SELECT * FROM APP.FOO"));
+
+ // PreparedStatements obtained while default was close.
+ openRS.add(psdc.executeQuery());
+ openRS.add(pshc.executeQuery());
+ openRS.add(pscc.executeQuery());
+
+ // Statements not returning ResultSet's should be ok
+ psdc_d.executeUpdate();
+ pshc_d.executeUpdate();
+ pscc_d.executeUpdate();
+
+ // All the ResultSets should be open. Run a simple
+ // test, clearWarnings throws an error if the ResultSet
+ // is closed. Also would be nice here to use the new
+ // JDBC 4.0 method getHoldabilty to ensure the
+ // holdability is reported correctly.
+ int orsCount = 0;
+ for (Iterator i = openRS.iterator(); i.hasNext();) {
+ ResultSet ors = (ResultSet) i.next();
+ ors.clearWarnings();
+ orsCount++;
+ }
+ assertEquals("Incorrect number of open result sets", 12, orsCount);
+
+ // Test we cannot switch the connection to holdable
+ try {
conn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
-
- ResultSet rs = sdh.executeQuery("SELECT * FROM APP.FOO");
- rs.next(); System.out.println("BGBC " + rs.getInt(1));
- conn.commit();
- rs.next(); System.out.println("BGAC " + rs.getInt(1));
- rs.close();
-
- // ensure a transaction is active to test DERBY-1025
- rs = sdh.executeQuery("SELECT * FROM APP.FOO");
-
- // This switch to global is ok because conn
- // is in auto-commit mode, thus the start performs
- // an implicit commit to complete the local transaction.
-
- System.out.println("START GLOBAL TRANSACTION");
- // start a global xact and test those statements.
- xar.start(xid, XAResource.TMNOFLAGS);
-
- // Statements not returning ResultSet's should be ok
- sdh.executeUpdate("DELETE FROM APP.FOO where A < -99");
- shh.executeUpdate("DELETE FROM APP.FOO where A < -99");
- sch.executeUpdate("DELETE FROM APP.FOO where A < -99");
-
- ArrayList openRS = new ArrayList();
-
- // Statements obtained while default was hold.
- // All should work, holability will be downgraded
- // to close on commit for those Statements with hold set.
- openRS.add(sdh.executeQuery("SELECT * FROM APP.FOO"));
- openRS.add(shh.executeQuery("SELECT * FROM APP.FOO"));
- openRS.add(sch.executeQuery("SELECT * FROM APP.FOO"));
-
-
- // PreparedStatements obtained while default was hold.
- // Holdability should be downgraded.
- openRS.add(psdh.executeQuery());
- openRS.add(pshh.executeQuery());
- openRS.add(psch.executeQuery());
-
- // Statements not returning ResultSet's should be ok
- psdh_d.executeUpdate();
- pshh_d.executeUpdate();
- psch_d.executeUpdate();
-
- // Statements not returning ResultSet's should be ok
- sdc.executeUpdate("DELETE FROM APP.FOO where A < -99");
- shc.executeUpdate("DELETE FROM APP.FOO where A < -99");
- scc.executeUpdate("DELETE FROM APP.FOO where A < -99");
-
- // Statements obtained while default was close.
- // all should return close on commit ResultSets
- openRS.add(sdc.executeQuery("SELECT * FROM APP.FOO"));
- openRS.add(shc.executeQuery("SELECT * FROM APP.FOO"));
- openRS.add(scc.executeQuery("SELECT * FROM APP.FOO"));
-
- // PreparedStatements obtained while default was close.
- openRS.add(psdc.executeQuery());
- openRS.add(pshc.executeQuery());
- openRS.add(pscc.executeQuery());
-
- // Statements not returning ResultSet's should be ok
- psdc_d.executeUpdate();
- pshc_d.executeUpdate();
- pscc_d.executeUpdate();
-
- // All the ResultSets should be open. Run a simple
- // test, clearWarnings throws an error if the ResultSet
- // is closed. Also would be nice here to use the new
- // JDBC 4.0 method getHoldabilty to ensure the
- // holdability is reported correctly.
- int orsCount = 0;
- for (Iterator i = openRS.iterator(); i.hasNext();) {
- ResultSet ors = (ResultSet) i.next();
- ors.clearWarnings();
- orsCount++;
- }
- System.out.println("Global transaction open ResultSets " + orsCount);
+ fail("FAIL - set holdability in global xact.");
+ } catch (SQLException sqle) {
+ assertSQLState("XJ05C", sqle);
+ }
-
- // Test we cannot switch the connection to 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);
- }
-
- // JDBC 4.0 (proposed final draft) section allows
- // drivers to change the holdability when creating
- // a Statement object and attach a warning to the Connection.
- Statement sglobalhold = conn.createStatement(
- ResultSet.TYPE_FORWARD_ONLY,
+ // JDBC 4.0 (proposed final draft) section allows
+ // drivers to change the holdability when creating
+ // a Statement object and attach a warning to the Connection.
+ Statement sglobalhold = conn.createStatement(
+ ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
+ ResultSet.HOLD_CURSORS_OVER_COMMIT);
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, sglobalhold
+ .getResultSetHoldability());
+
+ sglobalhold.close();
+
+ // DERBY2481 Client does not downgrade PreparedStatement holdability
+ if (!usingDerbyNetClient()) {
+ PreparedStatement psglobalhold = conn.prepareStatement(
+ "SELECT * FROM APP.FOO", ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
- showHoldStatus("Global createStatement(hold)", sglobalhold);
- sglobalhold.close();
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psglobalhold
+ .getResultSetHoldability());
- PreparedStatement psglobalhold = conn.prepareStatement(
- "SELECT * FROM APP.FOO",
- ResultSet.TYPE_FORWARD_ONLY,
- ResultSet.CONCUR_READ_ONLY,
- ResultSet.HOLD_CURSORS_OVER_COMMIT);
- showHoldStatus("Global prepareStatement(hold)", psglobalhold);
psglobalhold.close();
-
- if (!TestUtil.isDerbyNetClientFramework()) { //DERBY-1158 in progress
- // Show the holdability for all the Statements while
- // in the global transaction, all should be close on commit.
- showHoldStatus("Global xact Statement sdh ", sdh);
- showHoldStatus("Global xact Statement shh ", shh);
- showHoldStatus("Global xact Statement sch ", sch);
-
- showHoldStatus("Global xact Statement psdh ", psdh);
- showHoldStatus("Global xact Statement pshh ", pshh);
- showHoldStatus("Global xact Statement psch ", psch);
-
- showHoldStatus("Global xact Statement sdc ", sdc);
- showHoldStatus("Global xact Statement shc ", shc);
- showHoldStatus("Global xact Statement scc ", scc);
-
- showHoldStatus("Global xact Statement psdh_d ", psdh_d);
- showHoldStatus("Global xact Statement pshh_d ", pshh_d);
- showHoldStatus("Global xact Statement psch_d ", psch_d);
- }
-
-
- xar.end(xid, XAResource.TMSUCCESS);
- if (xar.prepare(xid) != XAResource.XA_RDONLY)
- System.out.println("FAIL prepare didn't indicate r/o");
-
- // All the ResultSets should be closed. Run a simple
- // test, clearWarnings throws an error if the ResultSet
- // is closed.
- int crsCount = 0;
- for (Iterator i = openRS.iterator(); i.hasNext();) {
- ResultSet crs = (ResultSet) i.next();
- try {
- crs.clearWarnings();
- } catch (SQLException sqle) {
- }
- crsCount++;
- }
- System.out.println("After global transaction closed ResultSets " + crsCount);
-
- // Check the statements revert to holdable as required.
- showHoldStatus("Global xact Statement sdh ", sdh);
- showHoldStatus("Global xact Statement shh ", shh);
- showHoldStatus("Global xact Statement sch ", sch);
-
- showHoldStatus("Global xact Statement psdh ", psdh);
- showHoldStatus("Global xact Statement pshh ", pshh);
- showHoldStatus("Global xact Statement psch ", psch);
-
- showHoldStatus("Global xact Statement sdc ", sdc);
- showHoldStatus("Global xact Statement shc ", shc);
- showHoldStatus("Global xact Statement scc ", scc);
-
- showHoldStatus("Global xact Statement psdh_d ", psdh_d);
- showHoldStatus("Global xact Statement pshh_d ", pshh_d);
- showHoldStatus("Global xact Statement psch_d ", psch_d);
-
- conn.close();
-
- System.out.println("derby966 complete");
-
- } catch (SQLException e) {
- TestUtil.dumpSQLExceptions(e);
- e.printStackTrace(System.out);
- } catch (XAException e) {
- XATestUtil.dumpXAException("derby966", e);
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, sdh
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, sch
+ .getResultSetHoldability());
+
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psdh
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, pshh
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psch
+ .getResultSetHoldability());
+
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, sdc
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, shc
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, scc
+ .getResultSetHoldability());
+
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psdh_d
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, pshh_d
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psch_d
+ .getResultSetHoldability());
}
+
+ xar.end(xid, XAResource.TMSUCCESS);
+ if (xar.prepare(xid) != XAResource.XA_RDONLY)
+ fail("FAIL prepare didn't indicate r/o");
+
+ // All the ResultSets should be closed. Run a simple
+ // test, clearWarnings throws an error if the ResultSet
+ // is closed.
+ int crsCount = 0;
+ for (Iterator i = openRS.iterator(); i.hasNext();) {
+ ResultSet crs = (ResultSet) i.next();
+ try {
+ crs.clearWarnings();
+ } catch (SQLException sqle) {
+ }
+ crsCount++;
+ }
+ assertEquals("After global transaction closed ResultSets ", 12,
+ crsCount);
+
+ // Check the statements revert to holdable as required.
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, sdh
+ .getResultSetHoldability());
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, shh
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, sch
+ .getResultSetHoldability());
+
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, psdh
+ .getResultSetHoldability());
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, pshh
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psch
+ .getResultSetHoldability());
+
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, sdc
+ .getResultSetHoldability());
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, shc
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, scc
+ .getResultSetHoldability());
+
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, psdh_d
+ .getResultSetHoldability());
+ assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, pshh_d
+ .getResultSetHoldability());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, psch_d
+ .getResultSetHoldability());
+
+ conn.close();
+
}
-
+
/**
- * Check the held state of a ResultSet by fetching
- * one row, executing a commit and then fetching the
- * next. Checks the held state matches the behaviour.
- */
- private static void checkHeldRS(Connection conn,
- Statement s, ResultSet rs) throws SQLException
- {
- if (s.getConnection() != conn)
- System.out.println("FAIL - mismatched statement & Connection");
- if (rs.getStatement() != s)
- {
+ * Check the held state of a ResultSet by fetching one row, executing a
+ * commit and then fetching the next. Checks the held state matches the
+ * behaviour.
+ */
+ private static void checkHeldRS(Connection conn, Statement s, ResultSet rs)
+ throws SQLException {
+ // DERBY-1008 - can't run with client
+ if (!usingDerbyNetClient()) {
+ if (s.getConnection() != conn)
+ fail("FAIL - mismatched statement & Connection");
+ }
+ if (rs.getStatement() != s) {
// DERBY-1009
- System.out.println("FAIL - mismatched statement & ResultSet");
- System.out.println("Statement class " + s.getClass());
- System.out.println("ResultSet' Statements class " + rs.getStatement().getClass());
- }
-
- boolean held = s.getResultSetHoldability() ==
- ResultSet.HOLD_CURSORS_OVER_COMMIT;
-
- System.out.println("ResultSet " + holdStatus(s.getResultSetHoldability()));
-
+ fail("FAIL - mismatched statement & ResultSet "
+ + " Statement class " + s.getClass()
+ + " ResultSet' Statements class "
+ + rs.getStatement().getClass());
+ }
+
+ boolean held = (ResultSet.HOLD_CURSORS_OVER_COMMIT == s
+ .getResultSetHoldability());
rs.next();
- System.out.println(" BC A=" + rs.getInt(1));
+ assertEquals(0, rs.getInt(1));
conn.commit();
-
+
try {
- while (rs.next())
- {
- rs.getInt(1);
- System.out.println(" AC A=" + rs.getInt(1));
- }
- if (!held)
- System.out.println("FAIL: non-held cursor not closed by commit");
- } catch (SQLException sqle)
- {
+ rs.next();
+ } catch (SQLException sqle) {
boolean ok = !held;
- boolean showError = true;
+
if (ok) {
- if (TestUtil.isEmbeddedFramework()) {
- if ("XCL16".equals(sqle.getSQLState()))
- showError = false;
- } else if (TestUtil.isDerbyNetClientFramework()) {
- // No SQL state yet from client error.
- showError = false;
- }
+ assertSQLState("XCL16", sqle);
+ } else {
+ fail("Held cursor closed on commit");
}
- if (showError)
- TestUtil.dumpSQLExceptions(sqle, ok);
- else if (ok)
- System.out.println("Non-held ResultSet correctly closed after commit");
}
-
+
rs.close();
conn.commit();
}
-
- /**
- * Show the held status of the Statement.
- */
- private static void showHoldStatus(String tag, Statement s) throws SQLException
- {
- System.out.println(tag + "Statement holdable " +
- holdStatus(s.getResultSetHoldability()));
- SQLWarning w = s.getConnection().getWarnings();
- while (w != null)
- {
- System.out.println(w.getSQLState() + " :" + w.toString());
- w = w.getNextWarning();
- }
- s.getConnection().clearWarnings();
-
- }
- /**
- * Show the held status of the Connection.
- */
- private static void showHoldStatus(String tag, Connection conn) throws SQLException
- {
- System.out.println(tag + "Connection holdable " +
- holdStatus(conn.getHoldability()));
- }
-
- private static String holdStatus(int holdability)
- {
- String s;
- switch (holdability)
- {
- case ResultSet.CLOSE_CURSORS_AT_COMMIT:
- s = "CLOSE_CURSORS_AT_COMMIT ";
- break;
- case ResultSet.HOLD_CURSORS_OVER_COMMIT:
- s = "HOLD_CURSORS_OVER_COMMIT ";
- break;
- default:
- s = "UNKNOWN HOLDABILITY ";
- break;
- }
-
- return s + Integer.toString(holdability);
+
+ public static Test baseSuite(String name) {
+ TestSuite suite = new TestSuite(name);
+ suite.addTestSuite(XATest.class);
+
+ return new CleanDatabaseTestSetup(suite) {
+ /**
+ * Creates the table used in the test cases.
+ *
+ */
+ protected void decorateSQL(Statement s) throws SQLException {
+ Connection conn = getConnection();
+ XATestUtil.createXATransactionView(conn);
+ }
+
+ };
}
-
- /*
- * 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>
+ /**
+ * Runs the test fixtures in embedded and client.
+ *
+ * @return test suite
*/
- private static void interleavingTransactions5(XADataSource xads) throws SQLException
- {
- System.out.println("interleavingTransactions5");
-
- XAConnection xac = xads.getXAConnection("mamta", "mamtapwd");
-
+ public static Test suite() {
+ TestSuite suite = new TestSuite("XATest");
+ // no XA for JSR169
+ if (JDBC.vmSupportsJSR169())
+ return suite;
+ suite.addTest(baseSuite("XATest:embedded"));
+
+ suite.addTest(TestConfiguration
+ .clientServerDecorator(baseSuite("XATest:client")));
+ return suite;
}
- private static void cleanUp(Connection conn) throws SQLException
- {
- String testObjects[] = { "view XATESTUTIL.global_xactTable",
- "schema XATESTUTIL restrict", "table app.foo", "table foo" };
- Statement stmt = conn.createStatement();
- TestUtil.cleanUpTest(stmt, testObjects);
- conn.commit();
- stmt.close();
- }
-
}
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/J2EEDataSource.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/J2EEDataSource.java?view=diff&rev=521854&r1=521853&r2=521854
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/J2EEDataSource.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/J2EEDataSource.java Fri Mar 23 11:38:28 2007
@@ -68,6 +68,20 @@
{
return getXADataSource(TestConfiguration.getCurrent(), (HashMap) null);
}
+
+
+ /**
+ * Set a bean property for a data source. This code can be used
+ * on any data source type.
+ * @param ds DataSource to have property set
+ * @param property name of property.
+ * @param value Value, type is derived from value's class.
+ */
+ public static void setBeanProperty(Object ds, String property, Object value) {
+ // reuse code from JDBCDataSource
+ JDBCDataSource.setBeanProperty(ds, property, value);
+ }
+
/**
* Create a new DataSource object setup from the passed in TestConfiguration.
* The getXAConnection() method is configured