/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2009 Oracle. All rights reserved.
*
*/
using System;
using System.Collections.Generic;
using System.Text;
using BerkeleyDB.Internal;
namespace BerkeleyDB {
///
/// A class for traversing the records of a
///
public class BTreeCursor : Cursor {
internal BTreeCursor(DBC dbc, uint pagesize)
: base(dbc, DatabaseType.BTREE, pagesize) { }
internal BTreeCursor(DBC dbc, uint pagesize, CachePriority p)
: base(dbc, DatabaseType.BTREE, pagesize, p) { }
///
/// Create a new cursor that uses the same transaction and locker ID as
/// the original cursor.
///
///
/// This is useful when an application is using locking and requires two
/// or more cursors in the same thread of control.
///
///
/// If true, the newly created cursor is initialized to refer to the
/// same position in the database as the original cursor (if any) and
/// hold the same locks (if any). If false, or the original cursor does
/// not hold a database position and locks, the created cursor is
/// uninitialized and will behave like a cursor newly created by
/// .
/// A newly created cursor
public new BTreeCursor Duplicate(bool keepPosition) {
return new BTreeCursor(
dbc.dup(keepPosition ? DbConstants.DB_POSITION : 0), pgsz);
}
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair in .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool Move(uint recno) { return Move(recno, null); }
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair in .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
/// The locking behavior to use
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool Move(uint recno, LockingInfo info) {
DatabaseEntry key = new DatabaseEntry();
key.Data = BitConverter.GetBytes(recno);
DatabaseEntry data = new DatabaseEntry();
return base.Get(key, data, DbConstants.DB_SET_RECNO, info);
}
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair and as many duplicate data items that can
/// fit in a buffer the size of one database page in
/// .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool MoveMultiple(uint recno) {
return MoveMultiple(recno, (int)pgsz, null);
}
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair and as many duplicate data items that can
/// fit in a buffer the size of one database page in
/// .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
///
/// The size of a buffer to fill with duplicate data items. Must be at
/// least the page size of the underlying database and be a multiple of
/// 1024.
///
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool MoveMultiple(uint recno, int BufferSize) {
return MoveMultiple(recno, BufferSize, null);
}
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair and as many duplicate data items that can
/// fit in a buffer the size of one database page in
/// .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
/// The locking behavior to use
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool MoveMultiple(uint recno, LockingInfo info) {
return MoveMultiple(recno, (int)pgsz, info);
}
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair and as many duplicate data items that can
/// fit in a buffer the size of one database page in
/// .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
///
/// The size of a buffer to fill with duplicate data items. Must be at
/// least the page size of the underlying database and be a multiple of
/// 1024.
///
/// The locking behavior to use
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool MoveMultiple(uint recno, int BufferSize, LockingInfo info) {
DatabaseEntry key = new DatabaseEntry();
key.Data = BitConverter.GetBytes(recno);
DatabaseEntry data = new DatabaseEntry();
return base.GetMultiple(
key, data, BufferSize, DbConstants.DB_SET_RECNO, info, false);
}
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair and as many ensuing key/data pairs that can
/// fit in a buffer the size of one database page in
/// .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool MoveMultipleKey(uint recno) {
return MoveMultipleKey(recno, (int)pgsz, null);
}
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair and as many ensuing key/data pairs that can
/// fit in a buffer the size of one database page in
/// .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
///
/// The size of a buffer to fill with key/data pairs. Must be at least
/// the page size of the underlying database and be a multiple of 1024.
///
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool MoveMultipleKey(uint recno, int BufferSize) {
return MoveMultipleKey(recno, BufferSize, null);
}
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair and as many ensuing key/data pairs that can
/// fit in a buffer the size of one database page in
/// .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
/// The locking behavior to use
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool MoveMultipleKey(uint recno, LockingInfo info) {
return MoveMultipleKey(recno, (int)pgsz, info);
}
///
/// Position the cursor at a specific key/data pair in the database, and
/// store the key/data pair and as many ensuing key/data pairs that can
/// fit in a buffer the size of one database page in
/// .
///
///
/// The specific numbered record of the database at which to position
/// the cursor.
///
///
/// The size of a buffer to fill with key/data pairs. Must be at least
/// the page size of the underlying database and be a multiple of 1024.
///
/// The locking behavior to use
///
/// True if the cursor was positioned successfully, false otherwise.
///
public bool MoveMultipleKey(
uint recno, int BufferSize, LockingInfo info) {
DatabaseEntry key = new DatabaseEntry();
key.Data = BitConverter.GetBytes(recno);
DatabaseEntry data = new DatabaseEntry();
return base.GetMultiple(
key, data, BufferSize, DbConstants.DB_SET_RECNO, info, true);
}
///
/// Return the record number associated with the cursor's current
/// position.
///
/// The record number associated with the cursor.
public uint Recno() { return Recno(null); }
///
/// Return the record number associated with the cursor's current
/// position.
///
/// The locking behavior to use
/// The record number associated with the cursor.
public uint Recno(LockingInfo info) {
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry data = new DatabaseEntry();
base.Get(key, data, DbConstants.DB_GET_RECNO, info);
return BitConverter.ToUInt32(base.Current.Value.Data, 0);
}
///
/// Insert the data element as a duplicate element of the key to which
/// the cursor refers.
///
/// The data element to insert
///
/// Specify whether to insert the data item immediately before or
/// immediately after the cursor's current position.
///
public new void Insert(DatabaseEntry data, InsertLocation loc) {
base.Insert(data, loc);
}
///
/// Insert the specified key/data pair into the database, unless a
/// key/data pair comparing equally to it already exists in the
/// database.
///
/// The key/data pair to be inserted
///
/// Thrown if a matching key/data pair already exists in the database.
///
public new void AddUnique(
KeyValuePair pair) {
base.AddUnique(pair);
}
///
/// Insert the specified key/data pair into the database.
///
/// The key/data pair to be inserted
///
/// If the key already exists in the database and no duplicate sort
/// function has been specified, specify whether the inserted data item
/// is added as the first or the last of the data items for that key.
///
public new void Add(KeyValuePair pair,
InsertLocation loc) {
base.Add(pair, loc);
}
}
}