001: /**
002: * JDBM LICENSE v1.00
003: *
004: * Redistribution and use of this software and associated documentation
005: * ("Software"), with or without modification, are permitted provided
006: * that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain copyright
009: * statements and notices. Redistributions must also contain a
010: * copy of this document.
011: *
012: * 2. Redistributions in binary form must reproduce the
013: * above copyright notice, this list of conditions and the
014: * following disclaimer in the documentation and/or other
015: * materials provided with the distribution.
016: *
017: * 3. The name "JDBM" must not be used to endorse or promote
018: * products derived from this Software without prior written
019: * permission of Cees de Groot. For written permission,
020: * please contact cg@cdegroot.com.
021: *
022: * 4. Products derived from this Software may not be called "JDBM"
023: * nor may "JDBM" appear in their names without prior written
024: * permission of Cees de Groot.
025: *
026: * 5. Due credit should be given to the JDBM Project
027: * (http://jdbm.sourceforge.net/).
028: *
029: * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS
030: * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
031: * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
032: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
033: * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
034: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
035: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
036: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
037: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
038: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
039: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
040: * OF THE POSSIBILITY OF SUCH DAMAGE.
041: *
042: * Copyright 2000 (C) Cees de Groot. All Rights Reserved.
043: * Contributions are Copyright (C) 2000 by their associated contributors.
044: *
045: * $Id: PageHeader.java,v 1.2 2003/09/21 15:47:01 boisvert Exp $
046: */package jdbm.recman;
047:
048: /**
049: * This class represents a page header. It is the common superclass for
050: * all different page views.
051: */
052: public class PageHeader implements BlockView {
053: // offsets
054: private static final short O_MAGIC = 0; // short magic
055: private static final short O_NEXT = Magic.SZ_SHORT; // long next
056: private static final short O_PREV = O_NEXT + Magic.SZ_LONG; // long prev
057: protected static final short SIZE = O_PREV + Magic.SZ_LONG;
058:
059: // my block
060: protected BlockIo block;
061:
062: /**
063: * Constructs a PageHeader object from a block
064: *
065: * @param block The block that contains the file header
066: * @throws IOException if the block is too short to keep the file
067: * header.
068: */
069: protected PageHeader(BlockIo block) {
070: initialize(block);
071: if (!magicOk())
072: throw new Error("CRITICAL: page header magic for block "
073: + block.getBlockId() + " not OK " + getMagic());
074: }
075:
076: /**
077: * Constructs a new PageHeader of the indicated type. Used for newly
078: * created pages.
079: */
080: PageHeader(BlockIo block, short type) {
081: initialize(block);
082: setType(type);
083: }
084:
085: /**
086: * Factory method to create or return a page header for the
087: * indicated block.
088: */
089: static PageHeader getView(BlockIo block) {
090: BlockView view = block.getView();
091: if (view != null && view instanceof PageHeader)
092: return (PageHeader) view;
093: else
094: return new PageHeader(block);
095: }
096:
097: private void initialize(BlockIo block) {
098: this .block = block;
099: block.setView(this );
100: }
101:
102: /**
103: * Returns true if the magic corresponds with the fileHeader magic.
104: */
105: private boolean magicOk() {
106: int magic = getMagic();
107: return magic >= Magic.BLOCK
108: && magic <= (Magic.BLOCK + Magic.FREEPHYSIDS_PAGE);
109: }
110:
111: /**
112: * For paranoia mode
113: */
114: protected void paranoiaMagicOk() {
115: if (!magicOk())
116: throw new Error("CRITICAL: page header magic not OK "
117: + getMagic());
118: }
119:
120: /** Returns the magic code */
121: short getMagic() {
122: return block.readShort(O_MAGIC);
123: }
124:
125: /** Returns the next block. */
126: long getNext() {
127: paranoiaMagicOk();
128: return block.readLong(O_NEXT);
129: }
130:
131: /** Sets the next block. */
132: void setNext(long next) {
133: paranoiaMagicOk();
134: block.writeLong(O_NEXT, next);
135: }
136:
137: /** Returns the previous block. */
138: long getPrev() {
139: paranoiaMagicOk();
140: return block.readLong(O_PREV);
141: }
142:
143: /** Sets the previous block. */
144: void setPrev(long prev) {
145: paranoiaMagicOk();
146: block.writeLong(O_PREV, prev);
147: }
148:
149: /** Sets the type of the page header */
150: void setType(short type) {
151: block.writeShort(O_MAGIC, (short) (Magic.BLOCK + type));
152: }
153: }
|