db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Knut Anders Hatlen (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-5090) Retrieving BLOB fields sometimes fails
Date Fri, 01 Jul 2011 15:44:28 GMT

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

Knut Anders Hatlen commented on DERBY-5090:
-------------------------------------------

I had a look at the 1a patch and it looks like a good fix. I was a bit surprised by the use
of MessageId.CONN_ALREADY_CLOSED to tell that the stream was closed, but after checking messages.xml,
I found that the message text wasn't connection-specific despite the name of the constant.

One tiny nit in EmbedResultSet:

-			currentStream = stream;
+            // Wrap in a stream throwing exception on invocations when closed.
+            currentStream = stream = new CloseFilterInputStream(stream);
 			return stream;

Perhaps avoiding the double assignment would be slightly clearer:
        currentStream = new CloseFilterInputStream(stream);
        return currentStream;
?

Before the fix, the stream sometimes worked (or perhaps it just appeared to work?) after reading
the next column, whereas now it'll always throw an IOException. Should we mention that in
the release notes?

> Retrieving BLOB fields sometimes fails
> --------------------------------------
>
>                 Key: DERBY-5090
>                 URL: https://issues.apache.org/jira/browse/DERBY-5090
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.7.1.1
>         Environment: JDBC derby embedded driver
>            Reporter: Unai Vivi
>            Assignee: Kristian Waagan
>              Labels: BLOB, exception, null, read
>         Attachments: Derby5090.java, Derby5090_2.java, Derby5090_3.java, derby-5090-1a-fix.diff,
derby-5090-1a-fix.stat, derby-5090-2a-test.diff, derby-5090-2a-test.stat
>
>
> This is my first issue report, so please be understanding if I'm posting the wrong thing,
in the wrong place or in the wrong way. I just want to help. :)
> While iterating through a ResultSet, when accessing a BLOB field to read its contents
via an InputStream, I noticed that:
> - if the current ResultSet's has been "warmed up" by retrieving another column first,
everything it's fine;
> - if, on the other hand, you first-thing access the BLOB (and read other columns later),
then upon reading the first byte out the InputStream bound to the BLOB field (ResultSet.getBinaryStream("col_name"))
an IOException is thrown (and IOException's getMessage() method returns null).
> Following is an example, taken from a real application. The two code segments only differ
in the fact that a SMALLINT & VARCHAR read is done before/after the BLOB read.
> --Working snippet--
> [...]
>                     icRelPath[i] = "imm" + File.separator + "ic" + "_" + rs.getShort("setIcone")
+ "_" + i + "." + rs.getString("estensione");
>                     AutoCloseInputStream acis = new AutoCloseInputStream(rs.getBinaryStream("ic"
+ i));
>                     if (rs.wasNull())
>                         icRelPath[i] = null;
>                     else
>                     {
>                         //icRelPath[i] = "imm" + File.separator + "ic" + "_" + rs.getShort("setIcone")
+ "_" + i + "." + rs.getString("estensione");
>                         BufferedInputStream bis = new BufferedInputStream(acis);
>                         int b = bis.read();//READS FINE
> [...]
> --Broken snippet--
> [...]
>                     //icRelPath[i] = "imm" + File.separator + "ic" + "_" + rs.getShort("setIcone")
+ "_" + i + "." + rs.getString("estensione");
>                     AutoCloseInputStream acis = new AutoCloseInputStream(rs.getBinaryStream("ic"
+ i));
>                     if (rs.wasNull())
>                         icRelPath[i] = null;
>                     else
>                     {
>                         icRelPath[i] = "imm" + File.separator + "ic" + "_" + rs.getShort("setIcone")
+ "_" + i + "." + rs.getString("estensione");
>                         BufferedInputStream bis = new BufferedInputStream(acis);
>                         int b = bis.read();//THROWS IOException WITH A null ERROR MESSAGE
STRING
> [...]

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message