You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2013/09/23 15:37:09 UTC

svn commit: r1525585 - in /cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne: access/jdbc/ProcedureAction.java dba/db2/DB2ActionBuilder.java dba/db2/DB2Adapter.java dba/db2/DB2ProcedureAction.java

Author: aadamchik
Date: Mon Sep 23 13:37:08 2013
New Revision: 1525585

URL: http://svn.apache.org/r1525585
Log:
CAY-1874 DB2 Procedure action ignores the first result set

Added:
    cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java
    cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ProcedureAction.java
Modified:
    cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
    cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java

Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java?rev=1525585&r1=1525584&r2=1525585&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java Mon Sep 23 13:37:08 2013
@@ -79,6 +79,12 @@ public class ProcedureAction extends Bas
             // return value of this method and avoid calling 'getMoreResults' if it is
             // true.
             // some db's handle this well, some don't (MySQL).
+            
+            // 09/23/2013: almost all adapters except Oracle (and maybe a few
+            // more?) are actually using the correct strategy, so making it a
+            // default in the superclass, and isolating hack to subclasses is
+            // probably a good idea
+
             statement.execute();
 
             // read out parameters
@@ -236,7 +242,7 @@ public class ProcedureAction extends Bas
      * 
      * @throws Exception
      */
-    void initStatement(CallableStatement statement) throws Exception {
+    protected void initStatement(CallableStatement statement) throws Exception {
         int statementFetchSize = query
                 .getMetaData(getEntityResolver())
                 .getStatementFetchSize();

Added: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java?rev=1525585&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java (added)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java Mon Sep 23 13:37:08 2013
@@ -0,0 +1,40 @@
+/*****************************************************************
+ *   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.cayenne.dba.db2;
+
+import org.apache.cayenne.dba.JdbcActionBuilder;
+import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.query.ProcedureQuery;
+import org.apache.cayenne.query.SQLAction;
+
+/**
+ * @since 3.1
+ */
+public class DB2ActionBuilder extends JdbcActionBuilder {
+
+    DB2ActionBuilder(JdbcAdapter adapter, EntityResolver resolver) {
+        super(adapter, resolver);
+    }
+
+    @Override
+    public SQLAction procedureAction(ProcedureQuery query) {
+        return new DB2ProcedureAction(query, getAdapter(), getEntityResolver());
+    }
+}

Modified: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java?rev=1525585&r1=1525584&r2=1525585&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java (original)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java Mon Sep 23 13:37:08 2013
@@ -26,6 +26,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.access.trans.QualifierTranslator;
 import org.apache.cayenne.access.trans.QueryAssembler;
 import org.apache.cayenne.access.types.BooleanType;
@@ -44,6 +45,8 @@ import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.merge.MergerFactory;
+import org.apache.cayenne.query.Query;
+import org.apache.cayenne.query.SQLAction;
 
 /**
  * DbAdapter implementation for the <a href="http://www.ibm.com/db2/"> DB2 RDBMS </a>.
@@ -246,5 +249,14 @@ public class DB2Adapter extends JdbcAdap
             super.bindParameter(statement, object, pos, sqlType, precision);
         }
     }
-
+    
+    /**
+     * Uses special action builder to create the right action.
+     * 
+     * @since 3.1
+     */
+    @Override
+    public SQLAction getAction(Query query, DataNode node) {
+        return query.createSQLAction(new DB2ActionBuilder(this, node.getEntityResolver()));
+    }
 }

Added: cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ProcedureAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ProcedureAction.java?rev=1525585&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ProcedureAction.java (added)
+++ cayenne/main/trunk/framework/cayenne-core-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2ProcedureAction.java Mon Sep 23 13:37:08 2013
@@ -0,0 +1,94 @@
+/*****************************************************************
+ *   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.cayenne.dba.db2;
+
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.cayenne.access.OperationObserver;
+import org.apache.cayenne.access.jdbc.ProcedureAction;
+import org.apache.cayenne.access.jdbc.RowDescriptor;
+import org.apache.cayenne.access.trans.ProcedureTranslator;
+import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.query.ProcedureQuery;
+
+/**
+ * @since 3.1
+ */
+class DB2ProcedureAction extends ProcedureAction {
+
+    DB2ProcedureAction(ProcedureQuery query, JdbcAdapter adapter, EntityResolver entityResolver) {
+        super(query, adapter, entityResolver);
+    }
+
+    @Override
+    public void performAction(Connection connection, OperationObserver observer) throws SQLException, Exception {
+
+        // cloned from super except for result processing consistent with
+        // CAY-1874
+        
+        processedResultSets = 0;
+
+        ProcedureTranslator transl = createTranslator(connection);
+
+        CallableStatement statement = (CallableStatement) transl.createStatement();
+
+        try {
+            initStatement(statement);
+            boolean hasResultSet = statement.execute();
+
+            // read out parameters
+            readProcedureOutParameters(statement, observer);
+
+            // read the rest of the query
+            while (true) {
+                if (hasResultSet) {
+                    ResultSet rs = statement.getResultSet();
+
+                    try {
+                        RowDescriptor descriptor = describeResultSet(rs, processedResultSets++);
+                        readResultSet(rs, descriptor, query, observer);
+                    } finally {
+                        try {
+                            rs.close();
+                        } catch (SQLException ex) {
+                        }
+                    }
+                } else {
+                    int updateCount = statement.getUpdateCount();
+                    if (updateCount == -1) {
+                        break;
+                    }
+                    adapter.getJdbcEventLogger().logUpdateCount(updateCount);
+                    observer.nextCount(query, updateCount);
+                }
+                hasResultSet = statement.getMoreResults();
+            }
+        } finally {
+            try {
+                statement.close();
+            } catch (SQLException ex) {
+
+            }
+        }
+    }
+}