Skip to content

Commit

Permalink
0001968: Oracle LONG types don't work when stream_to_lob is turned on
Browse files Browse the repository at this point in the history
  • Loading branch information
chenson42 committed Sep 16, 2014
1 parent 878b38b commit 2bb9c6f
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 12 deletions.
Expand Up @@ -21,11 +21,13 @@
package org.jumpmind.symmetric.android;

import java.sql.Timestamp;
import java.sql.Types;
import java.util.Date;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.NotImplementedException;
import org.jumpmind.db.model.TypeMap;
import org.jumpmind.db.sql.AbstractSqlTemplate;
import org.jumpmind.db.sql.ISqlReadCursor;
import org.jumpmind.db.sql.ISqlResultsListener;
Expand Down Expand Up @@ -64,8 +66,13 @@ public byte[] queryForBlob(String sql, int jdbcTypeCode, String jdbcTypeName, Ob
public byte[] queryForBlob(String sql, Object... params) {
return queryForObject(sql, byte[].class, params);
}

@Override
public String queryForClob(String sql, Object... args) {
return queryForClob(sql, Types.CLOB, TypeMap.CLOB, args);
}

public String queryForClob(String sql, Object... params) {
public String queryForClob(String sql, int jdbcTypeCode, String jdbcTypeName, Object... params) {
return queryForString(sql, params);
}

Expand Down
Expand Up @@ -180,7 +180,7 @@ public boolean doesCustomerExist(int id) {

public String getCustomerNotes(int id) {
return sqlTemplate
.queryForClob("select notes from test_customer where customer_id=?", id);
.queryForString("select notes from test_customer where customer_id=?", id);
}

public byte[] getCustomerIcon(int id) {
Expand Down
Expand Up @@ -33,8 +33,11 @@ public interface ISqlTemplate {
public byte[] queryForBlob(String sql, Object... args);

public byte[] queryForBlob(String sql, int jdbcTypeCode, String jdbcTypeName, Object... args);

@Deprecated
public String queryForClob(final String sql, final Object... args);

public String queryForClob(String sql, Object... args);
public String queryForClob(String sql, int jdbcTypeCode, String jdbcTypeName, Object... args);

public <T> T queryForObject(String sql, Class<T> clazz, Object... params);

Expand Down
Expand Up @@ -188,7 +188,7 @@ protected CsvData enhanceWithLobsFromSourceIfNeeded(Table table, CsvData data) {
binaryData = null;
}
} else {
valueForCsv = sqlTemplate.queryForClob(sql, args);
valueForCsv = sqlTemplate.queryForClob(sql, lobColumn.getJdbcTypeCode(),lobColumn.getJdbcTypeName(), args);
}

int index = ArrayUtils.indexOf(columnNames, lobColumn.getName());
Expand Down
Expand Up @@ -66,7 +66,7 @@ protected OracleDdlReader createDdlReader() {

@Override
protected OracleJdbcSqlTemplate createSqlTemplate() {
return new OracleJdbcSqlTemplate(dataSource, settings, null, getDatabaseInfo());
return new OracleJdbcSqlTemplate(dataSource, settings, new OracleLobHandler(), getDatabaseInfo());
}

public String getName() {
Expand Down
@@ -0,0 +1,37 @@
package org.jumpmind.db.platform.oracle;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.jumpmind.db.sql.JdbcUtils;
import org.jumpmind.db.sql.SymmetricLobHandler;
import org.springframework.jdbc.support.lob.DefaultLobHandler;

@SuppressWarnings("deprecation")
public class OracleLobHandler extends SymmetricLobHandler {

DefaultLobHandler longHandler = new DefaultLobHandler();

public OracleLobHandler() {
super(new org.springframework.jdbc.support.lob.OracleLobHandler());
((org.springframework.jdbc.support.lob.OracleLobHandler) lobHandler)
.setNativeJdbcExtractor(JdbcUtils.getNativeJdbcExtractory());
}

@Override
public String getClobAsString(ResultSet rs, int columnIndex, int jdbcTypeCode,
String jdbcTypeName) throws SQLException {
if ("LONG".equalsIgnoreCase(jdbcTypeName)) {
/**
* Ironically, the Oracle Lob Handler doesn't handle the Oracle
* specific data type of Long. We should probably swap out the
* Oracle Lob Handler altogether but I haven't been able to get it
* to insert Empty Clob Values appropriately yet.
*/
return longHandler.getClobAsString(rs, columnIndex);
} else {
return super.getClobAsString(rs, columnIndex, jdbcTypeCode, jdbcTypeName);
}
}

}
Expand Up @@ -195,8 +195,13 @@ public byte[] execute(Connection con) throws SQLException {
}
});
}


@Deprecated
public String queryForClob(final String sql, final Object... args) {
return queryForClob(sql, -1, null, args);
}

public String queryForClob(final String sql, final int jdbcTypeCode, final String jdbcTypeName, final Object... args) {
logSql(sql, args);
return execute(new IConnectionCallback<String>() {
public String execute(Connection con) throws SQLException {
Expand All @@ -209,7 +214,7 @@ public String execute(Connection con) throws SQLException {
setValues(ps, args);
rs = ps.executeQuery();
if (rs.next()) {
result = lobHandler.getClobAsString(rs, 1);
result = lobHandler.getClobAsString(rs, 1, jdbcTypeCode, jdbcTypeName);
}
} finally {
close(rs);
Expand Down
Expand Up @@ -28,19 +28,19 @@

public class SymmetricLobHandler {

private LobHandler lobHandler;
protected LobHandler lobHandler;

public SymmetricLobHandler() {
super();
this.lobHandler = new DefaultLobHandler();
this(new DefaultLobHandler());
}

public SymmetricLobHandler(LobHandler lobHandler) {
super();
this.lobHandler = lobHandler;
}

public String getClobAsString(ResultSet rs, int columnIndex) throws SQLException {
public String getClobAsString(ResultSet rs, int columnIndex, int jdbcTypeCode,
String jdbcTypeName) throws SQLException {
return lobHandler.getClobAsString(rs, columnIndex);
}

Expand Down

0 comments on commit 2bb9c6f

Please sign in to comment.