Class LOBStreamControl

java.lang.Object
org.apache.derby.impl.jdbc.LOBStreamControl

final class LOBStreamControl extends Object
This class acts as a layer of blob/clob repository (in memory or file). The max bytes of data stored in memory depends on the way this class is created. If the class is created with initial data, the buffer size is set to the size of the byte array supplied, but no larger than MAX_BUF_SIZE. If no initial data is supplied, or if the initial data size is less than DEFAULT_BUF_SIZE, the buffer size is set to DEFAULT_BUF_SIZE. When write increases the data beyond this value a temporary file is created and data is moved into that. If truncate reduces the size of the file below initial buffer size, the data is moved into memory. This class also creates InputStream and OutputStream which can be used to access blob data irrespective of if its in memory or in file.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final int
     
    private final EmbedConnection
     
    private byte[]
     
    private static final int
     
    private boolean
     
    private static final int
     
    private LOBFile
     
    private long
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    Creates an empty LOBStreamControl.
    LOBStreamControl(EmbedConnection conn, byte[] data)
    Creates a LOBStreamControl and initializes with a bytes array.
  • Method Summary

    Modifier and Type
    Method
    Description
    (package private) void
    copyData(InputStream inStream, long length)
    Copies bytes from stream to local storage.
    (package private) long
    copyUtf8Data(InputStream utf8Stream, long charLength)
    Copies UTF-8 encoded chars from a stream to local storage.
    private void
     
    protected void
     
    private static Object
    findService(String factoryInterface, String serviceName)
    Privileged service lookup.
    private static Object
    findServiceModule(Object serviceModule, String factoryInterface)
    Privileged startup.
    (package private) void
    Invalidates all the variables and closes file handle if open.
    (package private) InputStream
    getInputStream(long pos)
    returns input stream linked with this object.
    (package private) long
    Returns length of data.
    (package private) OutputStream
    getOutputStream(long pos)
    returns output stream linked with this object
    (package private) long
    Returns the running sequence number to check if the lob is updated since last access.
    private void
    init(byte[] b, long len)
     
    private void
    isValidOffset(int off, int length)
     
    private void
    isValidPostion(long pos)
     
    (package private) int
    read(byte[] buff, int off, int len, long pos)
    Reads bytes starting from 'position' into bytes array.
    (package private) int
    read(long pos)
    Reads one byte.
    private int
    readBytes(byte[] b, int off, int len, long pos)
     
    private void
    Close and release all resources held by a temporary file.
    (package private) long
    replaceBytes(byte[] buf, long stPos, long endPos)
    Replaces a block of bytes in the middle of the LOB with a another block of bytes, which may be of a different size.
    (package private) void
    truncate(long size)
    Resets the size.
    private long
    updateData(byte[] bytes, int offset, int len, long pos)
     
    (package private) long
    write(byte[] b, int off, int len, long pos)
    Writes len bytes from the specified byte array to the LOB.
    (package private) long
    write(int b, long pos)
    Writes one byte.

    Methods inherited from class java.lang.Object

    clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • tmpFile

      private LOBFile tmpFile
    • dataBytes

      private byte[] dataBytes
    • isBytes

      private boolean isBytes
    • bufferSize

      private final int bufferSize
    • conn

      private final EmbedConnection conn
    • updateCount

      private long updateCount
    • DEFAULT_BUF_SIZE

      private static final int DEFAULT_BUF_SIZE
      See Also:
    • MAX_BUF_SIZE

      private static final int MAX_BUF_SIZE
      See Also:
  • Constructor Details

  • Method Details

    • init

      private void init(byte[] b, long len) throws IOException, StandardException
      Throws:
      IOException
      StandardException
    • updateData

      private long updateData(byte[] bytes, int offset, int len, long pos) throws StandardException
      Throws:
      StandardException
    • isValidPostion

      private void isValidPostion(long pos) throws IOException, StandardException
      Throws:
      IOException
      StandardException
    • isValidOffset

      private void isValidOffset(int off, int length) throws StandardException
      Throws:
      StandardException
    • write

      long write(int b, long pos) throws IOException, StandardException
      Writes one byte.
      Parameters:
      b - byte
      pos -
      Returns:
      new position
      Throws:
      IOException - if writing to the LOB file fails
      StandardException - if encrypting/decrypting the LOB file fails
    • write

      long write(byte[] b, int off, int len, long pos) throws IOException, StandardException
      Writes len bytes from the specified byte array to the LOB.
      Parameters:
      b - byte array
      off - offset from where to read from the byte array
      len - number of bytes to be written
      pos - starting position
      Returns:
      The position after the bytes have been written to the LOB.
      Throws:
      IOException - if writing to the LOB fails
      StandardException - if writing to the LOB fails
      IndexOutOfBoundsException - if len is larger than b.length - off
    • read

      int read(long pos) throws IOException, StandardException
      Reads one byte.
      Parameters:
      pos - position from where to read
      Returns:
      byte
      Throws:
      IOException - if reading the LOB file fails
      StandardException - if decrypting an encrypted LOB file fails
    • readBytes

      private int readBytes(byte[] b, int off, int len, long pos)
    • read

      int read(byte[] buff, int off, int len, long pos) throws IOException, StandardException
      Reads bytes starting from 'position' into bytes array. starting from 'offset'
      Parameters:
      buff - array into the bytes will be copied
      off - offset from where the array has to be populated
      len - number of bytes to read
      pos - initial position before reading
      Returns:
      number new position
      Throws:
      IOException - if reading the LOB file fails
      StandardException - if decrypting an encrypted LOB file fails
    • getInputStream

      InputStream getInputStream(long pos)
      returns input stream linked with this object.
      Parameters:
      pos - initial postion
      Returns:
      InputStream
    • getOutputStream

      OutputStream getOutputStream(long pos)
      returns output stream linked with this object
      Parameters:
      pos - initial postion
      Returns:
      OutputStream
    • getLength

      long getLength() throws IOException
      Returns length of data.
      Returns:
      length
      Throws:
      IOException
    • truncate

      void truncate(long size) throws IOException, StandardException
      Resets the size.
      Parameters:
      size - new size should be smaller than existing size
      Throws:
      IOException
      StandardException
    • copyData

      void copyData(InputStream inStream, long length) throws IOException, StandardException
      Copies bytes from stream to local storage.

      Note that specifying the length as Long.MAX_VALUE results in reading data from the stream until EOF is reached, but no length checking will be performed.

      Parameters:
      inStream - the stream to copy from
      length - number of bytes to be copied, or Long.MAX_VALUE to copy everything until EOF is reached
      Throws:
      IOException - if reading or writing a LOB file fails
      StandardException - if encrypting or decrypting a LOB file fails
    • copyUtf8Data

      long copyUtf8Data(InputStream utf8Stream, long charLength) throws IOException, StandardException
      Copies UTF-8 encoded chars from a stream to local storage.

      Note that specifying the length as Long.MAX_VALUE results in reading data from the stream until EOF is reached, but no length checking will be performed.

      Parameters:
      utf8Stream - the stream to copy from
      charLength - number of chars to be copied, or Long.MAX_VALUE to copy everything until EOF is reached
      Returns:
      The number of characters copied.
      Throws:
      EOFException - if EOF is reached prematurely
      IOException - thrown on a number of error conditions
      StandardException - if reading, writing or truncating the LOBStreamControl-object fails
      UTFDataFormatException - if an invalid UTF-8 encoding is detected
    • finalize

      protected void finalize() throws Throwable
      Overrides:
      finalize in class Object
      Throws:
      Throwable
    • deleteFile

      private void deleteFile(StorageFile file)
    • free

      void free() throws IOException
      Invalidates all the variables and closes file handle if open.
      Throws:
      IOException - if closing the file fails
    • releaseTempFile

      private void releaseTempFile(LOBFile file) throws IOException
      Close and release all resources held by a temporary file. The file will also be deleted from the file system and removed from the list of LOBFiles in EmbedConnection.
      Parameters:
      file - the temporary file
      Throws:
      IOException - if the file cannot be closed or deleted
    • replaceBytes

      long replaceBytes(byte[] buf, long stPos, long endPos) throws IOException, StandardException
      Replaces a block of bytes in the middle of the LOB with a another block of bytes, which may be of a different size.

      The new byte array may not be be of same length as the original, thus it may result in resizing the total lob.

      Parameters:
      buf - byte array which will be written inplace of old block
      stPos - inclusive starting position of current block
      endPos - exclusive end position of current block
      Returns:
      Current position after write.
      Throws:
      IOException - if writing to the temporary file fails
      StandardException
    • getUpdateCount

      long getUpdateCount()
      Returns the running sequence number to check if the lob is updated since last access.
      Returns:
      The current update sequence number.
    • findServiceModule

      private static Object findServiceModule(Object serviceModule, String factoryInterface) throws StandardException
      Privileged startup. Must be private so that user code can't call this entry point.
      Throws:
      StandardException
    • findService

      private static Object findService(String factoryInterface, String serviceName)
      Privileged service lookup. Must be private so that user code can't call this entry point.