Class TemporaryClob
- java.lang.Object
-
- org.apache.derby.impl.jdbc.TemporaryClob
-
- All Implemented Interfaces:
InternalClob
final class TemporaryClob extends java.lang.Object implements InternalClob
A Clob representation where the Clob is stored either in memory or on disk.Character positions given as input to methods in this class are always 1-based. Byte positions are always 0-based.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
TemporaryClob.CharToBytePositionCache
A simple class to hold the byte position for a character position.
-
Field Summary
Fields Modifier and Type Field Description private LOBStreamControl
bytes
Underlying structure holding this Clobs raw bytes.private long
cachedCharLength
Cached character length of the Clob.private ConnectionChild
conChild
Connection child assoicated with this Clob.private UTF8Reader
internalReader
Shared internal reader, closed when the Clob is released.private TemporaryClob.CharToBytePositionCache
posCache
Simple one-entry cache for character-byte position.private boolean
released
Tells whether this Clob has been released or not.private java.io.FilterReader
unclosableInternalReader
The internal reader wrapped so that it cannot be closed.
-
Constructor Summary
Constructors Constructor Description TemporaryClob(java.lang.String data, ConnectionChild conChild)
Constructs aTemporaryClob
object and initializes with a initial String.TemporaryClob(ConnectionChild conChild)
Constructs aTemporaryClob
object used to perform operations on a CLOB value.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
checkIfValid()
Makes sure the Clob has not been released.(package private) static InternalClob
cloneClobContent(java.lang.String dbName, ConnectionChild conChild, InternalClob clob)
Clones the content of another internal Clob.(package private) static InternalClob
cloneClobContent(java.lang.String dbName, ConnectionChild conChild, InternalClob clob, long length)
Clones the content of another internal Clob.private void
copyClobContent(InternalClob clob)
Copies the content of another Clob into this one.private void
copyClobContent(InternalClob clob, long charLength)
Copies the content of another Clob into this one.private byte[]
getByteFromString(java.lang.String str)
Converts a string into the modified UTF-8 byte encoding.long
getByteLength()
Returns the size of the Clob in bytes.private long
getBytePosition(long charPos)
Finds the corresponding byte position for the given UTF-8 character position, starting from the byte positionstartPos
.long
getCharLength()
Returns number of characters in the Clob.long
getCharLengthIfKnown()
Returns the cached character count for the Clob, if any.private CharacterStreamDescriptor
getCSD()
Returns a character stream descriptor for the stream.java.io.Reader
getInternalReader(long characterPosition)
Returns an internal reader for the Clob content, initialized at the specified character position.java.io.InputStream
getRawByteStream()
Returns a stream serving the raw bytes of this Clob.java.io.Reader
getReader(long pos)
Constructs and returns aReader
.long
getUpdateCount()
Returns the update count of this Clob.java.io.Writer
getWriter(long pos)
Constructs and returns aWriter
for the CLOB value.long
insertString(java.lang.String str, long insertionPoint)
Inserts a string at the given position.boolean
isReleased()
Tells if this Clob has been released.boolean
isWritable()
Tells if this Clob is intended to be writable.void
release()
Releases this Clob by freeing assoicated resources.void
truncate(long newCharLength)
Truncate the Clob to the specifiec size.private void
updateInternalState(long charChangePosition)
Updates the internal state after a modification has been performed on the Clob content.
-
-
-
Field Detail
-
conChild
private ConnectionChild conChild
Connection child assoicated with this Clob.Currently only used for synchronization in *some* streams associated with the Clob. This suggests something is off wrt. synchronization.
-
bytes
private final LOBStreamControl bytes
Underlying structure holding this Clobs raw bytes.
-
released
private boolean released
Tells whether this Clob has been released or not.
-
cachedCharLength
private long cachedCharLength
Cached character length of the Clob.A value of
0
is interpreted as unknown length, even though it is a valid value. If the length is requested and the value is zero, an attempt to obtain the length is made by draining the source.
-
internalReader
private UTF8Reader internalReader
Shared internal reader, closed when the Clob is released. This is a performance optimization, and the stream is shared between "one time" operations, for instancegetSubString
calls. Often a subset, or the whole, of the Clob is read subsequently and then this optimization avoids repositioning costs (the store does not support random access for LOBs). NOTE: Do not publish this reader to the end-user.
-
unclosableInternalReader
private java.io.FilterReader unclosableInternalReader
The internal reader wrapped so that it cannot be closed.
-
posCache
private final TemporaryClob.CharToBytePositionCache posCache
Simple one-entry cache for character-byte position.
-
-
Constructor Detail
-
TemporaryClob
TemporaryClob(ConnectionChild conChild)
Constructs aTemporaryClob
object used to perform operations on a CLOB value.- Parameters:
conChild
- connection object used to obtain synchronization object- Throws:
java.lang.NullPointerException
- ifconChild
isnull
-
TemporaryClob
TemporaryClob(java.lang.String data, ConnectionChild conChild) throws java.io.IOException, StandardException
Constructs aTemporaryClob
object and initializes with a initial String.- Parameters:
data
- initial value in StringconChild
- connection object used to obtain synchronization object- Throws:
java.io.IOException
StandardException
-
-
Method Detail
-
cloneClobContent
static InternalClob cloneClobContent(java.lang.String dbName, ConnectionChild conChild, InternalClob clob) throws java.io.IOException, java.sql.SQLException
Clones the content of another internal Clob.- Parameters:
dbName
- name of the assoicated databaseconChild
- assoiated connection childclob
- the Clob whose content to clone- Returns:
- A read-write Clob.
- Throws:
java.io.IOException
- if accessing the I/O resources fail (read or write)java.sql.SQLException
- if accessing underlying resources fail
-
cloneClobContent
static InternalClob cloneClobContent(java.lang.String dbName, ConnectionChild conChild, InternalClob clob, long length) throws java.io.IOException, java.sql.SQLException
Clones the content of another internal Clob.- Parameters:
dbName
- name of the assoicated databaseconChild
- assoiated connection childclob
- the Clob whose content to clonelength
- number of chars in new InternalClob- Returns:
- A read-write Clob.
- Throws:
java.io.IOException
- if accessing the I/O resources fail (read or write)java.sql.SQLException
- if accessing underlying resources fail
-
release
public void release() throws java.io.IOException
Releases this Clob by freeing assoicated resources.- Specified by:
release
in interfaceInternalClob
- Throws:
java.io.IOException
- if accessing underlying I/O resources fail
-
getRawByteStream
public java.io.InputStream getRawByteStream() throws java.io.IOException
Returns a stream serving the raw bytes of this Clob.The stream is managed by the underlying byte store, and can serve bytes both from memory and from a file on disk.
- Specified by:
getRawByteStream
in interfaceInternalClob
- Returns:
- A stream serving the raw bytes of the stream, initialized at
byte position
0
. - Throws:
java.io.IOException
- if obtaining the stream fails
-
getBytePosition
private long getBytePosition(long charPos) throws java.io.IOException
Finds the corresponding byte position for the given UTF-8 character position, starting from the byte positionstartPos
. See comments in SQLChar.readExternal for more notes on processing the UTF8 format.- Parameters:
charPos
- character position- Returns:
- Stream position in bytes for the given character position.
- Throws:
java.io.EOFException
- if the character position specified is greater than the Clob length +1java.io.IOException
- if accessing underlying I/O resources fail
-
getUpdateCount
public long getUpdateCount()
Returns the update count of this Clob.- Specified by:
getUpdateCount
in interfaceInternalClob
- Returns:
- Update count.
-
getWriter
public java.io.Writer getWriter(long pos) throws java.io.IOException, java.sql.SQLException
Constructs and returns aWriter
for the CLOB value.- Specified by:
getWriter
in interfaceInternalClob
- Parameters:
pos
- the initial position in bytes for theWriter
- Returns:
- A
Writer
to write to the CLOB value. - Throws:
java.io.IOException
java.sql.SQLException
- if the specified position is invalid
-
getReader
public java.io.Reader getReader(long pos) throws java.io.IOException, java.sql.SQLException
Constructs and returns aReader
.- Specified by:
getReader
in interfaceInternalClob
- Parameters:
pos
- initial position of the returnedReader
in number of characters. Expected to be non-negative. The first character is at position0
.- Returns:
- A
Reader
with the underlyingCLOB
value as source. - Throws:
java.io.IOException
java.sql.SQLException
- if the specified position is too big
-
getInternalReader
public java.io.Reader getInternalReader(long characterPosition) throws java.io.IOException, java.sql.SQLException
Description copied from interface:InternalClob
Returns an internal reader for the Clob content, initialized at the specified character position.This method can return a shared reader object, avoiding instantiation and repositioning costs for internal operations where the stream itself is not published to the end-user. One such example is
Clob.getSubString
.- Specified by:
getInternalReader
in interfaceInternalClob
- Parameters:
characterPosition
- character position. The first character is at position1
.- Returns:
- A
Reader
serving the content of the Clob. - Throws:
java.io.IOException
- if accessing underlying I/O resources failjava.sql.SQLException
- if accessing underlying resources fail- See Also:
getReader(long)
-
getCharLength
public long getCharLength() throws java.io.IOException
Returns number of characters in the Clob.- Specified by:
getCharLength
in interfaceInternalClob
- Returns:
- The length of the Clob in number of characters.
- Throws:
java.io.IOException
- if accessing the underlying I/O resources fail
-
getCharLengthIfKnown
public long getCharLengthIfKnown()
Returns the cached character count for the Clob, if any.- Specified by:
getCharLengthIfKnown
in interfaceInternalClob
- Returns:
- The number of characters in the Clob, or
-1
if unknown.
-
getByteLength
public long getByteLength() throws java.io.IOException
Returns the size of the Clob in bytes.- Returns:
- Number of bytes in the
CLOB
value. - Throws:
java.io.IOException
- if accessing the underlying I/O resources fail
-
insertString
public long insertString(java.lang.String str, long insertionPoint) throws java.io.IOException, java.sql.SQLException
Inserts a string at the given position.- Specified by:
insertString
in interfaceInternalClob
- Parameters:
str
- the string to insertinsertionPoint
- the character position to insert the string at- Returns:
- Number of characters inserted.
- Throws:
java.io.EOFException
- if the position is larger than the Clob length +1java.io.IOException
- if accessing the underlying I/O resources failjava.sql.SQLException
- if accessing the underlying resources fail
-
isReleased
public boolean isReleased()
Tells if this Clob has been released.- Specified by:
isReleased
in interfaceInternalClob
- Returns:
true
if released,false
if not.
-
isWritable
public boolean isWritable()
Tells if this Clob is intended to be writable.- Specified by:
isWritable
in interfaceInternalClob
- Returns:
true
-
truncate
public void truncate(long newCharLength) throws java.io.IOException, java.sql.SQLException
Truncate the Clob to the specifiec size.- Specified by:
truncate
in interfaceInternalClob
- Parameters:
newCharLength
- the new length, in characters, of the Clob- Throws:
java.io.IOException
- if accessing the underlying I/O resources failsjava.sql.SQLException
- if accessing underlying resources fail
-
getByteFromString
private byte[] getByteFromString(java.lang.String str)
Converts a string into the modified UTF-8 byte encoding.- Parameters:
str
- string to represent with modified UTF-8 encoding- Returns:
- Byte array representing the string in modified UTF-8 encoding.
-
copyClobContent
private void copyClobContent(InternalClob clob) throws java.io.IOException, java.sql.SQLException
Copies the content of another Clob into this one.- Parameters:
clob
- the Clob to copy from- Throws:
java.io.IOException
- if accessing I/O resources fail (both read and write)java.sql.SQLException
- if accessing underlying resources fail
-
copyClobContent
private void copyClobContent(InternalClob clob, long charLength) throws java.io.IOException, java.sql.SQLException
Copies the content of another Clob into this one.- Parameters:
clob
- the Clob to copy fromcharLength
- number of chars to copy- Throws:
java.io.EOFException
- if the length of the stream is shorter than the specified lengthjava.io.IOException
- if accessing I/O resources fail (both read and write)java.sql.SQLException
- if accessing underlying resources fail
-
checkIfValid
private final void checkIfValid()
Makes sure the Clob has not been released.All operations are invalid on a released Clob.
- Throws:
java.lang.IllegalStateException
- if the Clob has been released
-
updateInternalState
private final void updateInternalState(long charChangePosition)
Updates the internal state after a modification has been performed on the Clob content.Currently the state update consists of dicarding the internal reader to stop it from delivering stale data, to reset the byte/char position cache if necessary, and to reset the cached length.
- Parameters:
charChangePosition
- the position where the Clob change started
-
getCSD
private final CharacterStreamDescriptor getCSD() throws java.io.IOException
Returns a character stream descriptor for the stream.All streams from the underlying source (
LOBStreamControl
) are position aware and can be moved to a specific byte position cheaply. The maximum length is not really needed, nor known, at the moment, so the maximum allowed Clob length in Derby is used.- Returns:
- A character stream descriptor.
- Throws:
java.io.IOException
- if obtaining the length of the stream fails
-
-