Repository: nifi Updated Branches: refs/heads/master 63bda32a8 -> 4b4e099f2
NIFI-2764 Signed-off-by: Matt Burgess <mattyb...@apache.org> NIFI-2764: Updated call to convertToAvroStream in TestJdbcCommon This closes #1009 Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/4b4e099f Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/4b4e099f Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/4b4e099f Branch: refs/heads/master Commit: 4b4e099f2ecd990f67f0afc994ecc4d46cbfc595 Parents: 63bda32 Author: patricker <patric...@gmail.com> Authored: Mon Sep 12 21:52:58 2016 -0600 Committer: Matt Burgess <mattyb...@apache.org> Committed: Tue Nov 8 14:45:49 2016 -0500 ---------------------------------------------------------------------- .../processors/standard/util/JdbcCommon.java | 4 +- .../standard/util/TestJdbcCommon.java | 39 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/4b4e099f/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java index f19f7e0..bb058d4 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java @@ -166,7 +166,9 @@ public class JdbcCommon { // direct put to avro record results: // org.apache.avro.AvroRuntimeException: Unknown datum type java.lang.Byte rec.put(i - 1, ((Byte) value).intValue()); - + } else if(value instanceof Short) { + //MS SQL returns TINYINT as a Java Short, which Avro doesn't understand. + rec.put(i - 1, ((Short) value).intValue()); } else if (value instanceof BigDecimal) { // Avro can't handle BigDecimal as a number - it will throw an AvroRuntimeException such as: "Unknown datum type: java.math.BigDecimal: 38" rec.put(i - 1, value.toString()); http://git-wip-us.apache.org/repos/asf/nifi/blob/4b4e099f/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java index 1e0fe2f..e05844f 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java @@ -450,6 +450,45 @@ public class TestJdbcCommon { } } + @Test + public void testConvertToAvroStreamForShort() throws SQLException, IOException { + final ResultSetMetaData metadata = mock(ResultSetMetaData.class); + when(metadata.getColumnCount()).thenReturn(1); + when(metadata.getColumnType(1)).thenReturn(Types.TINYINT); + when(metadata.getColumnName(1)).thenReturn("t_int"); + when(metadata.getTableName(1)).thenReturn("table"); + + final ResultSet rs = mock(ResultSet.class); + when(rs.getMetaData()).thenReturn(metadata); + + final AtomicInteger counter = new AtomicInteger(1); + Mockito.doAnswer(new Answer<Boolean>() { + @Override + public Boolean answer(InvocationOnMock invocation) throws Throwable { + return counter.getAndDecrement() > 0; + } + }).when(rs).next(); + + final short s = 25; + when(rs.getObject(Mockito.anyInt())).thenReturn(s); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + JdbcCommon.convertToAvroStream(rs, baos, false); + + final byte[] serializedBytes = baos.toByteArray(); + + final InputStream instream = new ByteArrayInputStream(serializedBytes); + + final DatumReader<GenericRecord> datumReader = new GenericDatumReader<>(); + try (final DataFileStream<GenericRecord> dataFileReader = new DataFileStream<>(instream, datumReader)) { + GenericRecord record = null; + while (dataFileReader.hasNext()) { + record = dataFileReader.next(record); + assertEquals(Short.toString(s), record.get("t_int").toString()); + } + } + } // many test use Derby as database, so ensure driver is available @Test