| /* |
| * |
| * Derby - Class |
| * org.apache.derbyTesting.functionTests.tests.jdbcapi.BlobUpdatableStreamTest |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, |
| * either express or implied. See the License for the specific |
| * language governing permissions and limitations under the License. |
| */ |
| package org.apache.derbyTesting.functionTests.tests.jdbcapi; |
| |
| import java.io.InputStream; |
| import java.sql.Blob; |
| import java.sql.PreparedStatement; |
| import java.sql.ResultSet; |
| import java.sql.Statement; |
| import junit.framework.Test; |
| import org.apache.derbyTesting.functionTests.util.streams.LoopingAlphabetStream; |
| import org.apache.derbyTesting.junit.BaseJDBCTestCase; |
| import org.apache.derbyTesting.junit.TestConfiguration; |
| |
| /** |
| * Test if blob stream updates itself to point to LOBInputStream |
| * if the blob is updated after fetching the stream. |
| */ |
| public class BlobUpdatableStreamTest extends BaseJDBCTestCase { |
| public BlobUpdatableStreamTest (String name) { |
| super (name); |
| } |
| |
| public void testUpdatableBlob () throws Exception { |
| getConnection().setAutoCommit (false); |
| PreparedStatement ps = prepareStatement ("insert into testblob " + |
| "values (?)"); |
| //insert a large blob to ensure dvd gives out a stream and not |
| //a byte array |
| ps.setBinaryStream (1, new LoopingAlphabetStream (1024 * 1024), 1024 * 1024); |
| ps.executeUpdate(); |
| ps.close(); |
| Statement stmt = createStatement (); |
| ResultSet rs = stmt.executeQuery("select * from testblob"); |
| rs.next(); |
| Blob blob = rs.getBlob (1); |
| InputStream is = blob.getBinaryStream(); |
| long l = is.skip (20); |
| //truncate blob after accessing original stream |
| blob.truncate (l); |
| int ret = is.read(); |
| //should not be able to read after truncated value |
| assertEquals ("stream update failed", -1, ret); |
| byte [] buffer = new byte [1024]; |
| for (int i = 0; i < buffer.length; i++) |
| buffer [i] = (byte) (i % 255); |
| blob.setBytes (blob.length() + 1, buffer); |
| byte [] buff = new byte [1024]; |
| int toRead = 1024; |
| while (toRead != 0 ) { |
| long read = is.read (buff, 1024 - toRead, toRead); |
| if (read < 0) |
| fail ("couldn't retrieve updated value"); |
| toRead -= read; |
| } |
| for (int i = 0; i < buffer.length; i++) { |
| assertEquals ("value retrieved is not same as updated value", |
| buffer [i], buff [i]); |
| } |
| blob = null; |
| rs.close(); |
| stmt.close(); |
| commit(); |
| } |
| |
| public static Test suite () { |
| return TestConfiguration.defaultSuite ( |
| BlobUpdatableStreamTest.class); |
| } |
| |
| public void setUp() throws Exception { |
| Statement stmt = createStatement(); |
| stmt.execute ("create table testblob (data blob)"); |
| stmt.close(); |
| } |
| |
| protected void tearDown() throws Exception { |
| Statement stmt = createStatement(); |
| stmt.execute ("drop table testblob"); |
| stmt.close(); |
| commit (); |
| super.tearDown(); |
| } |
| } |