[ http://issues.apache.org/jira/browse/DERBY-463?page=all ]
Deepa Remesh updated DERBY-463:
-------------------------------
Attachment: derby-463-v10.1.diff
derby-463-v10.1.status
Attaching 'derby-463-v10.1.diff' which ports this fix to 10.1 branch. This port
is required to merge and test DERBY-683. A direct merge was not possible. Hence
created a patch for v10.1.
With this patch, I ran derbyall in v10.1 with Sun jdk 1.4.2 on Windows XP.
Please take a look at this patch. Thanks.
> 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,
> derby-463-v10.1.diff, derby-463-v10.1.status
>
> 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