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/30 17:47:00 UTC

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

Israel Varea created NIFI-4830:
----------------------------------

             Summary: 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


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, blobLength);
                            ByteBuffer bb = ByteBuffer.wrap(blobAsBytes);
                            rec.put(i - 1, bb);
                            blob.free();
                        } else {
                            rec.put(i - 1, null);
                        }
                        continue;
                    }
 {code}









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