package org.exist.storage; import java.io.EOFException; import java.io.IOException; import org.exist.storage.io.VariableByteInput; import org.exist.storage.io.VariableByteOutputStream; /** * Represents a (virtual) storage address in the paged file, consisting * of page number, tuple id and type indicator. * * The format of a storage address is as follows: * * <pre> * | page | type | tid | * | 1 2 3 4 | 5 6 | 7 8 | * </pre> */ public class StorageAddress { /** * Create virtual address from page number and offset (tid) * *@param page page number *@param tid offset *@return new virtual address in a long */ public final static long createPointer(int page, short tid) { return tid | (((long)page) & 0xFFFFFFFFL) << 32; } public final static long createPointer(int page, short tid, short flags) { return tid | (((long)flags) & 0xFFFFL) << 16 | (((long)page) & 0xFFFFFFFFL) << 32; } /** * Get the tid (tuple id) from a virtual address. * *@param pointer *@return the tid encoded in this address */ public final static short tidFromPointer(long pointer) { return (short) (pointer & 0xFFFFL); } /** * Get the page from a virtual address. * *@param pointer *@return the page encoded in this address */ public final static int pageFromPointer(long pointer) { return (int) ((pointer >>> 32) & 0xFFFFFFFFL); } /** * Get the type indicator from a virtual address. * * Returns a short corresponding to the type constants defined * in {@link org.exist.xquery.value.Type}. * * @param pointer * @return type indicator from a virtual address */ public final static short indexTypeFromPointer(long pointer) { return (short) ((pointer >>> 16) & 0xFFFFL); } public final static long setIndexType(long pointer, short type) { return pointer | ((long)(type << 16) & 0xFFFF0000L); } /** * Returns true if the page number and tid of the two storage * addresses is equal. The type indicator is ignored. * * @param p0 * @param p1 * @return true if the page number and tid of the two storage addresses is equal */ public final static boolean equals(long p0, long p1) { return ((p0 & 0xFFFFFFFF0000FFFFL) == (p1 & 0xFFFFFFFF0000FFFFL)); } public final static void write(long pointer, VariableByteOutputStream os) { os.writeInt(pageFromPointer(pointer)); os.writeShort(tidFromPointer(pointer)); os.writeShort(indexTypeFromPointer(pointer)); } public final static long read(VariableByteInput is) throws IOException, EOFException { return createPointer(is.readInt(), is.readShort(), is.readShort()); } public final static String toString(long pointer) { return pageFromPointer(pointer) + ":" + tidFromPointer(pointer); } }