db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Satheesh Bandaram (JIRA)" <derby-...@db.apache.org>
Subject [jira] Commented: (DERBY-463) Successive writes to a java.sql.Blob.setBinaryStream(long) seem to reset the file pointer
Date Fri, 04 Nov 2005 02:24:04 GMT
    [ http://issues.apache.org/jira/browse/DERBY-463?page=comments#action_12356735 ] 

Satheesh Bandaram commented on DERBY-463:
-----------------------------------------

Submitted this patch. Thanks for addressing my review comments and fixing other API calls
too. I do like your new test!

Looks like you haven't signed an ICLA with Apache... I would advise considering this step
as your patches are getting bigger ...!

Sending        java\client\org\apache\derby\client\am\BlobOutputStream.java
Sending        java\client\org\apache\derby\client\am\ClobOutputStream.java
Deleting       java\testing\org\apache\derbyTesting\functionTests\master\blobSetBinaryStream.out
Adding         java\testing\org\apache\derbyTesting\functionTests\master\lobStreams.out
Sending        java\testing\org\apache\derbyTesting\functionTests\suites\derbynetclientmats.runall
Deleting       java\testing\org\apache\derbyTesting\functionTests\tests\jdbcapi\blobSetBinaryStream.java
Deleting       java\testing\org\apache\derbyTesting\functionTests\tests\jdbcapi\blobSetBinaryStream_app.properties
Sending        java\testing\org\apache\derbyTesting\functionTests\tests\jdbcapi\build.xml
Sending        java\testing\org\apache\derbyTesting\functionTests\tests\jdbcapi\copyfiles.ant
Adding         java\testing\org\apache\derbyTesting\functionTests\tests\jdbcapi\lobStreams.java
Adding         java\testing\org\apache\derbyTesting\functionTests\tests\jdbcapi\lobStreams_app.properties
Transmitting file data ........
Committed revision 330687.

> 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
>      Fix For: 10.2.0.0
>  Attachments: DERBY-463.diff, DERBY-463.diff, DERBY-463.stat, DERBY-463.stat
>
> 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


Mime
View raw message