db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mike Matrigali <mikem_...@sbcglobal.net>
Subject Re: [jira] Created: (DERBY-1368) EOFException when reading from blob's binary stream
Date Mon, 05 Jun 2006 21:09:36 GMT
I don't think reading a stream twice is supported, I thought
you were supposed to get an error - but it may depend on the
version you are running.  I believe the jdbc interpretation
was that no support is required, and results are not specified.
To support it would likely create a lot of overhead for the
normal one access case as with only one access one can just
stream the result to the user and throw it away, if you need
to support multiple accesses one either has to buffer it all
up, save it to a file, or change the get to go all the way
back to query the db.

Anyone remember what issue this was?

/mikem

Tobias Bocanegra (JIRA) wrote:
> EOFException when reading from blob's binary stream
> ---------------------------------------------------
> 
>          Key: DERBY-1368
>          URL: http://issues.apache.org/jira/browse/DERBY-1368
>      Project: Derby
>         Type: Bug
> 
>     Versions: 10.1.2.1    
>     Reporter: Tobias Bocanegra
> 
> 
> reading the 'length()' of a blob reads a previously aquired binary stream.
> 
> test case:
> 
>     public static void main(String[] argv) throws Exception {
>         String driver = "org.apache.derby.jdbc.EmbeddedDriver";
>         String url = "jdbc:derby:derby/test;create=true";
>         Class.forName(driver);
>         Connection con = DriverManager.getConnection(url, "sa", "");
>         con.setAutoCommit(true);
> 
>         // create table
>         System.out.println("1) creating table...");
>         Statement stmt = con.createStatement();
>         stmt.execute("create table T1 (ID char(32) PRIMARY KEY, DATA blob(2G) not null)");
>         stmt.close();
> 
>         // add row
>         System.out.println("2) adding row...");
>         byte[] data = new byte[1024*1024*1];
>         data[0] = 1;
>         data[1] = 2;
> 
>         PreparedStatement s = con.prepareStatement("insert into T1 (ID, DATA) values
(?, ?)");
>         s.setString(1, "id");
>         s.setBytes(2, data);
>         s.execute();
>         s.close();
> 
>         // read row
>         System.out.println("3) reading row...");
>         s = con.prepareStatement("select DATA from T1 where ID = ?");
>         s.setString(1, "id");
>         s.execute();
>         ResultSet rs = s.getResultSet();
>         rs.next();
>         Blob b = rs.getBlob(1);
> 
>         // test output
>         System.out.println("4) Length: " + b.length());
>         InputStream in = b.getBinaryStream();
>         System.out.println("   First Byte: " + in.read());
>         in.close();
> 
>         in = b.getBinaryStream();
>         System.out.println("5) Length: " + b.length());
>         System.out.println("   First Byte: " + in.read());
>         in.close();
> 
>         rs.close();
>         s.close();
>         con.close();
>     }
> 
> 
> gives:
> 
> 1) creating table...
> 2) adding row...
> 3) reading row...
> 4) Length: 1048576
>    First Byte: 1
> 5) Length: 1048576
>    First Byte: -1
> 
> imo, 5) is wrong.
> 


Mime
View raw message