📄 datacursor.java
字号:
/*- * 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 + -