You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2007/04/20 16:34:49 UTC
svn commit: r530827 - in /incubator/openjpa/branches/0.9.7-incubating-RC2:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/
openjpa-persistence-jdbc/src/test/resources/o...
Author: mikedd
Date: Fri Apr 20 07:34:48 2007
New Revision: 530827
URL: http://svn.apache.org/viewvc?view=rev&rev=530827
Log:
OpenJPA-222 and copyright fixes for RC2.
Modified:
incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestIsolationLevelOverride.java
incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestSelectForUpdateOverride.java
incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/xml/orm.xml
incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/CHANGES.txt
incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/RELEASE-NOTES.html
Modified: incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java?view=diff&rev=530827&r1=530826&r2=530827
==============================================================================
--- incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java (original)
+++ incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java Fri Apr 20 07:34:48 2007
@@ -39,7 +39,7 @@
private int db2ServerType = 0;
private static final int db2ISeriesV5R3AndEarlier = 1;
private static final int db2UDBV81OrEarlier = 2;
- private static final int db2ZOSV8x = 3;
+ private static final int db2ZOSV8xOrLater = 3;
private static final int db2UDBV82AndLater = 4;
private static final int db2ISeriesV5R4AndLater = 5;
private static final String forUpdateOfClause = "FOR UPDATE OF";
@@ -195,8 +195,8 @@
db2ServerType = db2ISeriesV5R3AndEarlier;
else if (isDB2UDBV81OrEarlier(metaData,maj,min))
db2ServerType = db2UDBV81OrEarlier;
- else if (isDB2ZOSV8x(metaData,maj))
- db2ServerType = db2ZOSV8x;
+ else if (isDB2ZOSV8xOrLater(metaData,maj))
+ db2ServerType = db2ZOSV8xOrLater;
else if (isDB2UDBV82AndLater(metaData,maj,min))
db2ServerType = db2UDBV82AndLater;
else if (isDB2ISeriesV5R4AndLater(metaData))
@@ -245,45 +245,38 @@
else
isolationLevel = conf.getTransactionIsolationConstant();
- if (!forUpdate) {
- // This sql is not for update so add FOR Read Only clause
- forUpdateString.append(" ").append(forReadOnlyClause)
- .append(" ");
- } else {
-
+ if (forUpdate) {
switch(db2ServerType) {
case db2ISeriesV5R3AndEarlier:
case db2UDBV81OrEarlier:
if (isolationLevel ==
Connection.TRANSACTION_READ_UNCOMMITTED) {
forUpdateString.append(" ").append(withRSClause)
- .append(" ").append(forUpdateOfClause).append(" ");
- } else {
- forUpdateString.append(" ").append(forUpdateOfClause)
- .append(" ");
- }
+ .append(" ").append(forUpdateOfClause);
+ } else
+ forUpdateString.append(" ").append(forUpdateOfClause);
break;
- case db2ZOSV8x:
+ case db2ZOSV8xOrLater:
case db2UDBV82AndLater:
if (isolationLevel == Connection.TRANSACTION_SERIALIZABLE) {
- forUpdateString.append(" ").append(withRRClause)
- .append(" ").append(useKeepUpdateLockClause)
- .append(" ");
+ forUpdateString.append(" ").append(forReadOnlyClause)
+ .append(" ").append(withRRClause)
+ .append(" ").append(useKeepUpdateLockClause);
} else {
- forUpdateString.append(" ").append(withRSClause)
- .append(" ").append(useKeepUpdateLockClause)
- .append(" ");
+ forUpdateString.append(" ").append(forReadOnlyClause)
+ .append(" ").append(withRSClause)
+ .append(" ").append(useKeepUpdateLockClause);
}
break;
case db2ISeriesV5R4AndLater:
if (isolationLevel == Connection.TRANSACTION_SERIALIZABLE) {
- forUpdateString.append(" ").append(withRRClause)
- .append(" ").append(useKeepExclusiveLockClause)
- .append(" ");
+ forUpdateString.append(" ").append(forReadOnlyClause)
+ .append(" ").append(withRRClause)
+ .append(" ").append(useKeepExclusiveLockClause);
} else {
- forUpdateString.append(" ").append(withRSClause)
- .append(" ").append(useKeepExclusiveLockClause)
- .append(" ");
+ forUpdateString.append(" ").append(forReadOnlyClause)
+ .append(" ").append(withRSClause)
+ .append(" ").append(useKeepExclusiveLockClause);
}
break;
}
@@ -305,11 +298,11 @@
return match;
}
- public boolean isDB2ZOSV8x(DatabaseMetaData metadata, int maj)
+ public boolean isDB2ZOSV8xOrLater(DatabaseMetaData metadata, int maj)
throws SQLException {
boolean match = false;
if (metadata.getDatabaseProductVersion().indexOf("DSN") != -1
- && maj == 8)
+ && maj >= 8)
match = true;
return match;
}
@@ -414,4 +407,8 @@
return sqle.getMessage();
}
}
- }
+
+ public int getDb2ServerType() {
+ return db2ServerType;
+ }
+}
Modified: incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestIsolationLevelOverride.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestIsolationLevelOverride.java?view=diff&rev=530827&r1=530826&r2=530827
==============================================================================
--- incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestIsolationLevelOverride.java (original)
+++ incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestIsolationLevelOverride.java Fri Apr 20 07:34:48 2007
@@ -82,18 +82,89 @@
.getIsolation());
q.getResultList();
+ if (dict instanceof DB2Dictionary &&((((DB2Dictionary)dict).
+ getDb2ServerType() == 1) || ((DB2Dictionary)dict)
+ .getDb2ServerType()== 2)) {
+ assertEquals(1, sql.size());
+ assertSQL("SELECT t0.id, t0.booleanField, t0.byteField,"
+ + " t0.charField, t0.dateField, t0.doubleField,"
+ + " t0.floatField, t0.intField, t0.longField, "
+ + "t0.shortField, t0.stringField FROM "
+ + "AllFieldTypes t0 WHERE \\(t0.intField = \\?\\) "
+ + " FOR UPDATE OF");
+ }
+
+ // it is DB2 v82 or later
+ else if (dict instanceof DB2Dictionary &&((((DB2Dictionary)dict).
+ getDb2ServerType() == 3) || ((DB2Dictionary)dict)
+ .getDb2ServerType() == 4)) {
+ assertEquals(1, sql.size());
+ assertSQL("SELECT t0.id, t0.booleanField, t0.byteField,"
+ + " t0.charField, t0.dateField, t0.doubleField,"
+ + " t0.floatField, t0.intField, t0.longField, "
+ + "t0.shortField, t0.stringField FROM "
+ + "AllFieldTypes t0 WHERE \\(t0.intField = \\?\\) "
+ + " FOR READ ONLY WITH RR USE AND KEEP UPDATE LOCKS");
+ }
+
+ else if (dict instanceof DB2Dictionary && ((DB2Dictionary)dict).
+ getDb2ServerType() == 5){
+ assertEquals(1, sql.size());
+ assertSQL("SELECT t0.id, t0.booleanField, t0.byteField,"
+ + " t0.charField, t0.dateField, t0.doubleField,"
+ + " t0.floatField, t0.intField, t0.longField, "
+ + "t0.shortField, t0.stringField FROM "
+ + "AllFieldTypes t0 WHERE \\(t0.intField = \\?\\) "
+ + " FOR READ ONLY WITH RR USE AND KEEP EXCLUSIVE "
+ + "LOCKS");
+ }
+ else if (dict instanceof DB2Dictionary) {
+ fail("OpenJPA currently only supports per-query isolation "
+ + "level configuration on the following databases: DB2");
+ }
} else {
((JDBCFetchPlan) em.getFetchPlan())
.setIsolation(IsolationLevel.SERIALIZABLE);
em.find(AllFieldTypes.class, 0);
- }
-
- if (dict instanceof DB2Dictionary) {
- assertEquals(1, sql.size());
- assertSQL(".*DB2-specific SQL to test for goes here.*");
- } else {
- fail("OpenJPA currently only supports per-query isolation " +
- "level configuration on the following databases: DB2");
+ if (dict instanceof DB2Dictionary &&((((DB2Dictionary)dict).
+ getDb2ServerType() == 1) || ((DB2Dictionary)dict)
+ .getDb2ServerType()== 2)) {
+ assertEquals(1, sql.size());
+ assertSQL("SELECT t0.booleanField, t0.byteField, "
+ + "t0.charField, t0.dateField, t0.doubleField,"
+ + " t0.floatField, t0.intField, t0.longField,"
+ + " t0.shortField, t0.stringField FROM "
+ + "AllFieldTypes t0 WHERE t0.id = \\? "
+ + " FOR UPDATE OF optimize for 1 row");
+ }
+ // it is DB2 v82 or later
+ else if (dict instanceof DB2Dictionary &&((((DB2Dictionary)dict).
+ getDb2ServerType() == 3) || ((DB2Dictionary)dict)
+ .getDb2ServerType() == 4)) {
+ assertEquals(1, sql.size());
+ assertSQL("SELECT t0.booleanField, t0.byteField, "
+ + "t0.charField, t0.dateField, t0.doubleField,"
+ + " t0.floatField, t0.intField, t0.longField,"
+ + " t0.shortField, t0.stringField FROM "
+ + "AllFieldTypes t0 WHERE t0.id = \\? "
+ + " FOR READ ONLY WITH RR USE AND KEEP UPDATE LOCKS"
+ + " optimize for 1 row");
+ }
+ else if (dict instanceof DB2Dictionary && ((DB2Dictionary)dict).
+ getDb2ServerType() == 5) {
+ assertEquals(1, sql.size());
+ assertSQL("SELECT t0.booleanField, t0.byteField, "
+ + "t0.charField, t0.dateField, t0.doubleField,"
+ + " t0.floatField, t0.intField, t0.longField,"
+ + " t0.shortField, t0.stringField FROM "
+ + "AllFieldTypes t0 WHERE t0.id = \\? "
+ + " FOR READ ONLY WITH RR USE AND KEEP EXCLUSIVE LOCKS"
+ + " optimize for 1 row");
+ }
+ else if (dict instanceof DB2Dictionary) {
+ fail("OpenJPA currently only supports per-query isolation "
+ + "level configuration on the following databases: DB2");
+ }
}
} catch (InvalidStateException pe) {
// if we're not using DB2, we expect an InvalidStateException.
Modified: incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestSelectForUpdateOverride.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestSelectForUpdateOverride.java?view=diff&rev=530827&r1=530826&r2=530827
==============================================================================
--- incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestSelectForUpdateOverride.java (original)
+++ incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/TestSelectForUpdateOverride.java Fri Apr 20 07:34:48 2007
@@ -26,6 +26,7 @@
import org.apache.openjpa.persistence.OpenJPAPersistence;
import org.apache.openjpa.persistence.FetchPlan;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
+import org.apache.openjpa.jdbc.sql.DB2Dictionary;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.jdbc.sql.HSQLDictionary;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
@@ -58,7 +59,45 @@
em.find(AllFieldTypes.class, 0);
assertEquals(1, sql.size());
- assertSQL(".*FOR UPDATE.*");
+ if (dict instanceof DB2Dictionary &&((((DB2Dictionary)dict).
+ getDb2ServerType() == 1) || ((DB2Dictionary)dict)
+ .getDb2ServerType()== 2)) {
+ assertEquals(1, sql.size());
+ assertSQL("SELECT t0.booleanField, t0.byteField, "
+ + "t0.charField, t0.dateField, t0.doubleField,"
+ + " t0.floatField, t0.intField, t0.longField,"
+ + " t0.shortField, t0.stringField FROM "
+ + "AllFieldTypes t0 WHERE t0.id = \\? "
+ + " FOR UPDATE OF optimize for 1 row");
+ }
+ // it is DB2 v82 or later
+ else if (dict instanceof DB2Dictionary &&((((DB2Dictionary)dict).
+ getDb2ServerType() == 3) || ((DB2Dictionary)dict)
+ .getDb2ServerType() == 4)) {
+ assertEquals(1, sql.size());
+ assertSQL("SELECT t0.booleanField, t0.byteField, "
+ + "t0.charField, t0.dateField, t0.doubleField,"
+ + " t0.floatField, t0.intField, t0.longField,"
+ + " t0.shortField, t0.stringField FROM "
+ + "AllFieldTypes t0 WHERE t0.id = \\? "
+ + " FOR READ ONLY WITH RS USE AND KEEP UPDATE LOCKS"
+ + " optimize for 1 row");
+ }
+ else if (dict instanceof DB2Dictionary && ((DB2Dictionary)dict).
+ getDb2ServerType() == 5) {
+ assertEquals(1, sql.size());
+ assertSQL("SELECT t0.booleanField, t0.byteField, "
+ + "t0.charField, t0.dateField, t0.doubleField,"
+ + " t0.floatField, t0.intField, t0.longField,"
+ + " t0.shortField, t0.stringField FROM "
+ + "AllFieldTypes t0 WHERE t0.id = \\? "
+ + " FOR READ ONLY WITH RS USE AND KEEP EXCLUSIVE LOCKS"
+ + " optimize for 1 row");
+ }
+ else if (dict instanceof DB2Dictionary) {
+ fail("OpenJPA currently only supports per-query isolation " +
+ "level configuration on the following databases: DB2");
+ }
} finally {
em.getTransaction().rollback();
em.close();
Modified: incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/xml/orm.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/xml/orm.xml?view=diff&rev=530827&r1=530826&r2=530827
==============================================================================
--- incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/xml/orm.xml (original)
+++ incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/xml/orm.xml Fri Apr 20 07:34:48 2007
@@ -1,5 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
Modified: incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/CHANGES.txt?view=diff&rev=530827&r1=530826&r2=530827
==============================================================================
--- incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/CHANGES.txt (original)
+++ incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/CHANGES.txt Fri Apr 20 07:34:48 2007
@@ -60,6 +60,7 @@
* [OPENJPA-202] - after invoking LRS processing in a client by calling an @LRS annotated relationship, the next em.clear()/em.close() gets org.apache.openjpa.persistence.InvalidStateException: You cannot transfer large result set fields from one object or field to another
* [OPENJPA-208] - NoResultException and NonUniqueResultException are not thrown when expected
* [OPENJPA-214] - Need to support floating point primary keys
+ * [OPENJPA-222] - FOR READ ONLY clause getting generated for subselects
** Improvements
* [OPENJPA-10] - persistence unit name should be default diagnostic context for standard OpenJPA log impl
Modified: incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/RELEASE-NOTES.html
URL: http://svn.apache.org/viewvc/incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/RELEASE-NOTES.html?view=diff&rev=530827&r1=530826&r2=530827
==============================================================================
--- incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/RELEASE-NOTES.html (original)
+++ incubator/openjpa/branches/0.9.7-incubating-RC2/openjpa-project/RELEASE-NOTES.html Fri Apr 20 07:34:48 2007
@@ -5,6 +5,7 @@
<ul>
<li><a href="#Overview">Overview</a></li>
+<li><a href="#License">License</a></li>
<li><a href="#Prerequisites">Prerequisites</a></li>
<li><a href="#Documentation">Documentation</a></li>
<li><a href="#GetInvolved">Getting Involved</a></li>
@@ -33,6 +34,28 @@
site: <a href="http://incubator.apache.org/openjpa/">
http://incubator.apache.org/openjpa/</a>
+<h2><a name="License"></a>License</h2>
+<P>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
+
+<BR><P><a href="http://www.apache.org/licenses/LICENSE-2.0">
+http://www.apache.org/licenses/LICENSE-2.0</a>
+
+<BR><P>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.
+
+<BR><P>The license may also be found in LICENSE.txt which is included
+in each release of OpenJPA.
+
<h2><a name="Prerequisites"></a>Prerequisites</h2>
<P>
OpenJPA requires Java 1.5 but will not compile with Java 6. For more
@@ -135,6 +158,7 @@
<li>[<a href='https://issues.apache.org/jira/browse/OPENJPA-202'>OPENJPA-202</a>] - after invoking LRS processing in a client by calling an @LRS annotated relationship, the next em.clear()/em.close() gets org.apache.openjpa.persistence.InvalidStateException: You cannot transfer large result set fields from one object or field to another</li>
<li>[<a href='https://issues.apache.org/jira/browse/OPENJPA-208'>OPENJPA-208</a>] - NoResultException and NonUniqueResultException are not thrown when expected</li>
<li>[<a href='https://issues.apache.org/jira/browse/OPENJPA-214'>OPENJPA-214</a>] - Need to support floating point primary keys</li>
+<li>[<a href='https://issues.apache.org/jira/browse/OPENJPA-214'>OPENJPA-222</a>] - FOR READ ONLY clause getting generated for subselects</li>
</ul>
<h2><a name="Improvements"</a>Improvements</h2>