Author: aadamchik
Date: Wed Nov 25 16:53:39 2009
New Revision: 884194

URL: http://svn.apache.org/viewvc?rev=884194&view=rev
Log:
CAY-1307 Error committing CLOB on Oracle8

patch by Bryan Lewis - adapted to 3.1

Added:
    
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
Modified:
    cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
    
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8ActionBuilder.java
    
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8Adapter.java
    
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
    
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchAction.java

Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=884194&r1=884193&r2=884194&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Wed Nov 25 
16:53:39 2009
@@ -29,6 +29,7 @@
 Bug Fixes Since beta1:
 
 CAY-1305 EJBQL doesn't support null parameters
+CAY-1307 Error committing CLOB on Oracle8
 CAY-1309 many validation errors when we remove dbEntity 
 
 ----------------------------------

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8ActionBuilder.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8ActionBuilder.java?rev=884194&r1=884193&r2=884194&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8ActionBuilder.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8ActionBuilder.java
 Wed Nov 25 16:53:39 2009
@@ -21,6 +21,7 @@
 
 import org.apache.cayenne.dba.JdbcAdapter;
 import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.query.BatchQuery;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.query.SelectQuery;
@@ -45,4 +46,26 @@
     public SQLAction objectSelectAction(SelectQuery query) {
         return new Oracle8SelectAction(query, getAdapter(), 
getEntityResolver());
     }
+
+    @Override
+    public SQLAction batchAction(BatchQuery query) {
+        // special handling for LOB updates
+        if (OracleAdapter.isSupportsOracleLOB() && 
OracleAdapter.updatesLOBColumns(query)) {
+            // Special action for Oracle8.  See CAY-1307.
+            return new Oracle8LOBBatchAction(query, getAdapter());
+        }
+        else {
+            // optimistic locking is not supported in batches due to JDBC 
driver
+            // limitations
+            boolean useOptimisticLock = query.isUsingOptimisticLocking();
+            boolean runningAsBatch = !useOptimisticLock && 
adapter.supportsBatchUpdates();
+
+            OracleBatchAction action = new OracleBatchAction(
+                    query,
+                    getAdapter(),
+                    getEntityResolver());
+            action.setBatch(runningAsBatch);
+            return action;
+        }
+    }
 }

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8Adapter.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8Adapter.java?rev=884194&r1=884193&r2=884194&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8Adapter.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8Adapter.java
 Wed Nov 25 16:53:39 2009
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dba.oracle;
 
+import java.lang.reflect.Method;
 import java.net.URL;
 
 import org.apache.cayenne.access.DataNode;
@@ -32,6 +33,36 @@
  */
 public class Oracle8Adapter extends OracleAdapter {
 
+    private static Method outputStreamFromBlobMethod;
+    private static Method writerFromClobMethod;
+
+    static {
+        initOracle8DriverInformation();
+    }
+
+    private static void initOracle8DriverInformation() {
+        initDone = true;
+
+        // configure static information
+        try {
+            outputStreamFromBlobMethod = 
Class.forName("oracle.sql.BLOB").getMethod(
+                    "getBinaryOutputStream");
+            writerFromClobMethod = Class.forName("oracle.sql.CLOB").getMethod(
+                    "getCharacterOutputStream");
+        }
+        catch (Throwable th) {
+            // ignoring...
+        }
+    }
+    
+    static Method getWriterFromClobMethod() {
+        return writerFromClobMethod;
+    }
+
+    static Method getOutputStreamFromBlobMethod() {
+        return outputStreamFromBlobMethod;
+    }
+
     /**
      * Uses OracleActionBuilder to create the right action.
      */

Added: 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java?rev=884194&view=auto
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
 (added)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
 Wed Nov 25 16:53:39 2009
@@ -0,0 +1,110 @@
+/*****************************************************************
+ *   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.oracle;
+
+import java.io.OutputStream;
+import java.io.Writer;
+import java.lang.reflect.Method;
+import java.sql.Blob;
+import java.sql.Clob;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.query.BatchQuery;
+import org.apache.cayenne.util.Util;
+
+/**
+ * @since 3.0
+ */
+class Oracle8LOBBatchAction extends OracleLOBBatchAction {
+
+    Oracle8LOBBatchAction(BatchQuery query, DbAdapter adapter) {
+        super(query, adapter);
+    }
+
+    /**
+     * Override the Oracle writeBlob() method to be compatible with Oracle8 
drivers.
+     */
+    @Override
+    protected void writeBlob(Blob blob, byte[] value) {
+        // Fix for CAY-1307.  For Oracle8, get the method found by reflection 
in
+        // OracleAdapter.  (Code taken from Cayenne 2.)
+        Method getBinaryStreamMethod = 
Oracle8Adapter.getOutputStreamFromBlobMethod();
+        try {
+            OutputStream out = (OutputStream) 
getBinaryStreamMethod.invoke(blob, (Object[]) null);
+            try {
+                out.write(value);
+                out.flush();
+            }
+            finally {
+                out.close();
+            }
+        }
+        catch (Exception e) {
+            throw new CayenneRuntimeException("Error processing BLOB.", Util
+                    .unwindException(e));
+        }
+    }
+
+    /**
+     * Override the Oracle writeClob() method to be compatible with Oracle8 
drivers.
+     */
+    @Override
+    protected void writeClob(Clob clob, char[] value) {
+        Method getWriterMethod = Oracle8Adapter.getWriterFromClobMethod();
+        try {
+            Writer out = (Writer) getWriterMethod.invoke(clob, (Object[]) 
null);
+            try {
+                out.write(value);
+                out.flush();
+            }
+            finally {
+                out.close();
+            }
+
+        }
+        catch (Exception e) {
+            throw new CayenneRuntimeException("Error processing CLOB.", Util
+                    .unwindException(e));
+        }
+    }
+
+    /**
+     * Override the Oracle writeClob() method to be compatible with Oracle8 
drivers.
+     */
+    @Override
+    protected void writeClob(Clob clob, String value) {
+        Method getWriterMethod = Oracle8Adapter.getWriterFromClobMethod();
+        try {
+            Writer out = (Writer) getWriterMethod.invoke(clob, (Object[]) 
null);
+            try {
+                out.write(value);
+                out.flush();
+            }
+            finally {
+                out.close();
+            }
+        }
+        catch (Exception e) {
+            throw new CayenneRuntimeException("Error processing CLOB.", Util
+                    .unwindException(e));
+        }
+    }
+}

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java?rev=884194&r1=884193&r2=884194&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
 Wed Nov 25 16:53:39 2009
@@ -20,7 +20,6 @@
 package org.apache.cayenne.dba.oracle;
 
 import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -77,8 +76,7 @@
 
     protected static boolean initDone;
     protected static int oracleCursorType = Integer.MAX_VALUE;
-    protected static Method outputStreamFromBlobMethod;
-    protected static Method writerFromClobMethod;
+
     protected static boolean supportsOracleLOB;
 
     static {
@@ -97,13 +95,7 @@
             Field cursorField = oraTypes.getField("CURSOR");
             oracleCursorType = cursorField.getInt(null);
 
-            outputStreamFromBlobMethod = 
Class.forName("oracle.sql.BLOB").getMethod(
-                    "getBinaryOutputStream");
-
-            writerFromClobMethod = Class.forName("oracle.sql.CLOB").getMethod(
-                    "getCharacterOutputStream");
             supportsOracleLOB = true;
-
         }
         catch (Throwable th) {
             // ignoring...

Modified: 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchAction.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchAction.java?rev=884194&r1=884193&r2=884194&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchAction.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchAction.java
 Wed Nov 25 16:53:39 2009
@@ -245,7 +245,7 @@
      * Writing of LOBs is not supported prior to JDBC 3.0 and has to be done 
using Oracle
      * driver utilities, using reflection.
      */
-    private void writeBlob(Blob blob, byte[] value) {
+    protected void writeBlob(Blob blob, byte[] value) {
 
         try {
             OutputStream out = blob.setBinaryStream(0);
@@ -267,7 +267,7 @@
      * Writing of LOBs is not supported prior to JDBC 3.0 and has to be done 
using Oracle
      * driver utilities.
      */
-    private void writeClob(Clob clob, char[] value) {
+    protected void writeClob(Clob clob, char[] value) {
         try {
 
             Writer out = clob.setCharacterStream(0);
@@ -290,7 +290,7 @@
      * Writing of LOBs is not supported prior to JDBC 3.0 and has to be done 
using Oracle
      * driver utilities.
      */
-    private void writeClob(Clob clob, String value) {
+    protected void writeClob(Clob clob, String value) {
         try {
 
             Writer out = clob.setCharacterStream(0);


Reply via email to