Top Description Fields Constructors Methods
org.hsqldb.jdbc

public Class JDBCBlob

extends Object
implements Blob
Class Inheritance
All Implemented Interfaces
java.sql.Blob, java.lang.AutoCloseable
Imports
java.io.ByteArrayInputStream, .InputStream, .OutputStream, java.sql.Blob, .SQLException, .SQLFeatureNotSupportedException, org.hsqldb.error.ErrorCode, org.hsqldb.lib.KMPSearchAlgorithm, org.hsqldb.lib.java.JavaSystem

The representation (mapping) in the Java programming language of an SQL BLOB value. An SQL BLOB is a built-in type that stores a Binary Large Object as a column value in a row of a database table. By default drivers implement Blob using an SQL locator(BLOB), which means that a Blob object contains a logical pointer to the SQL BLOB data rather than the data itself. A Blob object is valid for the duration of the transaction in which it was created.

Methods in the interfaces java.sql.ResultSet, java.sql.CallableStatement, and java.sql.PreparedStatement, such as getBlob and setBlob allow a programmer to access an SQL BLOB value. The Blob interface provides methods for getting the length of an SQL BLOB (Binary Large Object) value, for materializing a BLOB value on the client, and for determining the position of a pattern of bytes within a BLOB value. In addition, this interface has methods for updating a BLOB value.

All methods on the Blob interface must be fully implemented if the JDBC driver supports the data type.

HSQLDB-Specific Information:

Previous to 2.0, the HSQLDB driver did not implement Blob using an SQL locator(BLOB). That is, an HSQLDB Blob object did not contain a logical pointer to SQL BLOB data; rather it directly contained a representation of the data (a byte array). As a result, an HSQLDB Blob object was itself valid beyond the duration of the transaction in which is was created, although it did not necessarily represent a corresponding value on the database. Also, the interface methods for updating a BLOB value were unsupported, with the exception of the truncate method, in that it could be used to truncate the local value.

Starting with 2.0, the HSQLDB driver fully supports both local and remote SQL BLOB data implementations, meaning that an HSQLDB Blob object may contain a logical pointer to remote SQL BLOB data (see JDBCBlobClient) or it may directly contain a local representation of the data (as implemented in this class). In particular, when the product is built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), then the resulting Blob instance is initially disconnected (is not bound to the transaction scope of the vending Connection object), the data is contained directly and all interface methods for updating the BLOB value are supported for local use until the first invocation of free(); otherwise, an HSQLDB Blob's implementation is determined at runtime by the driver, it is typically not valid beyond the duration of the transaction in which is was created, and there no standard way to query whether it represents a local or remote value.

Authors
james house ([email protected]), Campbell Burnet (campbell-burnet@users dot sourceforge.net)
Since
JDK 1.2, HSQLDB 1.7.2
Version
2.7.3

Field Summary

Modifier and TypeField and Description
private boolean
private final boolean
private byte[]
private static final long
private static final long
private static final byte[]

Constructor Summary

AccessConstructor and Description
public
JDBCBlob(final byte[]
the octet sequence representing the Blob value
data
)

Constructs a new JDBCBlob instance wrapping the given octet sequence.

protected

Method Summary

Modifier and TypeMethod and Description
protected synchronized void
protected void
protected byte[]
data()

public synchronized void
free()

Implements java.sql.Blob.free.

This method frees the Blob object and releases the resources that it holds.

public InputStream

Returns:

a stream containing the BLOB data
getBinaryStream
()

Implements java.sql.Blob.getBinaryStream.

Retrieves the BLOB value designated by this Blob instance as a stream.

public InputStream

Returns:

InputStream through which the partial Blob value can be read.
getBinaryStream
(long
the offset to the first byte of the partial value to be retrieved. The first byte in the Blob is at position 1.
pos
,
long
the length in bytes of the partial value to be retrieved
length
)

Implements java.sql.Blob.getBinaryStream.

Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.

public byte[]

Returns:

a byte array containing up to length consecutive bytes from the BLOB value designated by this Blob object, starting with the byte at position pos
getBytes
(long
the ordinal position of the first byte in the BLOB value to be extracted; the first byte is at position 1
pos
,
final int
the number of consecutive bytes to be copied; the value for length must be 0 or greater
length
)

Implements java.sql.Blob.getBytes.

Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes.

private synchronized byte[]
public long

Returns:

length of the BLOB in bytes
length
()

Implements java.sql.Blob.length.

Returns the number of bytes in the BLOB value designated by this Blob object.

public long

Returns:

the position at which the pattern appears, else -1
position
(final byte[]
the byte array for which to search
pattern
,
final long
the position at which to begin searching; the first position is 1
start
)

Implements java.sql.Blob.position.

Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents.

public long

Returns:

the position at which the pattern begins, else -1
position
(final Blob
the Blob object designating the BLOB value for which to search
pattern
,
long
the position in the BLOB value at which to begin searching; the first position is 1
start
)

Implements java.sql.Blob.position.

Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins.

public OutputStream

Returns:

a java.io.OutputStream object to which data can be written
setBinaryStream
(final long
the position in the BLOB value at which to start writing; the first position is 1
pos
)

Implements java.sql.Blob.setBinaryStream.

Retrieves a stream that can be used to write to the BLOB value that this Blob object represents.

public int

Returns:

the number of bytes written
setBytes
(long
the position in the BLOB object at which to start writing; the first position is 1
pos
,
byte[]
the array of bytes to be written to the BLOB value that this Blob object represents
bytes
)

Implements java.sql.Blob.setBytes.

Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written.

public int

Returns:

the number of bytes written
setBytes
(long
the position in the BLOB object at which to start writing; the first position is 1
pos
,
byte[]
the array of bytes to be written to this BLOB object
bytes
,
int
the offset into the array bytes at which to start reading the bytes to be set
offset
,
int
the number of bytes to be written to the BLOB value from the array of bytes bytes
len
)

Implements java.sql.Blob.setBytes.

Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written.

private synchronized void
setData(byte[] data)

public void
truncate(final long
the length, in bytes, to which the BLOB value that this Blob object represents should be truncated
len
)

Implements java.sql.Blob.truncate.

Truncates the BLOB value that this Blob object represents to be len bytes in length.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

m_closedback to summary
private boolean m_closed
m_createdByConnectionback to summary
private final boolean m_createdByConnection
m_databack to summary
private byte[] m_data
MAX_POSback to summary
private static final long MAX_POS
MIN_POSback to summary
private static final long MIN_POS
NO_BYTESback to summary
private static final byte[] NO_BYTES

Constructor Detail

JDBCBlobback to summary
public JDBCBlob(final byte[] data) throws SQLException

Constructs a new JDBCBlob instance wrapping the given octet sequence.

This constructor is used internally to retrieve result set values as Blob objects, yet it must be public to allow access from other packages. As such (in the interest of efficiency) this object maintains a reference to the given octet sequence rather than making a copy; special care should be taken by external clients never to use this constructor with a byte array object that may later be modified externally.

Parameters
data:byte[]

the octet sequence representing the Blob value

Exceptions
SQLException:
if the argument is null
JDBCBlobback to summary
protected JDBCBlob()

Method Detail

checkClosedback to summary
protected synchronized void checkClosed() throws SQLException
checkReadonlyback to summary
protected void checkReadonly() throws SQLException
databack to summary
protected byte[] data() throws SQLException
freeback to summary
public synchronized void free() throws SQLException

Implements java.sql.Blob.free.

This method frees the Blob object and releases the resources that it holds. The object is invalid once the free method is called.

After free has been called, any attempt to invoke a method other than free will result in an SQLException being thrown. If free is called multiple times, the subsequent calls to free are treated as a no-op.

Exceptions
SQLException:
if an error occurs releasing the Blob's resources
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.6, HSQLDB 2.0
getBinaryStreamback to summary
public InputStream getBinaryStream() throws SQLException

Implements java.sql.Blob.getBinaryStream.

Retrieves the BLOB value designated by this Blob instance as a stream.

Returns:InputStream

a stream containing the BLOB data

Exceptions
SQLException:
if there is an error accessing the BLOB value
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.2, HSQLDB 1.7.2
See Also
setBinaryStream
getBinaryStreamback to summary
public InputStream getBinaryStream(long pos, long length) throws SQLException

Implements java.sql.Blob.getBinaryStream.

Returns an InputStream object that contains a partial Blob value, starting with the byte specified by pos, which is length bytes in length.

Parameters
pos:long

the offset to the first byte of the partial value to be retrieved. The first byte in the Blob is at position 1.

length:long

the length in bytes of the partial value to be retrieved

Returns:InputStream

InputStream through which the partial Blob value can be read.

Exceptions
SQLException:
if pos is less than 1 or if pos is greater than the number of bytes in the Blob or if pos + length is greater than the number of bytes in the Blob
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.6, HSQLDB 2.0
getBytesback to summary
public byte[] getBytes(long pos, final int length) throws SQLException

Implements java.sql.Blob.getBytes.

Retrieves all or part of the BLOB value that this Blob object represents, as an array of bytes. This byte array contains up to length consecutive bytes starting at position pos.

HSQLDB-Specific Information:

The official specification above is ambiguous in that it does not precisely indicate the policy to be observed when pos > this.length() - length. One policy would be to retrieve the octets from pos to this.length(). Another would be to throw an exception. HSQLDB observes the second policy.
Parameters
pos:long

the ordinal position of the first byte in the BLOB value to be extracted; the first byte is at position 1

length:int

the number of consecutive bytes to be copied; the value for length must be 0 or greater

Returns:byte[]

a byte array containing up to length consecutive bytes from the BLOB value designated by this Blob object, starting with the byte at position pos

Exceptions
SQLException:
if there is an error accessing the BLOB value; if pos is less than 1 or length is less than 0
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.2, HSQLDB 1.7.2
See Also
setBytes
getDataback to summary
private synchronized byte[] getData() throws SQLException
lengthback to summary
public long length() throws SQLException

Implements java.sql.Blob.length.

Returns the number of bytes in the BLOB value designated by this Blob object.

Returns:long

length of the BLOB in bytes

Exceptions
SQLException:
if there is an error accessing the length of the BLOB
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.2, HSQLDB 1.7.2
positionback to summary
public long position(final byte[] pattern, final long start) throws SQLException

Implements java.sql.Blob.position.

Retrieves the byte position at which the specified byte array pattern begins within the BLOB value that this Blob object represents. The search for pattern begins at position start.

Parameters
pattern:byte[]

the byte array for which to search

start:long

the position at which to begin searching; the first position is 1

Returns:long

the position at which the pattern appears, else -1

Exceptions
SQLException:
if there is an error accessing the BLOB or if start is less than 1
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.2, HSQLDB 1.7.2
positionback to summary
public long position(final Blob pattern, long start) throws SQLException

Implements java.sql.Blob.position.

Retrieves the byte position in the BLOB value designated by this Blob object at which pattern begins. The search begins at position start.

Parameters
pattern:Blob

the Blob object designating the BLOB value for which to search

start:long

the position in the BLOB value at which to begin searching; the first position is 1

Returns:long

the position at which the pattern begins, else -1

Exceptions
SQLException:
if there is an error accessing the BLOB value or if start is less than 1
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.2, HSQLDB 1.7.2
setBinaryStreamback to summary
public OutputStream setBinaryStream(final long pos) throws SQLException

Implements java.sql.Blob.setBinaryStream.

Retrieves a stream that can be used to write to the BLOB value that this Blob object represents. The stream begins at position pos. The bytes written to the stream will overwrite the existing bytes in the Blob object starting at the position pos. If the end of the Blob value is reached while writing to the stream, then the length of the Blob value will be increased to accommodate the extra bytes.

Note

If the value specified for pos is greater than the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw an SQLException while other drivers may support this operation.

HSQLDB-Specific Information:

Starting with HSQLDB 2.0 this feature is supported.

When built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createBlob() constructs disconnected, initially empty Blob instances. To propagate the Blob value to a database in this case, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updatable ResultSet.

Implementation Notes

The data written to the stream does not appear in this Blob until the stream is closed

When the stream is closed, if the value specified for pos is greater than the length of the BLOB value, then the BLOB value is extended in length to accept the written octets and the undefined region up to pos is filled with (byte)0.

Starting with HSQLDB 2.1, JDBCBlob no longer utilizes volatile fields and is effectively thread safe, but still uses local variable snapshot isolation.

As such, the synchronization policy still does not strictly enforce serialized read/write access to the underlying data

So, if an application may perform concurrent JDBCBlob modifications and the integrity of the application depends on total order Blob modification semantics, then such operations should be synchronized on an appropriate monitor.

Parameters
pos:long

the position in the BLOB value at which to start writing; the first position is 1

Returns:OutputStream

a java.io.OutputStream object to which data can be written

Exceptions
SQLException:
if there is an error accessing the BLOB value or if pos is less than 1
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.4, HSQLDB 1.7.2
See Also
getBinaryStream
setBytesback to summary
public int setBytes(long pos, byte[] bytes) throws SQLException

Implements java.sql.Blob.setBytes.

Writes the given array of bytes to the BLOB value that this Blob object represents, starting at position pos, and returns the number of bytes written. The array of bytes will overwrite the existing bytes in the Blob object starting at the position pos. If the end of the Blob value is reached while writing the array of bytes, then the length of the Blob value will be increased to accommodate the extra bytes.

Note

If the value specified for pos is greater than the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw an SQLException while other drivers may support this operation.

HSQLDB-Specific Information:

Starting with HSQLDB 2.0 this feature is supported.

When built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createBlob() constructs disconnected, initially empty Blob instances. To propagate the Blob value to a database in this case, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updatable ResultSet.

Implementation Notes

Starting with HSQLDB 2.1, JDBCBlob no longer utilizes volatile fields and is effectively thread safe, but still uses local variable snapshot isolation.

As such, the synchronization policy still does not strictly enforce serialized read/write access to the underlying data

So, if an application may perform concurrent JDBCBlob modifications and the integrity of the application depends on total order Blob modification semantics, then such operations should be synchronized on an appropriate monitor.

Parameters
pos:long

the position in the BLOB object at which to start writing; the first position is 1

bytes:byte[]

the array of bytes to be written to the BLOB value that this Blob object represents

Returns:int

the number of bytes written

Exceptions
SQLException:
if there is an error accessing the BLOB value or if pos is less than 1
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.4, HSQLDB 1.7.2
See Also
getBytes
setBytesback to summary
public int setBytes(long pos, byte[] bytes, int offset, int len) throws SQLException

Implements java.sql.Blob.setBytes.

Writes all or part of the given byte array to the BLOB value that this Blob object represents and returns the number of bytes written. Writing starts at position pos in the BLOB value; len bytes from the given byte array are written. The array of bytes will overwrite the existing bytes in the Blob object starting at the position pos. If the end of the Blob value is reached while writing the array of bytes, then the length of the Blob value will be increased to accommodate the extra bytes.

Note

If the value specified for pos is greater than the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw an SQLException while other drivers may support this operation.

HSQLDB-Specific Information:

Starting with HSQLDB 2.0 this feature is supported.

When built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createBlob() constructs disconnected, initially empty Blob instances. To propagate the Blob value to a database in this case, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updatable ResultSet.

Implementation Notes

If the value specified for pos is greater than the length of the BLOB value, then the BLOB value is extended in length to accept the written octets and the undefined region up to pos is filled with (byte)0.

Starting with HSQLDB 2.1, JDBCBlob no longer utilizes volatile fields and is effectively thread safe, but still uses local variable snapshot isolation.

As such, the synchronization policy still does not strictly enforce serialized read/write access to the underlying data

So, if an application may perform concurrent JDBCBlob modifications and the integrity of the application depends on total order Blob modification semantics, then such operations should be synchronized on an appropriate monitor.

Parameters
pos:long

the position in the BLOB object at which to start writing; the first position is 1

bytes:byte[]

the array of bytes to be written to this BLOB object

offset:int

the offset into the array bytes at which to start reading the bytes to be set

len:int

the number of bytes to be written to the BLOB value from the array of bytes bytes

Returns:int

the number of bytes written

Exceptions
SQLException:
if there is an error accessing the BLOB value or if pos is less than 1
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.4, HSQLDB 1.7.2
See Also
getBytes
setDataback to summary
private synchronized void setData(byte[] data) throws SQLException
truncateback to summary
public void truncate(final long len) throws SQLException

Implements java.sql.Blob.truncate.

Truncates the BLOB value that this Blob object represents to be len bytes in length.

Note

If the value specified for pos is greater than the length+1 of the BLOB value then the behavior is undefined. Some JDBC drivers may throw an SQLException while other drivers may support this operation.

HSQLDB-Specific Information:

Starting with HSQLDB 2.0 this feature is fully supported.

When built under JDK 1.6+ and the Blob instance is constructed as a result of calling JDBCConnection.createBlob(), this operation affects only the client-side value; it has no effect upon a value stored in a database because JDBCConnection.createBlob() constructs disconnected, initially empty Blob instances. To propagate the truncated Blob value to a database in this case, it is required to supply the Blob instance to an updating or inserting setXXX method of a Prepared or Callable Statement, or to supply the Blob instance to an updateXXX method of an updateable ResultSet.

Parameters
len:long

the length, in bytes, to which the BLOB value that this Blob object represents should be truncated

Exceptions
SQLException:
if there is an error accessing the BLOB value or if len is less than 0
SQLFeatureNotSupportedException:
if the JDBC driver does not support this method
Since
JDK 1.4, HSQLDB 1.7.2