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

📄 datacursor.java

📁 berkeleyDB,强大的嵌入式数据,多个数据库的内核
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2000-2004 *      Sleepycat Software.  All rights reserved. * * $Id: DataCursor.java,v 1.5 2004/11/05 01:08:31 mjc Exp $ */package com.sleepycat.collections;import com.sleepycat.compat.DbCompat;import com.sleepycat.db.Cursor;import com.sleepycat.db.DatabaseEntry;import com.sleepycat.db.DatabaseException;import com.sleepycat.db.JoinConfig;import com.sleepycat.db.JoinCursor;import com.sleepycat.db.LockMode;import com.sleepycat.db.OperationStatus;/** * Represents a Berkeley DB cursor and adds support for indices, bindings and * key ranges. * * <p>This class operates on a view and takes care of reading and updating * indices, calling bindings, constraining access to a key range, etc.</p> * * @author Mark Hayes */final class DataCursor implements Cloneable {    private RangeCursor cursor;    private JoinCursor joinCursor;    private DataView view;    private KeyRange range;    private boolean writeAllowed;    private boolean dirtyRead;    private DatabaseEntry keyThang;    private DatabaseEntry valueThang;    private DatabaseEntry primaryKeyThang;    private DatabaseEntry otherThang;    private DataCursor[] indexCursorsToClose;    /**     * Creates a cursor for a given view.     */    DataCursor(DataView view, boolean writeAllowed)        throws DatabaseException {        init(view, writeAllowed, null);    }    /**     * Creates a cursor for a given view and single key range.     */    DataCursor(DataView view, boolean writeAllowed, Object singleKey)        throws DatabaseException {        init(view, writeAllowed, view.subRange(singleKey));    }    /**     * Creates a cursor for a given view and key range.     */    DataCursor(DataView view, boolean writeAllowed,               Object beginKey, boolean beginInclusive,               Object endKey, boolean endInclusive)        throws DatabaseException {        init(view, writeAllowed,             view.subRange(beginKey, beginInclusive, endKey, endInclusive));    }    /**     * Creates a join cursor.     */    DataCursor(DataView view, DataCursor[] indexCursors,               JoinConfig joinConfig, boolean closeIndexCursors)        throws DatabaseException {        if (view.isSecondary()) {            throw new IllegalArgumentException(                "The primary collection in a join must not be a secondary " +                "database");        }        Cursor[] cursors = new Cursor[indexCursors.length];        for (int i = 0; i < cursors.length; i += 1) {            cursors[i] = indexCursors[i].cursor.getCursor();        }        joinCursor = view.db.join(cursors, joinConfig);        init(view, false, null);        if (closeIndexCursors) {            indexCursorsToClose = indexCursors;        }    }    /**     * Clones a cursor preserving the current position.     */    DataCursor cloneCursor()        throws DatabaseException {        checkNoJoinCursor();        DataCursor o;        try {            o = (DataCursor) super.clone();        } catch (CloneNotSupportedException neverHappens) {            return null;        }        o.initThangs();        KeyRange.copy(keyThang, o.keyThang);        KeyRange.copy(valueThang, o.valueThang);        if (primaryKeyThang != keyThang) {            KeyRange.copy(primaryKeyThang, o.primaryKeyThang);        }        o.cursor = cursor.dup(true);        return o;    }    /**     * Returns the internal range cursor.     */    RangeCursor getCursor() {        return cursor;    }    /**     * Constructor helper.     */    private void init(DataView view, boolean writeAllowed, KeyRange range)        throws DatabaseException {        this.view = view;        this.writeAllowed = writeAllowed && view.writeAllowed;        this.range = (range != null) ? range : view.range;        dirtyRead = view.dirtyReadEnabled;        initThangs();        if (joinCursor == null) {            cursor = new RangeCursor(view, this.range, this.writeAllowed);        }    }    /**     * Constructor helper.     */    private void initThangs()        throws DatabaseException {        keyThang = new DatabaseEntry();        primaryKeyThang = view.isSecondary() ? (new DatabaseEntry())                                             : keyThang;        valueThang = new DatabaseEntry();    }    /**     * Closes the associated cursor.     */    void close()        throws DatabaseException {        if (joinCursor != null) {            JoinCursor toClose = joinCursor;            joinCursor = null;            toClose.close();        }        if (cursor != null) {            Cursor toClose = cursor.getCursor();            cursor = null;            view.currentTxn.closeCursor(toClose );        }        if (indexCursorsToClose != null) {            DataCursor[] toClose = indexCursorsToClose;            indexCursorsToClose = null;            for (int i = 0; i < toClose.length; i += 1) {                toClose[i].close();            }        }    }    /**     * Returns the view for this cursor.     */    DataView getView() {        return view;    }    /**     * Returns the range for this cursor.     */    KeyRange getRange() {        return range;    }    /**     * Returns whether write is allowed for this cursor, as specified to the     * constructor.     */    boolean isWriteAllowed() {        return writeAllowed;    }    /**     * Returns the key object for the last record read.     */    Object getCurrentKey()        throws DatabaseException {        if (view.keyBinding == null) {            throw new UnsupportedOperationException();        }        return view.makeKey(keyThang);    }    /**     * Returns the value object for the last record read.     */    Object getCurrentValue()        throws DatabaseException {        return view.makeValue(primaryKeyThang, valueThang);    }    /**     * Returns whether record number access is allowed.     */    boolean hasRecNumAccess() {        return view.recNumAccess;    }    /**     * Returns the record number for the last record read.     */    int getCurrentRecordNumber()        throws DatabaseException {        if (view.btreeRecNumDb) {            /* BTREE-RECNO access. */            if (otherThang == null) {                otherThang = new DatabaseEntry();            }            DbCompat.getCurrentRecordNumber(cursor.getCursor(), otherThang,                                            getLockMode(false));            return DbCompat.getRecordNumber(otherThang);        } else {            /* QUEUE or RECNO database. */            return DbCompat.getRecordNumber(keyThang);        }    }    /**     * Binding version of Cursor.getCurrent(), no join cursor allowed.     */    OperationStatus getCurrent(boolean lockForWrite)        throws DatabaseException {        checkNoJoinCursor();        return cursor.getCurrent(keyThang, primaryKeyThang, valueThang,                                 getLockMode(lockForWrite));    }    /**     * Binding version of Cursor.getFirst(), join cursor is allowed.     */    OperationStatus getFirst(boolean lockForWrite)        throws DatabaseException {        LockMode lockMode = getLockMode(lockForWrite);        if (joinCursor != null) {            return joinCursor.getNext(keyThang, valueThang, lockMode);        } else {            return cursor.getFirst(keyThang, primaryKeyThang, valueThang,                                   lockMode);        }    }    /**     * Binding version of Cursor.getNext(), join cursor is allowed.     */    OperationStatus getNext(boolean lockForWrite)        throws DatabaseException {        LockMode lockMode = getLockMode(lockForWrite);        if (joinCursor != null) {            return joinCursor.getNext(keyThang, valueThang, lockMode);        } else {            return cursor.getNext(keyThang, primaryKeyThang, valueThang,                                  lockMode);        }    }    /**     * Binding version of Cursor.getNext(), join cursor is allowed.     */    OperationStatus getNextNoDup(boolean lockForWrite)        throws DatabaseException {        LockMode lockMode = getLockMode(lockForWrite);        if (joinCursor != null) {            return joinCursor.getNext(keyThang, valueThang, lockMode);        } else {            return cursor.getNextNoDup(keyThang, primaryKeyThang, valueThang,                                       lockMode);        }    }    /**     * Binding version of Cursor.getNextDup(), no join cursor allowed.     */    OperationStatus getNextDup(boolean lockForWrite)        throws DatabaseException {        checkNoJoinCursor();        return cursor.getNextDup(keyThang, primaryKeyThang, valueThang,                                 getLockMode(lockForWrite));    }    /**     * Binding version of Cursor.getLast(), no join cursor allowed.     */    OperationStatus getLast(boolean lockForWrite)        throws DatabaseException {        checkNoJoinCursor();        return cursor.getLast(keyThang, primaryKeyThang, valueThang,                              getLockMode(lockForWrite));    }    /**     * Binding version of Cursor.getPrev(), no join cursor allowed.     */    OperationStatus getPrev(boolean lockForWrite)        throws DatabaseException {        checkNoJoinCursor();        return cursor.getPrev(keyThang, primaryKeyThang, valueThang,                              getLockMode(lockForWrite));    }

⌨️ 快捷键说明

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