package com.sleepycat.bind.tuple; import com.sleepycat.je.DatabaseEntry; import de.ovgu.cide.jakutil.*; /** * A base class for tuple bindings and tuple key creators that provides control * over the allocation of the output buffer. * <p> * Tuple bindings and key creators append data to a {@link TupleOutput}instance, which is also a {@link com.sleepycat.util.FastOutputStream}instance. This object has a byte array buffer that is resized when it is * full. The reallocation of this buffer can be a performance factor for some * applications using large objects. To manage this issue, the {@link #setTupleBufferSize} method may be used to control the initial size of the * buffer, and the {@link #getTupleOutput} method may be overridden by * subclasses to take over creation of the TupleOutput object. * </p> */ public class TupleBase { private int outputBufferSize; /** * Initializes the initial output buffer size to zero. * <p> * Unless {@link #setTupleBufferSize} is called, the default {@link com.sleepycat.util.FastOutputStream#DEFAULT_INIT_SIZE} size will be used. * </p> */ public TupleBase(){ outputBufferSize=0; } /** * Sets the initial byte size of the output buffer that is allocated by the * default implementation of {@link #getTupleOutput}. * <p> * If this property is zero (the default), the default {@link com.sleepycat.util.FastOutputStream#DEFAULT_INIT_SIZE} size is used. * </p> * @param byteSizethe initial byte size of the output buffer, or zero to use the * default size. */ public void setTupleBufferSize( int byteSize){ outputBufferSize=byteSize; } /** * Returns the initial byte size of the output buffer. * @return the initial byte size of the output buffer. * @see #setTupleBufferSize */ public int getTupleBufferSize(){ return outputBufferSize; } /** * Returns an empty TupleOutput instance that will be used by the tuple * binding or key creator. * <p> * The default implementation of this method creates a new TupleOutput with * an initial buffer size that can be changed using the {@link #setTupleBufferSize} method. * </p> * <p> * This method may be overridden to return a TupleOutput instance. For * example, an instance per thread could be created and returned by this * method. If a TupleOutput instance is reused, be sure to call its{@link com.sleepycat.util.FastOutputStream#reset} method before each use. * </p> * @param objectis the object to be written to the tuple output, and may be * used by subclasses to determine the size of the output buffer. * @return an empty TupleOutput instance. * @see #setTupleBufferSize */ protected TupleOutput getTupleOutput( Object object){ int byteSize=getTupleBufferSize(); if (byteSize != 0) { return new TupleOutput(new byte[byteSize]); } else { return new TupleOutput(); } } /** * Utility method to set the data in a entry buffer to the data in a tuple * output object. * @param outputis the source tuple output object. * @param entryis the destination entry buffer. */ public static void outputToEntry( TupleOutput output, DatabaseEntry entry){ entry.setData(output.getBufferBytes(),output.getBufferOffset(),output.getBufferLength()); } /** * Utility method to set the data in a entry buffer to the data in a tuple * input object. * @param inputis the source tuple input object. * @param entryis the destination entry buffer. */ public static void inputToEntry( TupleInput input, DatabaseEntry entry){ entry.setData(input.getBufferBytes(),input.getBufferOffset(),input.getBufferLength()); } /** * Utility method to create a new tuple input object for reading the data * from a given buffer. If an existing input is reused, it is reset before * returning it. * @param entryis the source entry buffer. * @return the new tuple input object. */ public static TupleInput entryToInput( DatabaseEntry entry){ return new TupleInput(entry.getData(),entry.getOffset(),entry.getSize()); } /** * Utility method for use by bindings to create a tuple output object. * @return a new tuple output object. * @deprecated replaced by {@link #getTupleOutput} */ public static TupleOutput newOutput(){ return new TupleOutput(); } /** * Utility method for use by bindings to create a tuple output object with a * specific starting size. * @return a new tuple output object. * @deprecated replaced by {@link #getTupleOutput} */ public static TupleOutput newOutput( byte[] buffer){ return new TupleOutput(buffer); } }