⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagemanager.java

📁 Java Crawler with domain knowledge path
💻 JAVA
字号:
/** * JDBM LICENSE v1.00 * * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright *    statements and notices.  Redistributions must also contain a *    copy of this document. * * 2. Redistributions in binary form must reproduce the *    above copyright notice, this list of conditions and the *    following disclaimer in the documentation and/or other *    materials provided with the distribution. * * 3. The name "JDBM" must not be used to endorse or promote *    products derived from this Software without prior written *    permission of Cees de Groot.  For written permission, *    please contact cg@cdegroot.com. * * 4. Products derived from this Software may not be called "JDBM" *    nor may "JDBM" appear in their names without prior written *    permission of Cees de Groot.  * * 5. Due credit should be given to the JDBM Project *    (http://jdbm.sourceforge.net/). * * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 2000 (C) Cees de Groot. All Rights Reserved. * Contributions are Copyright (C) 2000 by their associated contributors. * * $Id: PageManager.java,v 1.3 2005/06/25 23:12:32 doomdark Exp $ */package jdbm.recman;import java.io.*;/** *  This class manages the linked lists of pages that make up a file. */final class PageManager {    // our record file    private RecordFile file;    // header data    private FileHeader header;    private BlockIo headerBuf;        /**     *  Creates a new page manager using the indicated record file.     */    PageManager(RecordFile file) throws IOException {        this.file = file;                // check the file header. If the magic is 0, we assume a new        // file. Note that we hold on to the file header node.        headerBuf = file.get(0);        if (headerBuf.readShort(0) == 0)            header = new FileHeader(headerBuf, true);        else            header = new FileHeader(headerBuf, false);    }        /**     *  Allocates a page of the indicated type. Returns recid of the     *  page.     */    long allocate(short type) throws IOException {                if (type == Magic.FREE_PAGE)            throw new Error("allocate of free page?");                // do we have something on the free list?        long retval = header.getFirstOf(Magic.FREE_PAGE);        boolean isNew = false;        if (retval != 0) {            // yes. Point to it and make the next of that page the            // new first free page.            header.setFirstOf(Magic.FREE_PAGE, getNext(retval));        }        else {            // nope. make a new record            retval = header.getLastOf(Magic.FREE_PAGE);            if (retval == 0)                // very new file - allocate record #1                retval = 1;            header.setLastOf(Magic.FREE_PAGE, retval + 1);            isNew = true;        }                // Cool. We have a record, add it to the correct list        BlockIo buf = file.get(retval);        PageHeader pageHdr = isNew ? new PageHeader(buf, type)             : PageHeader.getView(buf);        long oldLast = header.getLastOf(type);                // Clean data.        System.arraycopy(RecordFile.cleanData, 0,                          buf.getData(), 0,                          RecordFile.BLOCK_SIZE);        pageHdr.setType(type);        pageHdr.setPrev(oldLast);        pageHdr.setNext(0);                        if (oldLast == 0)            // This was the first one of this type            header.setFirstOf(type, retval);        header.setLastOf(type, retval);        file.release(retval, true);                // If there's a previous, fix up its pointer        if (oldLast != 0) {            buf = file.get(oldLast);            pageHdr = PageHeader.getView(buf);            pageHdr.setNext(retval);            file.release(oldLast, true);        }                // remove the view, we have modified the type.        buf.setView(null);                return retval;    }        /**     *  Frees a page of the indicated type.     */    void free(short type, long recid) throws IOException {        if (type == Magic.FREE_PAGE)            throw new Error("free free page?");        if (recid == 0)            throw new Error("free header page?");                // get the page and read next and previous pointers        BlockIo buf = file.get(recid);        PageHeader pageHdr = PageHeader.getView(buf);        long prev = pageHdr.getPrev();        long next = pageHdr.getNext();                // put the page at the front of the free list.        pageHdr.setType(Magic.FREE_PAGE);        pageHdr.setNext(header.getFirstOf(Magic.FREE_PAGE));        pageHdr.setPrev(0);                header.setFirstOf(Magic.FREE_PAGE, recid);        file.release(recid, true);                // remove the page from its old list        if (prev != 0) {            buf = file.get(prev);            pageHdr = PageHeader.getView(buf);            pageHdr.setNext(next);            file.release(prev, true);        }        else {            header.setFirstOf(type, next);        }        if (next != 0) {            buf = file.get(next);            pageHdr = PageHeader.getView(buf);            pageHdr.setPrev(prev);            file.release(next, true);        }        else {            header.setLastOf(type, prev);        }            }            /**     *  Returns the page following the indicated block     */    long getNext(long block) throws IOException {        try {            return PageHeader.getView(file.get(block)).getNext();        } finally {            file.release(block, false);        }    }        /**     *  Returns the page before the indicated block     */    long getPrev(long block) throws IOException {        try {            return PageHeader.getView(file.get(block)).getPrev();        } finally {            file.release(block, false);        }    }        /**     *  Returns the first page on the indicated list.     */    long getFirst(short type) throws IOException {        return header.getFirstOf(type);    }    /**     *  Returns the last page on the indicated list.     */    long getLast(short type) throws IOException {        return header.getLastOf(type);    }            /**     *  Commit all pending (in-memory) data by flushing the page manager.     *  This forces a flush of all outstanding blocks (this it's an implicit     *  {@link RecordFile#commit} as well).     */    void commit() throws IOException {        // write the header out        file.release(headerBuf);        file.commit();        // and obtain it again        headerBuf = file.get(0);        header = new FileHeader(headerBuf, false);    }    /**     *  Flushes the page manager. This forces a flush of all outstanding     *  blocks (this it's an implicit {@link RecordFile#commit} as well).     */    void rollback() throws IOException {        // release header        file.discard(headerBuf);        file.rollback();        // and obtain it again        headerBuf = file.get(0);        if (headerBuf.readShort(0) == 0)            header = new FileHeader(headerBuf, true);        else            header = new FileHeader(headerBuf, false);    }        /**     *  Closes the page manager. This flushes the page manager and releases     *  the lock on the header.     */    void close() throws IOException {           file.release(headerBuf);        file.commit();        headerBuf = null;        header = null;        file = null;    }        /**     *  Returns the file header.     */    FileHeader getFileHeader() {        return header;    }    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -