[ http://issues.apache.org/jira/browse/DERBY-463?page=all ]
Fernanda Pizzorno updated DERBY-463: ------------------------------------ Attachment: DERBY-463.stat > 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, 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