Package org.apache.derby.client.am
Class ClientBlob
- java.lang.Object
-
- org.apache.derby.client.am.Lob
-
- org.apache.derby.client.am.ClientBlob
-
- All Implemented Interfaces:
java.sql.Blob
,UnitOfWorkListener
public class ClientBlob extends Lob implements java.sql.Blob
-
-
Field Summary
Fields Modifier and Type Field Description (package private) java.io.InputStream
binaryStream_
(package private) byte[]
binaryString_
(package private) int
dataOffset_
-
Fields inherited from class org.apache.derby.client.am.Lob
agent_, ASCII_STREAM, BINARY_STREAM, BINARY_STRING, CHARACTER_STREAM, dataType_, INVALID_LOCATOR, isValid_, LOCATOR, locator_, STRING, UNICODE_STREAM
-
-
Constructor Summary
Constructors Constructor Description ClientBlob(byte[] binaryString, Agent agent, int dataOffset)
ClientBlob(Agent agent, int locator)
Create aBlob
object for a Blob value stored on the server and indentified bylocator
.ClientBlob(Agent agent, java.io.InputStream binaryStream)
Create a newBlob
from a stream with unknown length.ClientBlob(Agent agent, java.io.InputStream binaryStream, int length)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private long
binaryStringPosition(byte[] pattern, long start)
void
free()
This method frees theBlob
object and releases the resources that it holds.java.io.InputStream
getBinaryStream()
java.io.InputStream
getBinaryStream(long pos, long length)
Returns anInputStream
object that contains a partialBlob
value, starting with the byte specified by pos, which is length bytes in length.(package private) java.io.InputStream
getBinaryStreamX()
byte[]
getBytes(long pos, int length)
Returns as an array of bytes part or all of theBLOB
value that thisBlob
object designates.private byte[]
getBytesX(long pos, int length)
(package private) long
getLocatorLength()
Get the length in bytes of theBlob
value represented by this locator basedobject. boolean
isBinaryStream()
boolean
isBinaryString()
private boolean
isSubString(byte[] pattern, int index)
long
length()
protected void
materializeStream()
Materialize the stream used for input to the database.long
position(byte[] pattern, long start)
long
position(java.sql.Blob pattern, long start)
private long
positionX(byte[] pattern, long start)
private long
positionX(java.sql.Blob pattern, long start)
java.io.OutputStream
setBinaryStream(long pos)
int
setBytes(long pos, byte[] bytes)
int
setBytes(long pos, byte[] bytes, int offset, int len)
(package private) int
setBytesX(long pos, byte[] bytes, int offset, int len)
void
truncate(long len)
-
Methods inherited from class org.apache.derby.client.am.Lob
checkForClosedConnection, checkForLocatorValidity, checkPosAndLength, checkValidity, completeLocalCommit, completeLocalRollback, getAgent, getLocator, getUpdateCount, incrementUpdateCount, isLayerBStreamingPossible, isLocator, listenToUnitOfWork, materializeStream, setSqlLength, sqlLength, willBeLayerBStreamed
-
-
-
-
Constructor Detail
-
ClientBlob
public ClientBlob(byte[] binaryString, Agent agent, int dataOffset)
-
ClientBlob
ClientBlob(Agent agent, java.io.InputStream binaryStream, int length)
-
ClientBlob
ClientBlob(Agent agent, java.io.InputStream binaryStream)
Create a newBlob
from a stream with unknown length. Important: This constructor is a temporary solution for implementing lengthless overloads in the JDBC4 API. Before a proper solution can be implemented, we need to enable streaming without having to know the stream length in the DRDA protocol. See Jira DERBY-1471 and DERBY-1417 for more details. Shortcomings: This constructor will cause the whole stream to be materialized to determine its length. If the stream is big enough, the client will fail with an OutOfMemoryError. Since this is a temporary solution, state checking is not added to all methods as it would clutter up the class severely. After using the constructor, thelength
-method must be called, which will materialize the stream and determine the length. Do not pass a Blob object created with this constructor to the user!- Parameters:
agent
-binaryStream
- the stream to get data from
-
ClientBlob
public ClientBlob(Agent agent, int locator)
Create aBlob
object for a Blob value stored on the server and indentified bylocator
.- Parameters:
agent
- context for this Blob object (incl. connection)locator
- reference id to Blob value on server
-
-
Method Detail
-
length
public long length() throws java.sql.SQLException
-
getLocatorLength
long getLocatorLength() throws SqlException
Get the length in bytes of theBlob
value represented by this locator basedobject. A stored procedure call will be made to get it from the server. - Overrides:
getLocatorLength
in classLob
- Returns:
- length of Blob in bytes
- Throws:
SqlException
-
getBytes
public byte[] getBytes(long pos, int length) throws java.sql.SQLException
Returns as an array of bytes part or all of theBLOB
value that thisBlob
object designates. The byte array contains up tolength
consecutive bytes starting at positionpos
. The starting position must be between 1 and the length of the BLOB plus 1. This allows for zero-length BLOB values, from which only zero-length byte arrays can be returned. If a larger length is requested than there are bytes available, characters from the start position to the end of the BLOB are returned.- Specified by:
getBytes
in interfacejava.sql.Blob
- Parameters:
pos
- the ordinal position of the first byte in theBLOB
value to be extracted; the first byte is at position 1length
- is the number of consecutive bytes to be copied- Returns:
- a byte array containing up to
length
consecutive bytes from theBLOB
value designated by thisBlob
object, starting with the byte at positionstartPos
. - Throws:
java.sql.SQLException
- if there is an error accessing theBLOB
NOTE: If the starting position is the length of the BLOB plus 1, zero bytess are returned regardless of the length requested.
-
getBytesX
private byte[] getBytesX(long pos, int length) throws SqlException
- Throws:
SqlException
-
getBinaryStream
public java.io.InputStream getBinaryStream() throws java.sql.SQLException
- Specified by:
getBinaryStream
in interfacejava.sql.Blob
- Throws:
java.sql.SQLException
-
getBinaryStreamX
java.io.InputStream getBinaryStreamX() throws SqlException
- Throws:
SqlException
-
position
public long position(byte[] pattern, long start) throws java.sql.SQLException
- Specified by:
position
in interfacejava.sql.Blob
- Throws:
java.sql.SQLException
-
positionX
private long positionX(byte[] pattern, long start) throws SqlException
- Throws:
SqlException
-
position
public long position(java.sql.Blob pattern, long start) throws java.sql.SQLException
- Specified by:
position
in interfacejava.sql.Blob
- Throws:
java.sql.SQLException
-
positionX
private long positionX(java.sql.Blob pattern, long start) throws SqlException
- Throws:
SqlException
-
setBytes
public int setBytes(long pos, byte[] bytes) throws java.sql.SQLException
- Specified by:
setBytes
in interfacejava.sql.Blob
- Throws:
java.sql.SQLException
-
setBytes
public int setBytes(long pos, byte[] bytes, int offset, int len) throws java.sql.SQLException
- Specified by:
setBytes
in interfacejava.sql.Blob
- Throws:
java.sql.SQLException
-
setBytesX
int setBytesX(long pos, byte[] bytes, int offset, int len) throws SqlException
- Throws:
SqlException
-
setBinaryStream
public java.io.OutputStream setBinaryStream(long pos) throws java.sql.SQLException
- Specified by:
setBinaryStream
in interfacejava.sql.Blob
- Throws:
java.sql.SQLException
-
truncate
public void truncate(long len) throws java.sql.SQLException
- Specified by:
truncate
in interfacejava.sql.Blob
- Throws:
java.sql.SQLException
-
free
public void free() throws java.sql.SQLException
This method frees theBlob
object and releases the resources that it holds. The object is invalid once thefree
method is called. Iffree
is called multiple times, the subsequent calls tofree
are treated as a no-op.- Specified by:
free
in interfacejava.sql.Blob
- Throws:
java.sql.SQLException
- if an error occurs releasing the Blob's resources
-
getBinaryStream
public java.io.InputStream getBinaryStream(long pos, long length) throws java.sql.SQLException
Returns anInputStream
object that contains a partialBlob
value, starting with the byte specified by pos, which is length bytes in length.- Specified by:
getBinaryStream
in interfacejava.sql.Blob
- Parameters:
pos
- the offset to the first byte of the partial value to be retrieved. The first byte in theBlob
is at position 1.length
- the length in bytes of the partial value to be retrieved- Returns:
InputStream
through which the partialBlob
value can be read.- Throws:
java.sql.SQLException
- if pos is less than 1 or if pos is greater than the number of bytes in theBlob
or ifpos + length
is greater thanBlob.length() +1
-
isBinaryString
public boolean isBinaryString()
-
isBinaryStream
public boolean isBinaryStream()
-
binaryStringPosition
private long binaryStringPosition(byte[] pattern, long start)
-
isSubString
private boolean isSubString(byte[] pattern, int index)
-
materializeStream
protected void materializeStream() throws SqlException
Materialize the stream used for input to the database.- Specified by:
materializeStream
in classLob
- Throws:
SqlException
-
-