You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Fernanda Pizzorno (JIRA)" <de...@db.apache.org> on 2005/08/16 14:30:54 UTC

[jira] Updated: (DERBY-463) Successive writes to a java.sql.Blob.setBinaryStream(long) seem to reset the file pointer

     [ http://issues.apache.org/jira/browse/DERBY-463?page=all ]

Fernanda Pizzorno updated DERBY-463:
------------------------------------

    Attachment: DERBY-463.diff

Change method write (byte[], int, int) in java/client/org/apache/derby/client/am/BlobOutputStream.java. offset_ was not being incremented.

> Successive writes to a java.sql.Blob.setBinaryStream(long) seem to reset the file pointer
> -----------------------------------------------------------------------------------------
>
>          Key: DERBY-463
>          URL: http://issues.apache.org/jira/browse/DERBY-463
>      Project: Derby
>         Type: Bug
>   Components: JDBC
>     Versions: 10.0.2.1
>  Environment: Sun java full version "1.4.2_05-b04"
> Linux x86
> Derby is run in network server mode
>     Reporter: Laurenz Albe
>     Assignee: Fernanda Pizzorno
>  Attachments: DERBY-463.diff
>
> I have a table
> PEOPLE(SEQ_ID INT NOT NULL PRIMARY KEY, PICTURE BLOB).
> A row is inserted; both values are not NULL.
> From inside a JDBC program, I select the Blob for update.
> I then get the Blob output stream with a call to
>   Blob.setBinaryStream(long)
> To this stream I write several times with
>   OutputStream.write(byte[], int, int)
> I close the stream, update the selected row with the new Blob and commit.
> The new value of the Blob now is exactly the value of the last content of the byte[],
> and it is like the previous calls to write() have never taken place, or as if the file pointer
> of the output stream has been reset between the calls.
> A sample program follows; the size of the input file "picture.jpg" is 23237, the length
> of the Blob after the program has run is 23237 % 1024 = 709
> ------------ sample program -------------
> import java.sql.*;
> class TestApp {
>    private TestApp() {}
>    public static void main(String[] args)
>          throws ClassNotFoundException, SQLException, java.io.IOException {
>       // try to load JDBC driver
>       Class.forName("com.ibm.db2.jcc.DB2Driver");
>       // open the input file
>       java.io.InputStream instream = new java.io.FileInputStream("picture.jpg");
>       // login to database
>       Connection conn = DriverManager.getConnection(
>             "jdbc:derby:net://dbtuxe/testdb", "laurenz", "apassword");
>       conn.setAutoCommit(false);
>       // select Blob for update
>       PreparedStatement stmt = conn.prepareStatement(
>             "SELECT PICTURE FROM PEOPLE WHERE SEQ_ID=? FOR UPDATE OF PICTURE");
>       stmt.setInt(1, 1);
>       ResultSet rs = stmt.executeQuery();
>       // get Blob output stream
>       rs.next();
>       Blob blob = rs.getBlob(1);
>       java.io.OutputStream outstream = blob.setBinaryStream(1l);
>       // copy the input file to the Blob in chunks of 1K
>       byte[] buf = new byte[1024];
>       int count;
>       while (-1 != (count = instream.read(buf))) {
>          outstream.write(buf, 0, count);
>          System.out.println("Written " + count + " bytes to Blob");
>       }
>       // close streams
>       instream.close();
>       outstream.close();
>       // update Blob with new value
>       String cursor = rs.getCursorName();
>       PreparedStatement stmt2 = conn.prepareStatement(
>             "UPDATE PEOPLE SET PICTURE=? WHERE CURRENT OF " + cursor);
>       stmt2.setBlob(1, blob);
>       stmt2.executeUpdate();
>       // clean up
>       stmt2.close();
>       stmt.close();
>       conn.commit();
>       conn.close();
>    }
> }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


Re: [jira] Updated: (DERBY-463) Successive writes to a java.sql.Blob.setBinaryStream(long) seem to reset the file pointer

Posted by Oy...@Sun.COM.
Fernanda Pizzorno (JIRA) wrote:
>      [ http://issues.apache.org/jira/browse/DERBY-463?page=all ]
> 
> Fernanda Pizzorno updated DERBY-463:
> ------------------------------------
> 
>     Attachment: DERBY-463.diff
> 
> Change method write (byte[], int, int) in java/client/org/apache/derby/client/am/BlobOutputStream.java. offset_ was not being incremented.

I'll review your patch.

-- 
Øyvind Bakksjø
Sun Microsystems, Database Technology Group
Haakon VII gt. 7b, N-7485 Trondheim, Norway
Tel: x43419 / +47 73842119, Fax: +47 73842101