/*- * 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 representing configuration parameters for /// /// public class BTreeDatabaseConfig : DatabaseConfig { /* Fields for DB->set_flags() */ /// /// Policy for duplicate data items in the database; that is, insertion /// when the key of the key/data pair being inserted already exists in /// the database will be successful. /// /// /// The ordering of duplicates in the database for /// is determined by the order /// of insertion, unless the ordering is otherwise specified by use of a /// cursor operation or a duplicate sort function. The ordering of /// duplicates in the database for /// is determined by the /// duplicate comparison function. If the application does not specify a /// comparison function using /// , a default lexical /// comparison will be used. /// /// /// is preferred to /// for performance reasons. /// should only be used by /// applications wanting to order duplicate data items manually. /// /// /// If the database already exists, the value of Duplicates must be the /// same as the existing database or an error will be returned. /// /// /// It is an error to specify and /// anything other than . /// /// public DuplicatesPolicy Duplicates; /// /// Turn reverse splitting in the Btree on or off. /// /// /// As pages are emptied in a database, the Berkeley DB Btree /// implementation attempts to coalesce empty pages into higher-level /// pages in order to keep the database as small as possible and /// minimize search time. This can hurt performance in applications with /// cyclical data demands; that is, applications where the database /// grows and shrinks repeatedly. For example, because Berkeley DB does /// page-level locking, the maximum level of concurrency in a database /// of two pages is far smaller than that in a database of 100 pages, so /// a database that has shrunk to a minimal size can cause severe /// deadlocking when a new cycle of data insertion begins. /// public bool NoReverseSplitting; /// /// If true, support retrieval from the Btree using record numbers. /// /// /// /// Logical record numbers in Btree databases are mutable in the face of /// record insertion or deletion. See /// for further discussion. /// /// /// Maintaining record counts within a Btree introduces a serious point /// of contention, namely the page locations where the record counts are /// stored. In addition, the entire database must be locked during both /// insertions and deletions, effectively single-threading the database /// for those operations. Specifying UseRecordNumbers can result in /// serious performance degradation for some applications and data sets. /// /// /// It is an error to specify and /// anything other than . /// /// /// If the database already exists, the value of UseRecordNumbers must /// be the same as the existing database or an error will be returned. /// /// public bool UseRecordNumbers; internal new uint flags { get { uint ret = base.flags; ret |= (uint)Duplicates; ret |= NoReverseSplitting ? Internal.DbConstants.DB_REVSPLITOFF : 0; ret |= UseRecordNumbers ? Internal.DbConstants.DB_RECNUM : 0; return ret; } } /// /// The policy for how to handle database creation. /// /// /// If the database does not already exist and /// is set, /// will fail. /// public CreatePolicy Creation; internal new uint openFlags { get { uint flags = base.openFlags; flags |= (uint)Creation; return flags; } } /// /// The Btree key comparison function. /// /// /// /// The comparison function is called whenever it is necessary to /// compare a key specified by the application with a key currently /// stored in the tree. /// /// /// If no comparison function is specified, the keys are compared /// lexically, with shorter keys collating before longer keys. /// /// /// If the database already exists, the comparison function must be the /// same as that historically used to create the database or corruption /// can occur. /// /// public EntryComparisonDelegate BTreeCompare; /// /// The Btree prefix function. /// /// /// /// The prefix function is used to determine the amount by which keys /// stored on the Btree internal pages can be safely truncated without /// losing their uniqueness. See the Btree prefix comparison section of /// the Berkeley DB Reference Guide for more details about how this /// works. The usefulness of this is data-dependent, but can produce /// significantly reduced tree sizes and search times in some data sets. /// /// /// If no prefix function or key comparison function is specified by the /// application, a default lexical comparison function is used as the /// prefix function. If no prefix function is specified and /// is specified, no prefix function is /// used. It is an error to specify a prefix function without also /// specifying . /// /// /// If the database already exists, the prefix function must be the /// same as that historically used to create the database or corruption /// can occur. /// /// public EntryComparisonDelegate BTreePrefixCompare; /// /// The duplicate data item comparison function. /// /// /// /// The comparison function is called whenever it is necessary to /// compare a data item specified by the application with a data item /// currently stored in the database. Setting DuplicateCompare implies /// setting to /// . /// /// /// If no comparison function is specified, the data items are compared /// lexically, with shorter data items collating before longer data /// items. /// /// /// If the database already exists when /// is called, the /// delegate must be the same as that historically used to create the /// database or corruption can occur. /// /// public EntryComparisonDelegate DuplicateCompare; internal bool compressionIsSet; private BTreeCompressDelegate compressFunc; /// /// The compression function used to store key/data pairs in the /// database. /// public BTreeCompressDelegate Compress { get { return compressFunc; } } private BTreeDecompressDelegate decompressFunc; /// /// The decompression function used to retrieve key/data pairs from the /// database. /// public BTreeDecompressDelegate Decompress { get { return decompressFunc; } } /// /// Enable compression of the key/data pairs stored in the database, /// using the default compression and decompression functions. /// /// /// The default functions perform prefix compression on keys, and prefix /// compression on data items for duplicate keys. /// public void SetCompression() { compressionIsSet = true; compressFunc = null; decompressFunc = null; } /// /// Enable compression of the key/data pairs stored in the database, /// using the specified compression and decompression functions. /// /// The compression function /// The decompression function public void SetCompression(BTreeCompressDelegate compression, BTreeDecompressDelegate decompression) { compressionIsSet = true; compressFunc = compression; decompressFunc = decompression; } internal bool minkeysIsSet; private uint minKeys; /// /// The minimum number of key/data pairs intended to be stored on any /// single Btree leaf page. /// /// /// /// This value is used to determine if key or data items will be stored /// on overflow pages instead of Btree leaf pages. For more information /// on the specific algorithm used, see the Berkeley DB Reference Guide. /// The value specified must be at least 2; if not explicitly set, a /// value of 2 is used. /// /// /// If the database already exists, MinKeysPerPage will be ignored. /// /// public uint MinKeysPerPage { get { return minKeys; } set { minkeysIsSet = true; minKeys = value; } } /// /// Create a new BTreeDatabaseConfig object /// public BTreeDatabaseConfig() { Duplicates = DuplicatesPolicy.NONE; NoReverseSplitting = false; UseRecordNumbers = false; BTreeCompare = null; BTreePrefixCompare = null; minkeysIsSet = false; Creation = CreatePolicy.NEVER; } } }