Class InlineBlob
- java.lang.Object
- 
- org.firebirdsql.gds.ng.wire.InlineBlob
 
- 
- All Implemented Interfaces:
- java.lang.AutoCloseable,- FbBlob,- ExceptionListenable
 
 public final class InlineBlob extends java.lang.Object implements FbBlob Implementation ofFbBlobto 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:
- 5.0.8
- Author:
- Mark Rotteveel
 
- 
- 
Nested Class Summary- 
Nested classes/interfaces inherited from interface org.firebirdsql.gds.ng.FbBlobFbBlob.SeekMode
 
- 
 - 
Field Summary- 
Fields inherited from interface org.firebirdsql.gds.ng.FbBlobNO_BLOB_ID
 
- 
 - 
Constructor SummaryConstructors Constructor Description InlineBlob(FbDatabase database, long blobId, int transactionHandle, byte[] info, byte[] data)Creates an inline blob.
 - 
Method SummaryAll Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddExceptionListener(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.InlineBlobcopy()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.longgetBlobId()Returns the blob id.byte[]getBlobInfo(byte[] requestItems, int bufferLength)Request blob info.<T> TgetBlobInfo(byte[] requestItems, int bufferLength, InfoProcessor<T> infoProcessor)Request blob info.FbDatabasegetDatabase()intgetHandle()Returns the blob handle identifier.intgetMaximumSegmentSize()The maximum segment size allowed by the protocol forFbBlob.getSegment(int)andFbBlob.putSegment(byte[]).byte[]getSegment(int sizeRequested)Gets a segment of blob data.intgetTransactionHandle()booleanisEof()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 Detail- 
InlineBlobpublic InlineBlob(FbDatabase database, long blobId, int transactionHandle, byte[] info, byte[] data) Creates an inline blob.- Parameters:
- database- database that created this blob
- blobId- blob id
- transactionHandle- handle of the transaction for which this blob is valid
- info- blob info (cannot be- null), if empty an array containing- isc_info_endwill be used
- data- actual blob data without segments (cannot be- null)
 
 
- 
 - 
Method Detail- 
getBlobIdpublic 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).
 - 
getTransactionHandlepublic int getTransactionHandle() - Returns:
- the transaction handle this inline blob is valid for
 
 - 
getHandlepublic 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. 
 - 
getDatabasepublic FbDatabase getDatabase() - Specified by:
- getDatabasein interface- FbBlob
- Returns:
- The database connection that created this blob
 
 - 
openpublic void open() throws java.sql.SQLExceptionDescription copied from interface:FbBlobOpens an existing input blob, or creates an output blob.
 - 
isOpenpublic boolean isOpen() 
 - 
isEofpublic boolean isEof() 
 - 
closepublic void close() Description copied from interface:FbBlobCloses the blob.Closing an already closed blob is a no-op. 
 - 
cancelpublic 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.
 - 
isOutputpublic boolean isOutput() 
 - 
getSegmentpublic byte[] getSegment(int sizeRequested) throws java.sql.SQLExceptionDescription copied from interface:FbBlobGets a segment of blob data.When sizeRequestedexceedsFbBlob.getMaximumSegmentSize()it is silently reduced to the maximum segment size.- Specified by:
- getSegmentin interface- FbBlob
- Parameters:
- sizeRequested- Requested segment size (> 0).
- Returns:
- Retrieved segment (size may be less than requested)
- Throws:
- java.sql.SQLException- If this is an output blob, the blob is closed, the transaction is not active, or a database connection error occurred.
- See Also:
- FbBlob.get(byte[], int, int)
 
 - 
getpublic int get(byte[] b, int off, int len) throws java.sql.SQLExceptionDescription 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 interface- FbBlob
- Parameters:
- b- target byte array
- off- offset to start
- len- number of bytes
- Returns:
- actual number of bytes read; this will only be less than lenwhen end-of-blob was reached
- Throws:
- java.sql.SQLException- for database access errors, if- off < 0,- len < 0, or if- off + len > b.length
 
 - 
getpublic int get(byte[] b, int off, int len, float minFillFactor) throws java.sql.SQLExceptionDescription 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 interface- FbBlob
- Parameters:
- b- target byte array
- off- offset to start
- len- number of bytes
- minFillFactor- 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:
- java.sql.SQLException- for database access errors, if- off < 0,- len < 0, or if- off + len > b.length,- minFillFactor <= 0, or- minFillFactor > 1or- minFillFactor is NaN
 
 - 
putSegmentpublic void putSegment(byte[] segment) throws java.sql.SQLExceptionDescription 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 interface- FbBlob
- Parameters:
- segment- segment to write
- Throws:
- java.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 occurred
- See Also:
- FbBlob.put(byte[], int, int)
 
 - 
putpublic void put(byte[] b, int off, int len) throws java.sql.SQLExceptionDescription 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().
 - 
seekpublic void seek(int offset, FbBlob.SeekMode seekMode) throws java.sql.SQLExceptionDescription copied from interface:FbBlobPerforms a seek on a blob with the specifiedseekModeandoffset.Firebird only supports seek on stream blobs. - Specified by:
- seekin interface- FbBlob
- Parameters:
- offset- Offset of the seek, effect depends on value of- seekMode
- seekMode- Value of- FbBlob.SeekMode
- Throws:
- java.sql.SQLException- If the blob is closed, the transaction is not active, or a database error occurred.
 
 - 
getMaximumSegmentSizepublic 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 interface- FbBlob
- Returns:
- The maximum segment size allowed for get or put.
 
 - 
getBlobInfopublic <T> T getBlobInfo(byte[] requestItems, int bufferLength, InfoProcessor<T> infoProcessor) throws java.sql.SQLExceptionDescription copied from interface:FbBlobRequest blob info.- Specified by:
- getBlobInfoin interface- FbBlob
- Parameters:
- requestItems- Array of info items to request
- bufferLength- Response buffer length to use
- infoProcessor- Implementation of- InfoProcessorto transform the info response
- Returns:
- Transformed info response of type T
- Throws:
- java.sql.SQLException- For errors retrieving or transforming the response.
 
 - 
lengthpublic long length() Description copied from interface:FbBlobRequests the blob length from the server.
 - 
getBlobInfopublic byte[] getBlobInfo(byte[] requestItems, int bufferLength) throws java.sql.SQLExceptionRequest blob info.Unknown blob info items are ignored, and only known items are returned. - Specified by:
- getBlobInfoin interface- FbBlob
- Parameters:
- requestItems- Array of info items to request
- bufferLength- Response buffer length to use
- Returns:
- Response buffer
- Throws:
- java.sql.SQLException
 
 - 
addExceptionListenerpublic void addExceptionListener(ExceptionListener listener) Description copied from interface:ExceptionListenableAdds an exception listener to this object.Implementations use WeakReference.- Specified by:
- addExceptionListenerin interface- ExceptionListenable
- Parameters:
- listener- Listener to register
 
 - 
removeExceptionListenerpublic void removeExceptionListener(ExceptionListener listener) Description copied from interface:ExceptionListenableRemoves an exception listener to this object.- Specified by:
- removeExceptionListenerin interface- ExceptionListenable
- Parameters:
- listener- Listener to remove
 
 - 
copypublic InlineBlob copy() - Returns:
- a copy of this inline blob, it is initially closed.
 
 
- 
 
-