Hi David,

The DB2Dictionary class doesn't compile with 1.4 due to autoboxing. Can you please fix this?

Craig

public String getForUpdateClause(JDBCFetchConfiguration fetch, boolean forUpdate) {
        String isolationLevel = null;
        Boolean updateClause = null;
        DatabaseMetaData metaData = null;
        StringBuffer forUpdateString = new StringBuffer();
        try {
            // Determine the update clause/isolationLevel the hint
            // overrides the persistence.xml value
if (fetch != null && fetch.getHint ("openjpa.hint.updateClause")
                !=null )
                updateClause = (Boolean)fetch.
                getHint("openjpa.hint.updateClause");
            else
updateClause = forUpdate; <=========================================== here if (fetch != null &&fetch.getHint ("openjpa.hint.isolationLevel")
                !=null )
                isolationLevel = (String)fetch.
                getHint("openjpa.hint.isolationLevel");
            else
                isolationLevel = conf.getTransactionIsolation();
if (updateClause == false) <=========================================== here //This sql is not for update so add FOR Read Only clause
                forUpdateString.append(" ").append(forReadOnlyClause)
                .append(" ");
else if (updateClause == true) { <=========================================== here


On Apr 3, 2007, at 12:35 PM, [EMAIL PROTECTED] wrote:

Author: wisneskid
Date: Tue Apr  3 12:34:59 2007
New Revision: 525252

URL: http://svn.apache.org/viewvc?view=rev&rev=525252
Log:
changes for JIRA OPENJPA-182

Modified:
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/ openjpa/jdbc/sql/AbstractDB2Dictionary.java incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/ openjpa/jdbc/sql/DB2Dictionary.java

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/ apache/openjpa/jdbc/sql/AbstractDB2Dictionary.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa- jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ AbstractDB2Dictionary.java?view=diff&rev=525252&r1=525251&r2=525252 ====================================================================== ======== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/ openjpa/jdbc/sql/AbstractDB2Dictionary.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/ openjpa/jdbc/sql/AbstractDB2Dictionary.java Tue Apr 3 12:34:59 2007
@@ -52,7 +52,7 @@
         supportsLockingWithOrderClause = false;
         supportsLockingWithOuterJoin = false;
         supportsLockingWithInnerJoin = false;
-        supportsLockingWithSelectRange = false;
+        supportsLockingWithSelectRange = true;

         requiresAutoCommitForMetaData = true;
         requiresAliasForSubselect = true;

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/ apache/openjpa/jdbc/sql/DB2Dictionary.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa- jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java? view=diff&rev=525252&r1=525251&r2=525252 ====================================================================== ======== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/ openjpa/jdbc/sql/DB2Dictionary.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/ openjpa/jdbc/sql/DB2Dictionary.java Tue Apr 3 12:34:59 2007
@@ -15,13 +15,15 @@
  */
 package org.apache.openjpa.jdbc.sql;

+import java.lang.reflect.Method;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.SQLException;
 import java.util.Arrays;
-
+import java.util.StringTokenizer;
 import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
 import org.apache.openjpa.jdbc.schema.Sequence;
+import org.apache.openjpa.lib.log.Log;

 /**
  * Dictionary for IBM DB2 database.
@@ -31,7 +33,18 @@

     public String optimizeClause = "optimize for";
     public String rowClause = "row";
-
+    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 db2UDBV82AndLater = 4;
+    private static final int  db2ISeriesV5R4AndLater = 5;
+       private static final String  forUpdateOfClause="FOR UPDATE OF";
+    private static final String  withRSClause="WITH RS";
+    private static final String  withRRClause="WITH RR";
+ private static final String useKeepUpdateLockClause= "USE AND KEEP UPDATE LOCKS"; + private static final String useKeepExclusiveLockClause="USE AND KEEP EXCLUSIVE LOCKS";
+    private static final String  forReadOnlyClause = "FOR READ ONLY";
     public DB2Dictionary() {
         platform = "DB2";
         validationSQL = "SELECT DISTINCT(CURRENT TIMESTAMP) FROM "
@@ -170,6 +183,18 @@
        if (isJDBC3(metaData)) {
                        int maj = metaData.getDatabaseMajorVersion();
                int min = metaData.getDatabaseMinorVersion();
+               
+               // Determine the type of DB2 database
+               if (isDB2ISeriesV5R3AndEarlier(metaData))
+                   db2ServerType =db2ISeriesV5R3AndEarlier;
+               else if (isDB2UDBV81OrEarlier(metaData,maj,min))
+                   db2ServerType =db2UDBV81OrEarlier;
+               else if (isDB2ZOSV8x(metaData,maj))
+                   db2ServerType =db2ZOSV8x;
+               else if (isDB2UDBV82AndLater(metaData,maj,min))
+                   db2ServerType=db2UDBV82AndLater;
+               else if (isDB2ISeriesV5R4AndLater(metaData))
+                   db2ServerType=db2ISeriesV5R4AndLater;

                if (maj >= 9 || (maj == 8 && min >= 2)) {
                        supportsLockingWithMultipleTables = true;
@@ -198,13 +223,221 @@
         }
     }

+    /** Get the update clause for the query based on the
+     * updateClause and isolationLevel hints
+     */
+ public String getForUpdateClause(JDBCFetchConfiguration fetch, boolean forUpdate) {
+        String isolationLevel = null;
+        Boolean updateClause = null;
+        DatabaseMetaData metaData = null;
+        StringBuffer forUpdateString = new StringBuffer();
+        try {
+            // Determine the update clause/isolationLevel the hint
+            // overrides the persistence.xml value
+ if (fetch != null && fetch.getHint ("openjpa.hint.updateClause")
+                !=null )
+                updateClause = (Boolean)fetch.
+                getHint("openjpa.hint.updateClause");
+            else
+                updateClause = forUpdate;
+ if (fetch != null &&fetch.getHint ("openjpa.hint.isolationLevel")
+                !=null )
+                isolationLevel = (String)fetch.
+                getHint("openjpa.hint.isolationLevel");
+            else
+                isolationLevel = conf.getTransactionIsolation();
+            if (updateClause == false)
+ //This sql is not for update so add FOR Read Only clause
+                forUpdateString.append(" ").append(forReadOnlyClause)
+                .append(" ");
+            else if (updateClause == true){
+
+                switch(db2ServerType){
+                case db2ISeriesV5R3AndEarlier:
+                case db2UDBV81OrEarlier:
+                    if (isolationLevel.equals("read-uncommitted"))
+ forUpdateString.append(" ").append (withRSClause) + .append(" ").append (forUpdateOfClause).append(" ");
+                    else
+ forUpdateString.append(" ").append (forUpdateOfClause)
+                        .append(" ");
+                    break;
+                case db2ZOSV8x:
+                case db2UDBV82AndLater:
+                    if (isolationLevel.equals("serializable"))
+ forUpdateString.append(" ").append (withRRClause)
+                        .append(" ").append(useKeepUpdateLockClause)
+                        .append(" ");
+                    else
+ forUpdateString.append(" ").append (withRSClause)
+                        .append(" ").append(useKeepUpdateLockClause)
+                        .append(" ");        
+                    break;
+                case db2ISeriesV5R4AndLater:
+                    if (isolationLevel.equals("serializable"))
+ forUpdateString.append(" ").append (withRRClause) + .append(" ").append (useKeepExclusiveLockClause)
+                        .append(" ");
+                    else
+ forUpdateString.append(" ").append (withRSClause) + .append(" ").append (useKeepExclusiveLockClause)
+                        .append(" ");        
+                }
+            }
+        }
+        catch (Exception e) {
+            if (log.isTraceEnabled())
+                log.error(e.toString(),e);
+        }
+        return forUpdateString.toString();
+    }
+
+
+ /** Override the DBDictionary toSelect to call getOptimizeClause and append
+     *   to the select string
+     */
+ public SQLBuffer toSelect(SQLBuffer selects, JDBCFetchConfiguration fetch,
+       SQLBuffer from, SQLBuffer where, SQLBuffer group,
+       SQLBuffer having, SQLBuffer order,
+       boolean distinct, boolean forUpdate, long start, long end,
+       int expectedResultCount) {
+       String forUpdateString = getForUpdateClause(fetch,forUpdate);
+       SQLBuffer selString = toOperation(getSelectOperation(fetch),
+            selects, from, where,
+            group, having, order, distinct,
+            forUpdate, start, end,forUpdateString);
+        return selString;
+    }
+
+ public boolean isDB2UDBV82AndLater(DatabaseMetaData metadata, int maj,
+        int min) throws SQLException {
+        boolean match = false;
+        if (metadata.getDatabaseProductVersion().indexOf("SQL") != -1
+            && ((maj ==8 && min >=2) ||(maj >=8)))
+            match = true;
+        return match;
+    }
+
+    public boolean isDB2ZOSV8x(DatabaseMetaData metadata,int maj)
+       throws SQLException {
+       boolean match = false;
+       if (metadata.getDatabaseProductVersion().indexOf("DSN") != -1
+           && maj ==8 )
+           match = true;
+        return match;
+    }
+
+ public boolean isDB2ISeriesV5R3AndEarlier(DatabaseMetaData metadata)
+       throws SQLException {
+       boolean match = false;
+       if (metadata.getDatabaseProductVersion().indexOf("AS") != -1
+ && generateVersionNumber (metadata.getDatabaseProductVersion())
+           <= 530 )
+           match = true;
+       return match;
+    }
+
+ public boolean isDB2ISeriesV5R4AndLater(DatabaseMetaData metadata)
+       throws SQLException {
+       boolean match = false;
+       if (metadata.getDatabaseProductVersion().indexOf("AS") != -1
+ && generateVersionNumber (metadata.getDatabaseProductVersion())
+           >= 540 )
+           match = true;
+      return match;
+    }
+
+ public boolean isDB2UDBV81OrEarlier(DatabaseMetaData metadata,int maj,
+        int min) throws SQLException {
+        boolean match = false;
+ if (metadata.getDatabaseProductVersion().indexOf("SQL") != -1 &&
+           ((maj ==8 && min <=1)|| maj <8 ))
+            match = true;
+        return match;
+    }
+
+    /** Get the version number for the ISeries
+     */
+    protected  int generateVersionNumber(String versionString) {
+ String s = versionString.substring(versionString.indexOf ('V'));
+        s = s.toUpperCase();
+        int i = -1;
+ StringTokenizer stringtokenizer = new StringTokenizer(s, "VRM", false);
+        if (stringtokenizer.countTokens() == 3)
+        {
+            String s1 = stringtokenizer.nextToken();
+            s1 = s1 + stringtokenizer.nextToken();
+            s1 = s1 + stringtokenizer.nextToken();
+            i = Integer.parseInt(s1);
+        }
+        return i;
+    }
+
+
+    /**
+     * Override the toOperationMethod of DBDictionary to pass the
+     * forUpdateString.
+     */
+    protected SQLBuffer toOperation(String op, SQLBuffer selects,
+ SQLBuffer from, SQLBuffer where, SQLBuffer group, SQLBuffer having, + SQLBuffer order, boolean distinct, boolean forUpdate, long start,
+        long end,String forUpdateString) {
+        SQLBuffer buf = new SQLBuffer(this);
+        buf.append(op);
+        boolean range = start != 0 || end != Long.MAX_VALUE;
+        if (range && rangePosition == RANGE_PRE_DISTINCT)
+            appendSelectRange(buf, start, end);
+        if (distinct)
+            buf.append(" DISTINCT");
+        if (range && rangePosition == RANGE_POST_DISTINCT)
+            appendSelectRange(buf, start, end);
+ buf.append(" ").append(selects).append(" FROM ").append (from);
+
+        if (where != null && !where.isEmpty())
+            buf.append(" WHERE ").append(where);
+        if (group != null && !group.isEmpty())
+            buf.append(" GROUP BY ").append(group);
+        if (having != null && !having.isEmpty()) {
+            assertSupport(supportsHaving, "SupportsHaving");
+            buf.append(" HAVING ").append(having);
+        }
+        if (order != null && !order.isEmpty())
+            buf.append(" ORDER BY ").append(order);
+        if (range && rangePosition == RANGE_POST_SELECT)
+            appendSelectRange(buf, start, end);
+
+        if (!simulateLocking ) {
+ assertSupport(supportsSelectForUpdate, "SupportsSelectForUpdate");
+            buf.append(" ").append(forUpdateString);
+        }
+        if (range && rangePosition == RANGE_POST_LOCK)
+            appendSelectRange(buf, start, end);
+        return buf;
+    }
+
     public SQLBuffer toSelect(Select sel, boolean forUpdate,
         JDBCFetchConfiguration fetch) {
-        SQLBuffer buf = super.toSelect(sel, forUpdate, fetch);
+        sel.addJoinClassConditions();
+        boolean update = forUpdate && sel.getFromSelect() == null;
+        SQLBuffer select = getSelects(sel, false, update);
+        SQLBuffer ordering = null;
+        if (!sel.isAggregate() || sel.getGrouping() != null)
+            ordering = sel.getOrdering();
+        SQLBuffer from;
+        if (sel.getFromSelect() != null)
+            from = getFromSelect(sel, forUpdate);
+        else
+            from = getFrom(sel, update);
+        SQLBuffer where = getWhere(sel, update);
+        String forUpdateString = getForUpdateClause(fetch,forUpdate);
+ SQLBuffer buf = toOperation(getSelectOperation(fetch), select, + from, where,sel.getGrouping(), sel.getHaving(), ordering,
+            sel.isDistinct(), forUpdate, sel.getStartIndex(),
+            sel.getEndIndex(),forUpdateString);
         if (sel.getExpectedResultCount() > 0)
             buf.append(" ").append(optimizeClause).append(" ").
-                append(String.valueOf(sel.getExpectedResultCount())).
-                append(" ").append(rowClause);
+            append(String.valueOf(sel.getExpectedResultCount())).
+            append(" ").append(rowClause);
         return buf;
     }
 }



Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
408 276-5638 mailto:[EMAIL PROTECTED]
P.S. A good JDO? O, Gasp!

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to