Skip to content

Commit cfa375f

Browse files
authored
simple fix of oracle stream API for RAW column (#1498)
* simple fix of oracle stream API for RAW column Signed-off-by: turakamou <turakamou@gmail.com> * fixup! simple fix of oracle stream API for RAW column Oracle will return "[B" as class name for byte[], I don't know why the class loader is not able to load this. So when we try to call getObject for this column, it is called with null class argument. So let's return the correct class in this case. Signed-off-by: turakamou <turakamou@gmail.com> * fixup! simple fix of oracle stream API for RAW column Fix unit test for master Signed-off-by: turakamou <turakamou@gmail.com> * simple fix of oracle stream API for RAW column Take into account tsegismont review comments Signed-off-by: turakamou <turakamou@gmail.com> --------- Signed-off-by: turakamou <turakamou@gmail.com>
1 parent d8c1d7e commit cfa375f

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

vertx-oracle-client/src/main/java/io/vertx/oracleclient/impl/RowReader.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import io.vertx.core.internal.logging.Logger;
1717
import io.vertx.core.internal.logging.LoggerFactory;
1818
import io.vertx.oracleclient.OracleException;
19-
import io.vertx.oracleclient.impl.commands.OraclePreparedQueryCommand;
2019
import io.vertx.oracleclient.impl.commands.OracleResponse;
2120
import io.vertx.sqlclient.Row;
2221
import io.vertx.sqlclient.internal.RowDesc;
@@ -40,7 +39,7 @@ public class RowReader<C, R> implements Flow.Subscriber<Row>, Function<oracle.jd
4039
private static final Logger LOG = LoggerFactory.getLogger(RowReader.class);
4140

4241
private final ContextInternal context;
43-
private final List<String> types;
42+
private final List<Class<?>> classes;
4443
private final RowDesc description;
4544
private final Statement resultSetStatement;
4645

@@ -63,9 +62,9 @@ public RowReader(ContextInternal context, Collector<Row, C, R> collector, Oracle
6362
resultSetStatement = ors.getStatement();
6463
ResultSetMetaData metaData = ors.getMetaData();
6564
int cols = metaData.getColumnCount();
66-
types = new ArrayList<>(cols);
65+
classes = new ArrayList<>(cols);
6766
for (int i = 1; i <= cols; i++) {
68-
types.add(metaData.getColumnClassName(i));
67+
classes.add(getType(metaData.getColumnClassName(i)));
6968
}
7069
Flow.Publisher<Row> publisher = ors.publisherOracle(this);
7170
description = OracleRowDesc.create(metaData);
@@ -170,24 +169,24 @@ private OracleResponse<R> createResponse() {
170169
@Override
171170
public Row apply(oracle.jdbc.OracleRow oracleRow) {
172171
try {
173-
return transform(types, description, oracleRow);
172+
return transform(classes, description, oracleRow);
174173
} catch (SQLException e) {
175174
throw new OracleException(e);
176175
}
177176
}
178177

179-
private static Row transform(List<String> ors, RowDesc desc, oracle.jdbc.OracleRow or) throws SQLException {
178+
private static Row transform(List<Class<?>> classes, RowDesc desc, oracle.jdbc.OracleRow or) throws SQLException {
180179
Row row = new OracleRow(desc);
181180
for (int i = 1; i <= desc.columnNames().size(); i++) {
182-
Object res = convertSqlValue(or.getObject(i, getType(ors.get(i - 1))));
181+
Object res = convertSqlValue(or.getObject(i, classes.get(i - 1)));
183182
row.addValue(res);
184183
}
185184
return row;
186185
}
187186

188187
private static Class<?> getType(String cn) {
189188
try {
190-
return OraclePreparedQueryCommand.class.getClassLoader().loadClass(cn);
189+
return Class.forName(cn, true, RowReader.class.getClassLoader());
191190
} catch (ClassNotFoundException e) {
192191
return null;
193192
}

vertx-oracle-client/src/test/java/tests/oracleclient/OracleBinaryDataTypesTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,28 @@ private <T> void testDecode(TestContext ctx, String columnName, JDBCType jdbcTyp
101101
}));
102102
}
103103

104+
private void testDecodeUsingStream(TestContext ctx, String columnName, JDBCType jdbcType, Buffer expected) {
105+
pool.getConnection().onComplete(ctx.asyncAssertSuccess(conn -> {
106+
conn.prepare("SELECT " + columnName + " FROM binary_data_types WHERE id = 1")
107+
.onComplete(ctx.asyncAssertSuccess(preparedStatement -> {
108+
preparedStatement.cursor().read(10).onComplete(ctx.asyncAssertSuccess(result -> {
109+
ctx.assertEquals(1, result.size());
110+
Row row = result.iterator().next();
111+
ctx.assertEquals(expected, row.get(Buffer.class, 0));
112+
ctx.assertEquals(expected, row.get(Buffer.class, columnName));
113+
ColumnDescriptor columnDescriptor = result.columnDescriptors().get(0);
114+
ctx.assertEquals(jdbcType, columnDescriptor.jdbcType());
115+
ctx.assertNotNull(columnDescriptor);
116+
}));
117+
}));
118+
}));
119+
}
120+
121+
@Test
122+
public void testDecodeRawUsingStream(TestContext ctx) {
123+
testDecodeUsingStream(ctx, "test_raw", JDBCType.VARBINARY, Buffer.buffer("See you space cowboy..."));
124+
}
125+
104126
@Test
105127
public void testEncodeNull(TestContext ctx) {
106128
pool

0 commit comments

Comments
 (0)