package org.basex.io.random; import java.io.IOException; import org.basex.data.MetaData; import org.basex.io.IO; /** * This abstract class defines the methods for accessing the * database table representation. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public abstract class TableAccess { /** Meta data. */ final MetaData meta; /** Dirty index flag. */ boolean dirty; /** * Constructor. * @param md meta data */ TableAccess(final MetaData md) { meta = md; } /** * Flushes the table contents. * @throws IOException I/O exception */ public abstract void flush() throws IOException; /** * Closes the table access. * @throws IOException I/O exception */ public abstract void close() throws IOException; /** * Reads a byte value and returns it as an integer value. * @param p pre value * @param o offset * @return integer value */ public abstract int read1(int p, int o); /** * Reads a short value and returns it as an integer value. * @param p pre value * @param o offset * @return integer value */ public abstract int read2(int p, int o); /** * Reads an integer value. * @param p pre value * @param o offset * @return integer value */ public abstract int read4(int p, int o); /** * Reads a 5-byte value and returns it as a long value. * @param p pre value * @param o offset * @return integer value */ public abstract long read5(int p, int o); /** * Writes a byte value to the specified position. * @param p pre value * @param o offset * @param v value to be written */ public abstract void write1(int p, int o, int v); /** * Writes a short value to the specified position. * @param p pre value * @param o offset * @param v value to be written */ public abstract void write2(int p, int o, int v); /** * Writes an integer value to the specified position. * @param p pre value * @param o offset * @param v value to be written */ public abstract void write4(int p, int o, int v); /** * Writes a 5-byte value to the specified position. * @param p pre value * @param o offset * @param v value to be written */ public abstract void write5(int p, int o, long v); /** * Replaces entries in the database. * @param pre node to be replaced * @param entries new entries * @param sub size of the subtree that is replaced */ public final void replace(final int pre, final byte[] entries, final int sub) { dirty = true; final int nsize = entries.length >>> IO.NODEPOWER; final int diff = sub - nsize; final int last = diff <= 0 ? pre + nsize - Math.abs(diff) : pre + nsize; copy(entries, pre, last); final int off = last - pre << IO.NODEPOWER; // handle the remaining entries if the two subtrees are of different size if(diff < 0) { // case1: new subtree bigger than old one, insert remaining new nodes final byte[] tmp = new byte[entries.length - off]; System.arraycopy(entries, off, tmp, 0, tmp.length); insert(last, tmp); } else if(diff > 0) { // case2: old subtree bigger than new one, delete remaining old nodes delete(last, diff); } } /** * Copies the specified entries into the database. * @param pre pre value * @param entries array of bytes containing the entries to insert */ public final void set(final int pre, final byte[] entries) { dirty = true; copy(entries, pre, pre + (entries.length >>> IO.NODEPOWER)); } /** * Copies the specified values into the database. * @param entries entries to copy * @param pre first target pre value * @param last last pre value */ protected abstract void copy(final byte[] entries, final int pre, final int last); /** * Deletes the specified number of entries from the database. * @param pre pre value of the first node to delete * @param nr number of entries to be deleted */ public abstract void delete(int pre, int nr); /** * Inserts the specified entries into the database. * @param pre pre value * @param entries array of bytes containing the entries to insert */ public abstract void insert(int pre, byte[] entries); }