- All Implemented Interfaces:
AutoCloseable,FbBlob,ExceptionListenable
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.
- Since:
- 6.0.2
- Author:
- Mark Rotteveel
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.firebirdsql.gds.ng.FbBlob
FbBlob.SeekMode -
Field Summary
Fields inherited from interface org.firebirdsql.gds.ng.FbBlob
NO_BLOB_ID -
Constructor Summary
ConstructorsConstructorDescriptionInlineBlob(FbDatabase database, long blobId, int transactionHandle, byte[] info, byte[] data) Creates an inline blob. -
Method Summary
Modifier and TypeMethodDescriptionvoidaddExceptionListener(ExceptionListener listener) Adds an exception listener to this object.voidcancel()Cancels an output blob (which means its contents will be thrown away).voidclose()Closes the blob.copy()intget(byte[] b, int off, int len) Reads content from the blob intobstarting atoffforlenbytes.intget(byte[] b, int off, int len, float minFillFactor) Variant ofFbBlob.get(byte[], int, int)to exert some control over the number of requests performed.longReturns the blob id.byte[]getBlobInfo(byte[] requestItems, int bufferLength) Request blob info.<T> TgetBlobInfo(byte[] requestItems, int bufferLength, InfoProcessor<T> infoProcessor) Request blob info.intReturns the blob handle identifier.intThe maximum segment size allowed by the protocol forFbBlob.getSegment(int)andFbBlob.putSegment(byte[]).byte[]getSegment(int sizeRequested) Gets a segment of blob data.intbooleanisEof()booleanisOpen()booleanisOutput()longlength()Requests the blob length from the server.voidopen()Opens an existing input blob, or creates an output blob.voidput(byte[] b, int off, int len) Writes content ofbstarting atoffforlengthbytes to the blob.voidputSegment(byte[] segment) Writes a segment of blob data.voidremoveExceptionListener(ExceptionListener listener) Removes an exception listener to this object.voidseek(int offset, FbBlob.SeekMode seekMode) Performs a seek on a blob with the specifiedseekModeandoffset.
-
Constructor Details
-
InlineBlob
public InlineBlob(FbDatabase database, long blobId, int transactionHandle, byte[] info, byte[] data) Creates an inline blob.- Parameters:
database- database that created this blobblobId- blob idtransactionHandle- handle of the transaction for which this blob is validinfo- blob info (cannot benull), if empty an array containingisc_info_endwill be useddata- actual blob data without segments (cannot benull)
-
-
Method Details
-
getBlobId
public long getBlobId()Description copied from interface:FbBlobReturns the blob id.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 valueFbBlob.NO_BLOB_IDis technically invalid, but Firebird will handle it as an empty blob (both for input and output). -
getTransactionHandle
public int getTransactionHandle()- Returns:
- the transaction handle this inline blob is valid for
-
getHandle
public int getHandle()Returns the blob handle identifier.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.
-
getDatabase
- Specified by:
getDatabasein interfaceFbBlob- Returns:
- The database connection that created this blob
-
open
Description copied from interface:FbBlobOpens an existing input blob, or creates an output blob.- Specified by:
openin interfaceFbBlob- Throws:
SQLException- If the blob is already open, this is a (closed) output blob and it already has a blobId, the transaction is not active, or a database connection error occurred
-
isOpen
public boolean isOpen() -
isEof
public boolean isEof() -
close
public void close()Description copied from interface:FbBlobCloses the blob.Closing an already closed blob is a no-op.
- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceFbBlob
-
cancel
public void cancel()Description copied from interface:FbBlobCancels an output blob (which means its contents will be thrown away).Calling cancel on an input blob will close it. Contrary to
FbBlob.close(), calling cancel on an already closed (or cancelled) blob will throw anSQLException. -
isOutput
public boolean isOutput() -
getSegment
Description copied from interface:FbBlobGets a segment of blob data.When
sizeRequestedexceedsFbBlob.getMaximumSegmentSize()it is silently reduced to the maximum segment size.- Specified by:
getSegmentin interfaceFbBlob- Parameters:
sizeRequested- Requested segment size (> 0).- Returns:
- Retrieved segment (size may be less than requested)
- Throws:
SQLException- If this is an output blob, the blob is closed, the transaction is not active, or a database connection error occurred.- See Also:
-
get
Description copied from interface:FbBlobReads content from the blob intobstarting atoffforlenbytes.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 returns0when 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
lenbytes, 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, useFbBlob.get(byte[], int, int, float).- Specified by:
getin interfaceFbBlob- Parameters:
b- target byte arrayoff- offset to startlen- number of bytes- Returns:
- actual number of bytes read; this will only be less than
lenwhen end-of-blob was reached - Throws:
SQLException- for database access errors, ifoff < 0,len < 0, or ifoff + len > b.length
-
get
Description copied from interface:FbBlobVariant ofFbBlob.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 toFbBlob.get(byte[], int, int)where avoiding the potential inefficiencies of that method are preferred over getting all the requestedlenbytes.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 returns0when no bytes were read if end-of-blob is reached without reading any bytes, not-1.- Specified by:
getin interfaceFbBlob- Parameters:
b- target byte arrayoff- offset to startlen- number of bytesminFillFactor- minimum fill factor (0 < minFillFactor <= 1)- Returns:
- actual number of bytes read, this method returns at least
(int) (minFillFactor * len)bytes, unless end-of-blob is reached - Throws:
SQLException- for database access errors, ifoff < 0,len < 0, or ifoff + len > b.length,minFillFactor <= 0, orminFillFactor > 1orminFillFactor is NaN
-
putSegment
Description copied from interface:FbBlobWrites a segment of blob data.Implementations must handle segment lengths exceeding
FbBlob.getMaximumSegmentSize()by batching. This method should either callput(segment, 0, segment.length), or produce the same effects as that call.Passing a section that is length 0 will throw an
SQLException.- Specified by:
putSegmentin interfaceFbBlob- Parameters:
segment- segment to write- Throws:
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 occurred- See Also:
-
put
Description copied from interface:FbBlobWrites content ofbstarting atoffforlengthbytes 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().- Specified by:
putin interfaceFbBlob- Parameters:
b- source byte arrayoff- offset to startlen- number of bytes- Throws:
SQLException- for database access errors, ifoff < 0,len < 0, or ifoff + len > b.length
-
seek
Description copied from interface:FbBlobPerforms a seek on a blob with the specifiedseekModeandoffset.Firebird only supports seek on stream blobs.
- Specified by:
seekin interfaceFbBlob- Parameters:
offset- Offset of the seek, effect depends on value ofseekModeseekMode- Value ofFbBlob.SeekMode- Throws:
SQLException- If the blob is closed, the transaction is not active, or a database error occurred.
-
getMaximumSegmentSize
public int getMaximumSegmentSize()Description copied from interface:FbBlobThe maximum segment size allowed by the protocol forFbBlob.getSegment(int)andFbBlob.putSegment(byte[]).This value is not the segment size (optionally) defined for the column.
- Specified by:
getMaximumSegmentSizein interfaceFbBlob- Returns:
- The maximum segment size allowed for get or put.
-
getBlobInfo
public <T> T getBlobInfo(byte[] requestItems, int bufferLength, InfoProcessor<T> infoProcessor) throws SQLException Description copied from interface:FbBlobRequest blob info.- Specified by:
getBlobInfoin interfaceFbBlob- Parameters:
requestItems- Array of info items to requestbufferLength- Response buffer length to useinfoProcessor- Implementation ofInfoProcessorto transform the info response- Returns:
- Transformed info response of type T
- Throws:
SQLException- For errors retrieving or transforming the response.
-
length
public long length()Description copied from interface:FbBlobRequests the blob length from the server. -
getBlobInfo
Request blob info.Unknown blob info items are ignored, and only known items are returned.
- Specified by:
getBlobInfoin interfaceFbBlob- Parameters:
requestItems- Array of info items to requestbufferLength- Response buffer length to use- Returns:
- Response buffer
- Throws:
SQLException
-
addExceptionListener
Description copied from interface:ExceptionListenableAdds an exception listener to this object.Implementations use
WeakReference.- Specified by:
addExceptionListenerin interfaceExceptionListenable- Parameters:
listener- Listener to register
-
removeExceptionListener
Description copied from interface:ExceptionListenableRemoves an exception listener to this object.- Specified by:
removeExceptionListenerin interfaceExceptionListenable- Parameters:
listener- Listener to remove
-
copy
- Returns:
- a copy of this inline blob, it is initially closed.
-