Skip to content

Commit

Permalink
0006414: Stream Lobs setting does not work with Sybase ASE Unitypes
Browse files Browse the repository at this point in the history
  • Loading branch information
jakobvanmeter committed May 8, 2024
1 parent 25eb9d4 commit 70d809d
Showing 1 changed file with 17 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public CsvData nextData() {
Table targetTable = this.currentSource.getTargetTable();
if (targetTable != null && targetTable.equals(this.table)) {
data = enhanceWithLobsFromSourceIfNeeded(this.currentSource.getSourceTable(), data);
if (isSybaseASE && isUsingUnitypes) {
if (isSybaseASE && isUsingUnitypes && !this.currentSource.requiresLobsSelectedFromSource(data)) {
data = convertUtf16toUTF8(this.currentSource.getSourceTable(), data);
}
} else {
Expand Down Expand Up @@ -190,7 +190,7 @@ protected CsvData enhanceWithLobsFromSourceIfNeeded(Table table, CsvData data) {
Object[] args = new Object[pkColumns.length];
for (int i = 0; i < pkColumns.length; i++) {
args[i] = columnDataMap.get(pkColumns[i].getName());
}
}
String sql = buildSelect(table, lobColumns, pkColumns);
Row row = sqlTemplate.queryForRow(sql, args);
if (row == null) {
Expand All @@ -202,7 +202,18 @@ protected CsvData enhanceWithLobsFromSourceIfNeeded(Table table, CsvData data) {
if (platform.isBlob(lobColumn.getMappedTypeCode())) {
byte[] binaryData = row.getBytes(lobColumn.getName());
if (binaryData != null) {
if (batch.getBinaryEncoding() == BinaryEncoding.BASE64) {
if(isUniType(lobColumn.getJdbcTypeName())) {
try {
String utf16String = null;
String baseString = row.getString(lobColumn.getName());
baseString = "fffe" + baseString;
utf16String = new String(Hex.decodeHex(baseString), "UTF-16");
String utf8String = new String(utf16String.getBytes(Charset.defaultCharset()), Charset.defaultCharset());
valueForCsv = utf8String;
} catch (UnsupportedEncodingException | DecoderException e) {
e.printStackTrace();
}
} else if (batch.getBinaryEncoding() == BinaryEncoding.BASE64) {
valueForCsv = new String(Base64.encodeBase64(binaryData), Charset.defaultCharset());
} else if (batch.getBinaryEncoding() == BinaryEncoding.HEX) {
valueForCsv = new String(Hex.encodeHex(binaryData));
Expand Down Expand Up @@ -237,9 +248,7 @@ protected CsvData convertUtf16toUTF8(Table table, CsvData data) {
ISqlTemplate sqlTemplate = platform.getSqlTemplate();
Object[] args = new Object[pkColumns.length];
for (int i = 0; i < pkColumns.length; i++) {
if (pkColumns[i].getJdbcTypeName() != null && (pkColumns[i].getJdbcTypeName().equalsIgnoreCase("univarchar") ||
pkColumns[i].getJdbcTypeName().equalsIgnoreCase("unichar") ||
pkColumns[i].getJdbcTypeName().equalsIgnoreCase("unitext"))) {
if (pkColumns[i].getJdbcTypeName() != null && (isUniType(pkColumns[i].getJdbcTypeName()))) {
String utf16String = null;
String baseString = (String) columnDataMap.get(pkColumns[i].getName());
baseString = "fffe" + baseString;
Expand All @@ -262,13 +271,9 @@ protected CsvData convertUtf16toUTF8(Table table, CsvData data) {
int index = ArrayUtils.indexOf(columnNames, uniColumn.getName());
if (rowData[index] != null) {
String utf16String = null;
// if (batch.getChannelId().equalsIgnoreCase("reload")) {
// utf16String = new String(Hex.decodeHex(rowData[index]), "UTF-16");
// } else {
String baseString = rowData[index];
baseString = "fffe" + baseString;
utf16String = new String(Hex.decodeHex(baseString), "UTF-16");
// }
String utf8String = new String(utf16String.getBytes(Charset.defaultCharset()), Charset.defaultCharset());
rowData[index] = utf8String;
}
Expand Down Expand Up @@ -306,6 +311,8 @@ protected String buildSelect(Table table, List<Column> lobColumns, Column[] pkCo
if ("XMLTYPE".equalsIgnoreCase(lobColumn.getJdbcTypeName()) && 2009 == lobColumn.getJdbcTypeCode()) {
sql.append("extract(").append(quote).append(lobColumn.getName()).append(quote);
sql.append(", '/').getClobVal()");
} else if(isUniType(lobColumn.getJdbcTypeName())) {
sql.append("bintostr(convert(varbinary(16384),"+lobColumn.getName()+")) as " + lobColumn.getName());
} else {
sql.append(quote).append(lobColumn.getName()).append(quote);
}
Expand Down

0 comments on commit 70d809d

Please sign in to comment.