You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "Israel Varea (JIRA)" <ji...@apache.org> on 2018/01/31 11:17:00 UTC

[jira] [Issue Comment Deleted] (NIFI-4830) Blob not being read properly from Database to Avro

     [ https://issues.apache.org/jira/browse/NIFI-4830?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Israel Varea updated NIFI-4830:
-------------------------------
    Comment: was deleted

(was:                     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;
                    })

> 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)