diff --git a/vertx-oracle-client/src/main/java/io/vertx/oracleclient/impl/RowReader.java b/vertx-oracle-client/src/main/java/io/vertx/oracleclient/impl/RowReader.java index 051725a30..4348047fd 100644 --- a/vertx-oracle-client/src/main/java/io/vertx/oracleclient/impl/RowReader.java +++ b/vertx-oracle-client/src/main/java/io/vertx/oracleclient/impl/RowReader.java @@ -16,7 +16,6 @@ import io.vertx.core.internal.logging.Logger; import io.vertx.core.internal.logging.LoggerFactory; import io.vertx.oracleclient.OracleException; -import io.vertx.oracleclient.impl.commands.OraclePreparedQueryCommand; import io.vertx.oracleclient.impl.commands.OracleResponse; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.internal.RowDesc; @@ -40,7 +39,7 @@ public class RowReader implements Flow.Subscriber, Function types; + private final List> classes; private final RowDesc description; private final Statement resultSetStatement; @@ -63,9 +62,9 @@ public RowReader(ContextInternal context, Collector collector, Oracle resultSetStatement = ors.getStatement(); ResultSetMetaData metaData = ors.getMetaData(); int cols = metaData.getColumnCount(); - types = new ArrayList<>(cols); + classes = new ArrayList<>(cols); for (int i = 1; i <= cols; i++) { - types.add(metaData.getColumnClassName(i)); + classes.add(getType(metaData.getColumnClassName(i))); } Flow.Publisher publisher = ors.publisherOracle(this); description = OracleRowDesc.create(metaData); @@ -170,16 +169,16 @@ private OracleResponse createResponse() { @Override public Row apply(oracle.jdbc.OracleRow oracleRow) { try { - return transform(types, description, oracleRow); + return transform(classes, description, oracleRow); } catch (SQLException e) { throw new OracleException(e); } } - private static Row transform(List ors, RowDesc desc, oracle.jdbc.OracleRow or) throws SQLException { + private static Row transform(List> classes, RowDesc desc, oracle.jdbc.OracleRow or) throws SQLException { Row row = new OracleRow(desc); for (int i = 1; i <= desc.columnNames().size(); i++) { - Object res = convertSqlValue(or.getObject(i, getType(ors.get(i - 1)))); + Object res = convertSqlValue(or.getObject(i, classes.get(i - 1))); row.addValue(res); } return row; @@ -187,7 +186,7 @@ private static Row transform(List ors, RowDesc desc, oracle.jdbc.OracleR private static Class getType(String cn) { try { - return OraclePreparedQueryCommand.class.getClassLoader().loadClass(cn); + return Class.forName(cn, true, RowReader.class.getClassLoader()); } catch (ClassNotFoundException e) { return null; } diff --git a/vertx-oracle-client/src/test/java/tests/oracleclient/OracleBinaryDataTypesTest.java b/vertx-oracle-client/src/test/java/tests/oracleclient/OracleBinaryDataTypesTest.java index 5d01fed0f..c277770da 100644 --- a/vertx-oracle-client/src/test/java/tests/oracleclient/OracleBinaryDataTypesTest.java +++ b/vertx-oracle-client/src/test/java/tests/oracleclient/OracleBinaryDataTypesTest.java @@ -101,6 +101,28 @@ private void testDecode(TestContext ctx, String columnName, JDBCType jdbcTyp })); } + private void testDecodeUsingStream(TestContext ctx, String columnName, JDBCType jdbcType, Buffer expected) { + pool.getConnection().onComplete(ctx.asyncAssertSuccess(conn -> { + conn.prepare("SELECT " + columnName + " FROM binary_data_types WHERE id = 1") + .onComplete(ctx.asyncAssertSuccess(preparedStatement -> { + preparedStatement.cursor().read(10).onComplete(ctx.asyncAssertSuccess(result -> { + ctx.assertEquals(1, result.size()); + Row row = result.iterator().next(); + ctx.assertEquals(expected, row.get(Buffer.class, 0)); + ctx.assertEquals(expected, row.get(Buffer.class, columnName)); + ColumnDescriptor columnDescriptor = result.columnDescriptors().get(0); + ctx.assertEquals(jdbcType, columnDescriptor.jdbcType()); + ctx.assertNotNull(columnDescriptor); + })); + })); + })); + } + + @Test + public void testDecodeRawUsingStream(TestContext ctx) { + testDecodeUsingStream(ctx, "test_raw", JDBCType.VARBINARY, Buffer.buffer("See you space cowboy...")); + } + @Test public void testEncodeNull(TestContext ctx) { pool