[ 
https://issues.apache.org/jira/browse/NIFI-4830?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16357326#comment-16357326
 ] 

Matt Burgess commented on NIFI-4830:
------------------------------------

I believe this same logic error exists for CLOB types as well.

> Blob not being read properly from Database to Avro
> --------------------------------------------------
>
>                 Key: NIFI-4830
>                 URL: https://issues.apache.org/jira/browse/NIFI-4830
>             Project: Apache NiFi
>          Issue Type: Bug
>            Reporter: Israel Varea
>            Priority: Major
>
> When using QueryDatabaseTable or any other component using JdbcCommon.java, 
> the Blob column of the database is not fetched correctly to the Avro 
> ByteBuffer. Instead of fetching whole file, only first bytes which are 
> different to zero are added. Then, the rest of the bytes remain with zero 
> value.
> Specifically, this code in JdbcCommon.java should be fixed:
> {code:java}
>                     if (javaSqlType == BLOB) {
>                         Blob blob = rs.getBlob(i);
>                         if (blob != null) {
>                             long numChars = blob.length();
>                             byte[] buffer = new byte[(int) numChars];
>                             InputStream is = blob.getBinaryStream();
>                             int index = 0;
>                             int c = is.read();
>                             while (c > 0) {
>                                 buffer[index++] = (byte) c;
>                                 c = is.read();
>                             }
>                             ByteBuffer bb = ByteBuffer.wrap(buffer);
>                             rec.put(i - 1, bb);
>                             blob.free();
>                         } else {
>                             rec.put(i - 1, null);
>                         }
>                         continue;
>                     }
>  {code}
> Notice the while statement.
> The whole block should be replaced for something like
> {code:java}
>                     if (javaSqlType == BLOB) {
>                         Blob blob = rs.getBlob(i);
>                         if (blob != null) {
>                             long blobLength = blob.length();                  
>           
>                             byte[] blobAsBytes = blob.getBytes(1, 
> (int)blobLength);
>                             ByteBuffer bb = ByteBuffer.wrap(blobAsBytes);
>                             rec.put(i - 1, bb);
>                             blob.free();
>                         } else {
>                             rec.put(i - 1, null);
>                         }
>                         continue;
>                     }
>  {code}
> This has been tested locally and it works! :)



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to