public final class InlineBlob extends java.lang.Object implements FbBlob
FbBlob to hold an inline blob.
This blob may remain open on transaction end or database detach. However, this is considered an implementation detail which may change in point releases.
FbBlob.SeekModeNO_BLOB_ID| Constructor and Description |
|---|
InlineBlob(FbDatabase database,
long blobId,
int transactionHandle,
byte[] info,
byte[] data)
Creates an inline blob.
|
| Modifier and Type | Method and Description |
|---|---|
void |
addExceptionListener(ExceptionListener listener)
Adds an exception listener to this object.
|
void |
cancel()
Cancels an output blob (which means its contents will be thrown away).
|
void |
close()
Closes the blob.
|
InlineBlob |
copy() |
int |
get(byte[] b,
int off,
int len)
Reads content from the blob into
b starting at off for len bytes. |
int |
get(byte[] b,
int off,
int len,
float minFillFactor)
Variant of
FbBlob.get(byte[], int, int) to exert some control over the number of requests performed. |
long |
getBlobId()
Returns the blob id.
|
byte[] |
getBlobInfo(byte[] requestItems,
int bufferLength)
Request blob info.
|
<T> T |
getBlobInfo(byte[] requestItems,
int bufferLength,
InfoProcessor<T> infoProcessor)
Request blob info.
|
FbDatabase |
getDatabase() |
int |
getHandle()
Returns the blob handle identifier.
|
int |
getMaximumSegmentSize()
The maximum segment size allowed by the protocol for
FbBlob.getSegment(int) and FbBlob.putSegment(byte[]). |
byte[] |
getSegment(int sizeRequested)
Gets a segment of blob data.
|
int |
getTransactionHandle() |
boolean |
isEof() |
boolean |
isOpen() |
boolean |
isOutput() |
long |
length()
Requests the blob length from the server.
|
void |
open()
Opens an existing input blob, or creates an output blob.
|
void |
put(byte[] b,
int off,
int len)
Writes content of
b starting at off for length bytes to the blob. |
void |
putSegment(byte[] segment)
Writes a segment of blob data.
|
void |
removeExceptionListener(ExceptionListener listener)
Removes an exception listener to this object.
|
void |
seek(int offset,
FbBlob.SeekMode seekMode)
Performs a seek on a blob with the specified
seekMode and offset. |
public InlineBlob(FbDatabase database, long blobId, int transactionHandle, byte[] info, byte[] data)
database - database that created this blobblobId - blob idtransactionHandle - handle of the transaction for which this blob is validinfo - blob info (cannot be null), if empty an array containing isc_info_end will be useddata - actual blob data without segments (cannot be null)public long getBlobId()
FbBlob
For output blobs, this will return FbBlob.NO_BLOB_ID (0L) if the blob wasn't opened yet, or if the blob
is deferred opened (client-side only). The value FbBlob.NO_BLOB_ID is technically invalid, but Firebird will
handle it as an empty blob (both for input and output).
public int getTransactionHandle()
public int getHandle()
If the blob wasn't opened yet, this will return 0. If the blob was deferred opened (client-side only),
this will return an invalid blob handle value (e.g. 0xFFFF, though this value is potentially
protocol/implementation specific).
An inline blob has no server-side counterpart, so we generate a value greater than 65535 as its handle.
public FbDatabase getDatabase()
getDatabase in interface FbBlobpublic void open()
throws java.sql.SQLException
FbBlobpublic boolean isOpen()
public boolean isEof()
public void close()
FbBlobClosing an already closed blob is a no-op.
public void cancel()
FbBlob
Calling cancel on an input blob will close it. Contrary to FbBlob.close(), calling cancel on an
already closed (or cancelled) blob will throw an SQLException.
public boolean isOutput()
public byte[] getSegment(int sizeRequested)
throws java.sql.SQLException
FbBlob
When sizeRequested exceeds FbBlob.getMaximumSegmentSize() it is silently reduced to the maximum
segment size.
getSegment in interface FbBlobsizeRequested - Requested segment size (> 0).java.sql.SQLException - If this is an output blob, the blob is closed, the transaction is not active, or a database connection
error occurred.FbBlob.get(byte[], int, int)public int get(byte[] b,
int off,
int len)
throws java.sql.SQLException
FbBlobb starting at off for len bytes.
Implementations must read the requested number of bytes (len), unless end-of-blob is reached before
the requested number of bytes were read. The return value of this method is the actual number of bytes read.
If the implementation cannot perform reads without additional allocation, it should use at most
DatabaseConnectionProperties.getBlobBufferSize() as an internal buffer. If the implementation can
perform reads without additional allocation, it is recommended it performs reads using (at most)
FbBlob.getMaximumSegmentSize().
Contrary to similar methods like InputStream.read(byte[], int, int), this method returns
0 when no bytes were read if end-of-blob is reached without reading any bytes, not -1.
Given this method attempts to fulfill the entire request for len bytes, it may not always be efficient.
For example, requests near multiples of the maximum segment size (or blob buffer size) may result in a final
request for just a few bytes. This is not a problem if the entire blob is requested at once, but for intermediate
buffering it might be better not to do that final request, and instead work with a smaller number of bytes than
requested. For those cases, use FbBlob.get(byte[], int, int, float).
get in interface FbBlobb - target byte arrayoff - offset to startlen - number of byteslen when end-of-blob was reachedjava.sql.SQLException - for database access errors, if off < 0, len < 0, or if off + len > b.lengthpublic int get(byte[] b,
int off,
int len,
float minFillFactor)
throws java.sql.SQLException
FbBlobFbBlob.get(byte[], int, int) to exert some control over the number of requests performed.
This method will request segments until at least (int) (minFillFactor * len) bytes have been retrieved,
or end-of-blob is reached. This method is intended as an alternative to FbBlob.get(byte[], int, int) where
avoiding the potential inefficiencies of that method are preferred over getting all the requested len
bytes.
If the implementation cannot perform reads without additional allocation, it should use at most
DatabaseConnectionProperties.getBlobBufferSize() as an internal buffer. If the implementation can
perform reads without additional allocation, it is recommended it performs reads using (at most)
FbBlob.getMaximumSegmentSize().
Contrary to similar methods like InputStream.read(byte[], int, int), this method returns
0 when no bytes were read if end-of-blob is reached without reading any bytes, not -1.
get in interface FbBlobb - target byte arrayoff - offset to startlen - number of bytesminFillFactor - minimum fill factor (0 < minFillFactor <= 1)(int) (minFillFactor * len) bytes,
unless end-of-blob is reachedjava.sql.SQLException - for database access errors, if off < 0, len < 0, or if off + len > b.length,
minFillFactor <= 0, or minFillFactor > 1 or minFillFactor is NaNpublic void putSegment(byte[] segment)
throws java.sql.SQLException
FbBlob
Implementations must handle segment lengths exceeding FbBlob.getMaximumSegmentSize() by batching. This method
should either call put(segment, 0, segment.length), or produce the same effects as that call.
Passing a section that is length 0 will throw an SQLException.
putSegment in interface FbBlobsegment - segment to writejava.sql.SQLException - if this is an input blob, the blob is closed, the transaction is not active, the segment is length 0, or
a database connection error occurredFbBlob.put(byte[], int, int)public void put(byte[] b,
int off,
int len)
throws java.sql.SQLException
FbBlobb starting at off for length bytes to the blob.
Implementations must write all bytes to the blob, using multiple round-trips if necessary.
If the implementation cannot perform writes without additional allocation, it should use at most
DatabaseConnectionProperties.getBlobBufferSize() as an internal buffer. If the implementation can
perform writes without additional allocation, it is recommended it performs reads using (at most)
FbBlob.getMaximumSegmentSize().
public void seek(int offset,
FbBlob.SeekMode seekMode)
throws java.sql.SQLException
FbBlobseekMode and offset.
Firebird only supports seek on stream blobs.
seek in interface FbBloboffset - Offset of the seek, effect depends on value of seekModeseekMode - Value of FbBlob.SeekModejava.sql.SQLException - If the blob is closed, the transaction is not active, or a database error occurred.public int getMaximumSegmentSize()
FbBlobFbBlob.getSegment(int) and FbBlob.putSegment(byte[]).
This value is not the segment size (optionally) defined for the column.
getMaximumSegmentSize in interface FbBlobpublic <T> T getBlobInfo(byte[] requestItems,
int bufferLength,
InfoProcessor<T> infoProcessor)
throws java.sql.SQLException
FbBlobgetBlobInfo in interface FbBlobrequestItems - Array of info items to requestbufferLength - Response buffer length to useinfoProcessor - Implementation of InfoProcessor to transform
the info responsejava.sql.SQLException - For errors retrieving or transforming the response.public long length()
FbBlobpublic byte[] getBlobInfo(byte[] requestItems,
int bufferLength)
throws java.sql.SQLException
Unknown blob info items are ignored, and only known items are returned.
getBlobInfo in interface FbBlobrequestItems - Array of info items to requestbufferLength - Response buffer length to usejava.sql.SQLExceptionpublic void addExceptionListener(ExceptionListener listener)
ExceptionListenable
Implementations use WeakReference.
addExceptionListener in interface ExceptionListenablelistener - Listener to registerpublic void removeExceptionListener(ExceptionListener listener)
ExceptionListenableremoveExceptionListener in interface ExceptionListenablelistener - Listener to removepublic InlineBlob copy()
Copyright © 2001-2025 Jaybird (Firebird JDBC) team. All rights reserved.