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 2014/03/16 08:10:06 UTC
svn commit: r1577986 - in
/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne:
access/types/ dba/oracle/
Author: aadamchik
Date: Sun Mar 16 07:10:05 2014
New Revision: 1577986
URL: http://svn.apache.org/r1577986
Log:
CAY-1918 Replace Oracle LOB hacks with JDBC 4.0 API
Added:
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchQueryWrapper.java
- copied, changed from r1577911, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchQueryWrapper.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java
- copied, changed from r1577911, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchTranslator.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBInsertBatchTranslator.java
- copied, changed from r1577911, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBInsertBatchTranslator.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBUpdateBatchTranslator.java
- copied, changed from r1577911, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBUpdateBatchTranslator.java
Removed:
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchAction.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchQueryWrapper.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchTranslator.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBInsertBatchTranslator.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBUpdateBatchTranslator.java
Modified:
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleByteArrayType.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java
Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java?rev=1577986&r1=1577985&r2=1577986&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/types/ByteArrayType.java Sun Mar 16 07:10:05 2014
@@ -152,6 +152,8 @@ public class ByteArrayType implements Ex
}
protected Blob writeBlob(byte[] bytes) {
+ // TODO: should we use Connection.createBlob() instead? (Like Oracle
+ // ByteArrayType does)
return bytes != null ? new MemoryBlob(bytes) : null;
}
Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java?rev=1577986&r1=1577985&r2=1577986&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java Sun Mar 16 07:10:05 2014
@@ -24,50 +24,220 @@ import java.io.Writer;
import java.lang.reflect.Method;
import java.sql.Blob;
import java.sql.Clob;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Collections;
+import java.util.List;
+import org.apache.cayenne.CayenneException;
import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.access.OperationObserver;
+import org.apache.cayenne.access.translator.batch.BatchParameterBinding;
import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.log.JdbcEventLogger;
+import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.query.BatchQuery;
+import org.apache.cayenne.query.BatchQueryRow;
+import org.apache.cayenne.query.InsertBatchQuery;
+import org.apache.cayenne.query.SQLAction;
+import org.apache.cayenne.query.UpdateBatchQuery;
import org.apache.cayenne.util.Util;
/**
* @since 3.0
*/
-class Oracle8LOBBatchAction extends OracleLOBBatchAction {
+class Oracle8LOBBatchAction implements SQLAction {
+
+ private BatchQuery query;
+ private DbAdapter adapter;
+ private JdbcEventLogger logger;
+
+ private static void bind(DbAdapter adapter, PreparedStatement statement, List<BatchParameterBinding> bindings)
+ throws SQLException, Exception {
+ int len = bindings.size();
+ for (int i = 0; i < len; i++) {
+ BatchParameterBinding b = bindings.get(i);
+ adapter.bindParameter(statement, b.getValue(), i + 1, b.getAttribute().getType(), b.getAttribute()
+ .getScale());
+ }
+ }
Oracle8LOBBatchAction(BatchQuery query, DbAdapter adapter, JdbcEventLogger logger) {
- super(query, adapter, logger);
+ this.adapter = adapter;
+ this.query = query;
+ this.logger = logger;
+ }
+
+ @Override
+ public void performAction(Connection connection, OperationObserver observer) throws SQLException, Exception {
+
+ Oracle8LOBBatchTranslator translator;
+ if (query instanceof InsertBatchQuery) {
+ translator = new Oracle8LOBInsertBatchTranslator((InsertBatchQuery) query, adapter);
+ } else if (query instanceof UpdateBatchQuery) {
+ translator = new Oracle8LOBUpdateBatchTranslator((UpdateBatchQuery) query, adapter);
+ } else {
+ throw new CayenneException("Unsupported batch type for special LOB processing: " + query);
+ }
+
+ translator.setTrimFunction(OracleAdapter.TRIM_FUNCTION);
+ translator.setNewBlobFunction(OracleAdapter.NEW_BLOB_FUNCTION);
+ translator.setNewClobFunction(OracleAdapter.NEW_CLOB_FUNCTION);
+
+ // no batching is done, queries are translated
+ // for each batch set, since prepared statements
+ // may be different depending on whether LOBs are NULL or not..
+
+ Oracle8LOBBatchQueryWrapper selectQuery = new Oracle8LOBBatchQueryWrapper(query);
+ List<DbAttribute> qualifierAttributes = selectQuery.getDbAttributesForLOBSelectQualifier();
+
+ for (BatchQueryRow row : query.getRows()) {
+
+ selectQuery.indexLOBAttributes(row);
+
+ int updated = 0;
+ String updateStr = translator.createSqlString(row);
+
+ // 1. run row update
+ logger.logQuery(updateStr, Collections.EMPTY_LIST);
+ PreparedStatement statement = connection.prepareStatement(updateStr);
+ try {
+
+ List<BatchParameterBinding> bindings = translator.createBindings(row);
+ logger.logQueryParameters("bind", bindings);
+
+ bind(adapter, statement, bindings);
+
+ updated = statement.executeUpdate();
+ logger.logUpdateCount(updated);
+ } finally {
+ try {
+ statement.close();
+ } catch (Exception e) {
+ }
+ }
+
+ // 2. run row LOB update (SELECT...FOR UPDATE and writing out LOBs)
+ processLOBRow(connection, translator, selectQuery, qualifierAttributes, row);
+
+ // finally, notify delegate that the row was updated
+ observer.nextCount(query, updated);
+ }
+ }
+
+ void processLOBRow(Connection con, Oracle8LOBBatchTranslator queryBuilder, Oracle8LOBBatchQueryWrapper selectQuery,
+ List<DbAttribute> qualifierAttributes, BatchQueryRow row) throws SQLException, Exception {
+
+ List<DbAttribute> lobAttributes = selectQuery.getDbAttributesForUpdatedLOBColumns();
+ if (lobAttributes.size() == 0) {
+ return;
+ }
+
+ boolean isLoggable = logger.isLoggable();
+
+ List<Object> qualifierValues = selectQuery.getValuesForLOBSelectQualifier(row);
+ List<Object> lobValues = selectQuery.getValuesForUpdatedLOBColumns();
+ int parametersSize = qualifierValues.size();
+ int lobSize = lobAttributes.size();
+
+ String selectStr = queryBuilder.createLOBSelectString(lobAttributes, qualifierAttributes);
+
+ if (isLoggable) {
+ logger.logQuery(selectStr, qualifierValues);
+ logger.logQueryParameters("write LOB", null, lobValues, false);
+ }
+
+ PreparedStatement selectStatement = con.prepareStatement(selectStr);
+ try {
+ for (int i = 0; i < parametersSize; i++) {
+ Object value = qualifierValues.get(i);
+ DbAttribute attribute = qualifierAttributes.get(i);
+
+ adapter.bindParameter(selectStatement, value, i + 1, attribute.getType(), attribute.getScale());
+ }
+
+ ResultSet result = selectStatement.executeQuery();
+
+ try {
+ if (!result.next()) {
+ throw new CayenneRuntimeException("Missing LOB row.");
+ }
+
+ // read the only expected row
+
+ for (int i = 0; i < lobSize; i++) {
+ DbAttribute attribute = lobAttributes.get(i);
+ int type = attribute.getType();
+
+ if (type == Types.CLOB) {
+ Clob clob = result.getClob(i + 1);
+ Object clobVal = lobValues.get(i);
+
+ if (clobVal instanceof char[]) {
+ writeClob(clob, (char[]) clobVal);
+ } else {
+ writeClob(clob, clobVal.toString());
+ }
+ } else if (type == Types.BLOB) {
+ Blob blob = result.getBlob(i + 1);
+
+ Object blobVal = lobValues.get(i);
+ if (blobVal instanceof byte[]) {
+ writeBlob(blob, (byte[]) blobVal);
+ } else {
+ String className = (blobVal != null) ? blobVal.getClass().getName() : null;
+ throw new CayenneRuntimeException("Unsupported class of BLOB value: " + className);
+ }
+ } else {
+ throw new CayenneRuntimeException("Only BLOB or CLOB is expected here, got: " + type);
+ }
+ }
+
+ if (result.next()) {
+ throw new CayenneRuntimeException("More than one LOB row found.");
+ }
+ } finally {
+ try {
+ result.close();
+ } catch (Exception e) {
+ }
+ }
+ } finally {
+ try {
+ selectStatement.close();
+ } catch (Exception e) {
+ }
+ }
}
/**
- * Override the Oracle writeBlob() method to be compatible with Oracle8 drivers.
+ * 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.)
+ // 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 {
+ } finally {
out.close();
}
- }
- catch (Exception e) {
- throw new CayenneRuntimeException("Error processing BLOB.", Util
- .unwindException(e));
+ } catch (Exception e) {
+ throw new CayenneRuntimeException("Error processing BLOB.", Util.unwindException(e));
}
}
/**
- * Override the Oracle writeClob() method to be compatible with Oracle8 drivers.
+ * Override the Oracle writeClob() method to be compatible with Oracle8
+ * drivers.
*/
- @Override
protected void writeClob(Clob clob, char[] value) {
Method getWriterMethod = Oracle8Adapter.getWriterFromClobMethod();
try {
@@ -75,22 +245,19 @@ class Oracle8LOBBatchAction extends Orac
try {
out.write(value);
out.flush();
- }
- finally {
+ } finally {
out.close();
}
- }
- catch (Exception e) {
- throw new CayenneRuntimeException("Error processing CLOB.", Util
- .unwindException(e));
+ } catch (Exception e) {
+ throw new CayenneRuntimeException("Error processing CLOB.", Util.unwindException(e));
}
}
/**
- * Override the Oracle writeClob() method to be compatible with Oracle8 drivers.
+ * Override the Oracle writeClob() method to be compatible with Oracle8
+ * drivers.
*/
- @Override
protected void writeClob(Clob clob, String value) {
Method getWriterMethod = Oracle8Adapter.getWriterFromClobMethod();
try {
@@ -98,14 +265,11 @@ class Oracle8LOBBatchAction extends Orac
try {
out.write(value);
out.flush();
- }
- finally {
+ } finally {
out.close();
}
- }
- catch (Exception e) {
- throw new CayenneRuntimeException("Error processing CLOB.", Util
- .unwindException(e));
+ } catch (Exception e) {
+ throw new CayenneRuntimeException("Error processing CLOB.", Util.unwindException(e));
}
}
}
Copied: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchQueryWrapper.java (from r1577911, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchQueryWrapper.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchQueryWrapper.java?p2=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchQueryWrapper.java&p1=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchQueryWrapper.java&r1=1577911&r2=1577986&rev=1577986&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchQueryWrapper.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchQueryWrapper.java Sun Mar 16 07:10:05 2014
@@ -37,7 +37,7 @@ import org.apache.cayenne.query.BatchQue
* columns processing.
*
*/
-class OracleLOBBatchQueryWrapper {
+class Oracle8LOBBatchQueryWrapper {
protected BatchQuery query;
@@ -48,7 +48,7 @@ class OracleLOBBatchQueryWrapper {
protected boolean[] allLOBAttributes;
protected Object[] updatedLOBAttributes;
- OracleLOBBatchQueryWrapper(BatchQuery query) {
+ Oracle8LOBBatchQueryWrapper(BatchQuery query) {
this.query = query;
this.dbAttributes = query.getDbAttributes();
Copied: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java (from r1577911, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchTranslator.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java?p2=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java&p1=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchTranslator.java&r1=1577911&r2=1577986&rev=1577986&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBBatchTranslator.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java Sun Mar 16 07:10:05 2014
@@ -39,12 +39,12 @@ import org.apache.cayenne.query.BatchQue
* Superclass of query builders for the DML operations involving LOBs.
*
*/
-abstract class OracleLOBBatchTranslator extends BatchTranslator {
+abstract class Oracle8LOBBatchTranslator extends BatchTranslator {
protected String newClobFunction;
protected String newBlobFunction;
- OracleLOBBatchTranslator(BatchQuery query, DbAdapter adapter) {
+ Oracle8LOBBatchTranslator(BatchQuery query, DbAdapter adapter) {
super(query, adapter);
}
Copied: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBInsertBatchTranslator.java (from r1577911, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBInsertBatchTranslator.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBInsertBatchTranslator.java?p2=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBInsertBatchTranslator.java&p1=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBInsertBatchTranslator.java&r1=1577911&r2=1577986&rev=1577986&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBInsertBatchTranslator.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBInsertBatchTranslator.java Sun Mar 16 07:10:05 2014
@@ -29,9 +29,9 @@ import org.apache.cayenne.map.DbAttribut
import org.apache.cayenne.query.BatchQueryRow;
import org.apache.cayenne.query.InsertBatchQuery;
-class OracleLOBInsertBatchTranslator extends OracleLOBBatchTranslator {
+class Oracle8LOBInsertBatchTranslator extends Oracle8LOBBatchTranslator {
- OracleLOBInsertBatchTranslator(InsertBatchQuery query, DbAdapter adapter) {
+ Oracle8LOBInsertBatchTranslator(InsertBatchQuery query, DbAdapter adapter) {
super(query, adapter);
}
Copied: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBUpdateBatchTranslator.java (from r1577911, cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBUpdateBatchTranslator.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBUpdateBatchTranslator.java?p2=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBUpdateBatchTranslator.java&p1=cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBUpdateBatchTranslator.java&r1=1577911&r2=1577986&rev=1577986&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleLOBUpdateBatchTranslator.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBUpdateBatchTranslator.java Sun Mar 16 07:10:05 2014
@@ -29,9 +29,9 @@ import org.apache.cayenne.map.DbAttribut
import org.apache.cayenne.query.BatchQueryRow;
import org.apache.cayenne.query.UpdateBatchQuery;
-class OracleLOBUpdateBatchTranslator extends OracleLOBBatchTranslator {
+class Oracle8LOBUpdateBatchTranslator extends Oracle8LOBBatchTranslator {
- OracleLOBUpdateBatchTranslator(UpdateBatchQuery query, DbAdapter adapter) {
+ Oracle8LOBUpdateBatchTranslator(UpdateBatchQuery query, DbAdapter adapter) {
super(query, adapter);
}
Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java?rev=1577986&r1=1577985&r2=1577986&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java Sun Mar 16 07:10:05 2014
@@ -44,19 +44,13 @@ class OracleActionBuilder extends JdbcAc
@Override
public SQLAction batchAction(BatchQuery query) {
- // special handling for LOB updates
- if (OracleAdapter.isSupportsOracleLOB() && OracleAdapter.updatesLOBColumns(query)) {
- return new OracleLOBBatchAction(query, dataNode.getAdapter(), dataNode.getJdbcEventLogger());
- } else {
-
- // optimistic locking is not supported in batches due to JDBC driver
- // limitations
- boolean useOptimisticLock = query.isUsingOptimisticLocking();
- boolean runningAsBatch = !useOptimisticLock && dataNode.getAdapter().supportsBatchUpdates();
-
- return new OracleBatchAction(query, dataNode, runningAsBatch);
- }
+ // optimistic locking is not supported in batches due to JDBC driver
+ // limitations
+ // TODO: is this still true with ojdbc6.jar?
+ boolean useOptimisticLock = query.isUsingOptimisticLocking();
+ boolean runningAsBatch = !useOptimisticLock && dataNode.getAdapter().supportsBatchUpdates();
+ return new OracleBatchAction(query, dataNode, runningAsBatch);
}
@Override
Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleByteArrayType.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleByteArrayType.java?rev=1577986&r1=1577985&r2=1577986&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleByteArrayType.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleByteArrayType.java Sun Mar 16 07:10:05 2014
@@ -18,7 +18,7 @@
****************************************************************/
package org.apache.cayenne.dba.oracle;
-import java.io.ByteArrayInputStream;
+import java.sql.Blob;
import java.sql.PreparedStatement;
import java.sql.Types;
@@ -40,10 +40,12 @@ public class OracleByteArrayType extends
int scale) throws Exception {
if (type == Types.BLOB) {
if (isUsingBlobs()) {
- byte[] bytes = (byte[])val;
- st.setBinaryStream(pos, new ByteArrayInputStream(bytes), bytes.length);
- }
- else {
+
+ Blob blob = st.getConnection().createBlob();
+ blob.setBytes(1, (byte[]) val);
+ st.setBlob(pos, blob);
+
+ } else {
st.setBytes(pos, (byte[]) val);
}
}
Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java?rev=1577986&r1=1577985&r2=1577986&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleCharType.java Sun Mar 16 07:10:05 2014
@@ -18,6 +18,7 @@
****************************************************************/
package org.apache.cayenne.dba.oracle;
+import java.sql.Clob;
import java.sql.PreparedStatement;
import java.sql.Types;
@@ -45,7 +46,16 @@ public class OracleCharType extends Char
int type,
int precision) throws Exception {
if (type == Types.CLOB) {
- st.setString(pos, (String) val);
+
+ if (isUsingClobs()) {
+
+ Clob clob = st.getConnection().createClob();
+ clob.setString(1, (String) val);
+ st.setClob(pos, clob);
+
+ } else {
+ st.setString(pos, (String) val);
+ }
}
else {
// use exactly this method to solve CAY-1470