bdb_file.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:17k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bdb_file.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:37:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.30
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef BDB_FILE_HPP__
  10. #define BDB_FILE_HPP__
  11. /* $Id: bdb_file.hpp,v 1000.2 2004/06/01 18:37:00 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Anatoliy Kuznetsov
  37.  *   
  38.  * File Description: Berkeley DB File classes.
  39.  *
  40.  */
  41. /// @file bdb_file.hpp
  42. /// BDB File management.
  43. #include <bdb/bdb_types.hpp>
  44. BEGIN_NCBI_SCOPE
  45. /** @addtogroup BDB_Files
  46.  *
  47.  * @{
  48.  */
  49. /// BDB Return codes
  50. ///
  51. enum EBDB_ErrCode {
  52.     eBDB_Ok,
  53.     eBDB_NotFound,
  54.     eBDB_KeyDup
  55. };
  56. class CBDB_Env;
  57. class CBDB_Transaction;
  58. /// Raw file class wraps up basic Berkeley DB operations. 
  59. ///
  60. class NCBI_BDB_EXPORT CBDB_RawFile
  61. {
  62. public:
  63.     static const char kDefaultDatabase[];  // = "_table"
  64.     enum EOpenMode {
  65.         eReadWrite,
  66.         eReadOnly,
  67.         eCreate,         //!< implies 'eReadWrite' too
  68.         eReadWriteCreate //!< read-write, create if it doesn't exist
  69.     };
  70.     enum EReallocMode {
  71.         eReallocAllowed,
  72.         eReallocForbidden
  73.     };
  74.     enum EDuplicateKeys {
  75.         eDuplicatesDisable,
  76.         eDuplicatesEnable
  77.     };
  78.     enum EIgnoreError {
  79.         eIgnoreError,
  80.         eThrowOnError
  81.     };
  82. public:
  83.     CBDB_RawFile(EDuplicateKeys dup_keys=eDuplicatesDisable);
  84.     virtual ~CBDB_RawFile();
  85.     /// Associate file with environment. Should be called before 
  86.     /// file opening.
  87.     void SetEnv(CBDB_Env& env);
  88.     /// Get pointer on file environment
  89.     /// Return NULL if no environment has been set
  90.     CBDB_Env* GetEnv() { return m_Env; }
  91.     /// Open file with specified access mode
  92.     void Open(const char* filename, EOpenMode open_mode);
  93.     /// Open file with specified filename and database name.
  94.     /// (Berkeley DB supports having several database tables in one file.) 
  95.     void Open(const char* filename, const char* database,
  96.               EOpenMode open_mode);
  97.     /// Attach class to external BerkeleyDB file instance.
  98.     /// Note: Should be already open.
  99.     void Attach(CBDB_RawFile& bdb_file);
  100.     /// Close file
  101.     void Close();
  102.     /// Reopen database file. (Should be already open).
  103.     void Reopen(EOpenMode open_mode);
  104.     /// Remove the database specified by the filename and database arguments
  105.     void Remove(const char* filename, const char* database = 0);
  106.     /// Empty the database. Return number of records removed.
  107.     unsigned int Truncate();
  108.     // Set Berkeley DB page size value. By default OS default is used.
  109.     void SetPageSize(unsigned int page_size);
  110.     /// Set Berkeley DB memory cache size for the file (default is 256K).
  111.     void SetCacheSize(unsigned int cache_size);
  112.     const string& FileName() const;
  113.     const string& Database() const;
  114.     /// Set comparison function. Default implementation installs bdb_types based
  115.     /// function. Can be overloaded for some specific cases.
  116.     virtual void SetCmp(DB*) = 0;
  117.     /// Return TRUE if the file is open
  118.     bool IsOpen() const;
  119.     // Return TRUE if the file is attached to some other BDB file
  120.     bool IsAttached() const;
  121.     /// Return TRUE if the if the underlying database files were created 
  122.     /// on an architecture of the different byte order 
  123.     bool IsByteSwapped() const { return m_ByteSwapped; }
  124.     /// Return TRUE if file can contain duplicate keys
  125.     bool DuplicatesAllowed() const { return m_DuplicateKeys == eDuplicatesEnable; }
  126.     /// Return the key duplicate mode value
  127.     EDuplicateKeys GetDupKeysMode() const { return m_DuplicateKeys; }
  128.     /// Return file name
  129.     const string& GetFileName() const { return m_FileName; }
  130.     /// Return the file open mode
  131.     EOpenMode GetOpenMode() const { return m_OpenMode; }
  132.     /// Flush any cached information to disk
  133.     void Sync();
  134.     /// Compute database statistic, return number of records.
  135.     /// (Can be time consuming)
  136.     unsigned CountRecs();
  137.     
  138.     /// Set current transaction
  139.     void SetTransaction(CBDB_Transaction* trans);
  140. private:
  141.     CBDB_RawFile(const CBDB_RawFile&);
  142.     CBDB_RawFile& operator= (const CBDB_RawFile&);
  143. protected:
  144.     void x_Open(const char* filename, const char* database,
  145.                 EOpenMode open_mode);
  146.     void x_Create(const char* filename, const char* database);
  147.     void x_Close(EIgnoreError close_mode);
  148.     // Create m_DB member, set page, cache parameters
  149.     void x_CreateDB();
  150.     void x_RemoveTransaction(CBDB_Transaction* trans);
  151.     
  152.     /// Get transaction handler.
  153.     ///
  154.     /// Function returns NULL if no transaction has been set.
  155.     ///
  156.     /// @sa SetTransaction
  157.     DB_TXN* GetTxn();
  158.     /// Create DB cursor
  159.     DBC* CreateCursor(CBDB_Transaction* trans = 0) const;
  160. protected:
  161.     DB*               m_DB;
  162.     DBT*              m_DBT_Key;
  163.     DBT*              m_DBT_Data;
  164.     CBDB_Env*         m_Env;
  165.     CBDB_Transaction* m_Trans;
  166. private:
  167.     bool             m_DB_Attached;  //!< TRUE if m_DB doesn't belong here
  168.     bool             m_ByteSwapped;  //!< TRUE if file created on a diff.arch.
  169.     string           m_FileName;     //!< filename
  170.     string           m_Database;     //!< db name in file (optional)
  171.     unsigned         m_PageSize;
  172.     unsigned         m_CacheSize;
  173.     EDuplicateKeys   m_DuplicateKeys;
  174.     EOpenMode        m_OpenMode;
  175.     static const int kOpenFileMask;
  176.     
  177.     friend class CBDB_Transaction;
  178.     friend class CBDB_FileCursor;
  179. };
  180. /// Berkeley DB file class. 
  181. /// Implements primary key and fields functionality.
  182. ///
  183. class NCBI_BDB_EXPORT CBDB_File : public CBDB_RawFile
  184. {
  185. public:
  186.     CBDB_File(EDuplicateKeys dup_keys = eDuplicatesDisable);
  187.     /// Open file with specified access mode
  188.     void Open(const char* filename, EOpenMode open_mode);
  189.     /// Open file with specified filename and database name.
  190.     /// (Berkeley DB supports having several database tables in one file.) 
  191.     void Open(const char* filename, const char* database,
  192.               EOpenMode open_mode);
  193.     /// Reopen the db file
  194.     void Reopen(EOpenMode open_mode);
  195.     /// Attach external Berkeley DB file.
  196.     /// Note: Should be already open.
  197.     void Attach(CBDB_File& db_file);
  198.     /// Fetches the record corresponding to the current key value.
  199.     EBDB_ErrCode Fetch() { return x_Fetch(0); }
  200.     
  201.     /// Fetche the record corresponding to the current key value.
  202.     /// Acquire write lock instead of read lock when doing the retrieval.
  203.     /// Meaningful only in the presence of transactions.
  204.     EBDB_ErrCode FetchForUpdate();
  205.     
  206.     enum EAfterWrite {
  207.         eKeepData,    //!< Keep the inserted data for a while
  208.         eDiscardData  //!< Invalidate the inserted data immediately after write
  209.     };
  210.     /// Insert new record
  211.     EBDB_ErrCode Insert(EAfterWrite write_flag = eDiscardData);
  212.     /// Delete record corresponding to the current key value.
  213.     EBDB_ErrCode Delete(EIgnoreError on_error=eThrowOnError);
  214.     /// Update record corresponding to the current key value. If record does not exist
  215.     /// it will be inserted.
  216.     EBDB_ErrCode UpdateInsert(EAfterWrite write_flag = eDiscardData);
  217.     
  218.     
  219.     void BindKey (const char* field_name, 
  220.                   CBDB_Field* key_field,  
  221.                   size_t buf_size = 0);
  222.     void BindData(const char* field_name,
  223.                   CBDB_Field* data_field, 
  224.                   size_t buf_size = 0, 
  225.                   ENullable is_null = eNullable);
  226.     /// Get Buffer manager for key section of the file
  227.     const CBDB_BufferManager* GetKeyBuffer() const { return m_KeyBuf.get(); }
  228.     /// Get Buffer manager for data section of the file
  229.     const CBDB_BufferManager* GetDataBuffer() const { return m_DataBuf.get(); }
  230.     /// Sets maximum number of key fields participating in comparison
  231.     /// Should be less than total number of key fields
  232.     void SetFieldCompareLimit(unsigned int n_fields);
  233.     /// Create new copy of m_DBT_Key.
  234.     /// Caller is responsible for proper deletion. See also: DestroyDBT_Clone
  235.     DBT* CloneDBT_Key();
  236.     /// Free the DBT structure created by CloneDBT_Key.
  237.     static void DestroyDBT_Clone(DBT* dbt);
  238.     /// Set C-str detection
  239.     void SetLegacyStringsCheck(bool value);
  240.     /// CBDB_File keeps data in two buffers (key buffer and data buffer).
  241.     /// TUnifiedFieldIndex is used to address fields in a non-ambigiuos manner.
  242.     /// Negative index addresses fields in the key buffer, positive - data buffer
  243.     /// Numbers are 1 based, 0 - means non-existing field
  244.     typedef int TUnifiedFieldIndex;
  245.     /// Get field index by name.
  246.     /// @param
  247.     ///   name field name to find (case insensitive)
  248.     /// @return 
  249.     ///   Field index (0 if not found)
  250.     /// @sa TUnifiedFieldIndex
  251.     TUnifiedFieldIndex GetFieldIdx(const string& name) const;
  252.     /// Return field by field index
  253.     /// @param
  254.     ///    idx field index
  255.     /// @return field reference
  256.     const CBDB_Field& GetField(TUnifiedFieldIndex idx) const;
  257.     CBDB_Field& GetField(TUnifiedFieldIndex idx);
  258. protected:
  259.     /// Unpack internal record buffers
  260.     void Discard();
  261.     /// Set comparison function. Default implementation installs bdb_types based
  262.     /// function. Can be overloaded for some specific cases.
  263.     virtual void SetCmp(DB*);
  264.     /// Read DB cursor
  265.     EBDB_ErrCode ReadCursor(DBC* dbc, unsigned int bdb_flag);
  266.     /// Write DB cursor
  267.     EBDB_ErrCode WriteCursor(DBC* dbc, unsigned int bdb_flag, 
  268.                              EAfterWrite write_flag);
  269.     /// Delete DB cursor
  270.     EBDB_ErrCode DeleteCursor(DBC* dbc, EIgnoreError);
  271.     /// Check if all NOT NULL fields are assigned. 
  272.     /// Throw an exception if constraint check failed.
  273.     void CheckNullDataConstraint() const;
  274.     /// Function disables processing of m_DBT_data. 
  275.     /// This function can be used when creating custom BDB file
  276.     /// data structures (BLOB storage, etc.) Caller takes full
  277.     /// responsibility for filling m_DBT_Data with correct values.
  278.     void DisableDataBufProcessing() { m_DataBufDisabled = true; }
  279.     /// Wrapper around get operation.    
  280.     EBDB_ErrCode x_Fetch(unsigned int flags);    
  281. private:
  282.     CBDB_File(const CBDB_File&);
  283.     CBDB_File& operator= (const CBDB_File&);
  284.     /// Record reading prolog function
  285.     void x_StartRead();
  286.     /// Record reading epilog function
  287.     void x_EndRead();
  288.     EBDB_ErrCode x_Write(unsigned int flags, EAfterWrite write_flag, 
  289.                          DBC * dbc = 0);
  290.     void x_CheckConstructBuffers();
  291. private:
  292.     auto_ptr<CBDB_BufferManager>   m_KeyBuf;
  293.     auto_ptr<CBDB_BufferManager>   m_DataBuf;
  294.     bool                           m_BufsAttached;
  295.     bool                           m_BufsCreated;
  296.     bool                           m_DataBufDisabled;
  297.     bool                           m_LegacyString;
  298.     friend class CBDB_FileCursor;
  299. };
  300. /// Berkeley DB file class optimized to work with 
  301. /// tables having int as the primary key.
  302. ///
  303. class NCBI_BDB_EXPORT CBDB_IdFile : public CBDB_File
  304. {
  305. public:
  306.     CBDB_FieldInt4  IdKey;
  307. public:
  308.     CBDB_IdFile();
  309.     virtual void SetCmp(DB* db);  
  310. };
  311. /* @} */
  312. /////////////////////////////////////////////////////////////////////////////
  313. //  IMPLEMENTATION of INLINE functions
  314. /////////////////////////////////////////////////////////////////////////////
  315. /// Make field index in CBDB_File format
  316. ///
  317. /// @internal
  318. inline
  319. CBDB_File::TUnifiedFieldIndex BDB_GetUFieldIdx(int fidx, bool key)
  320. {
  321.     _ASSERT(fidx >= 0);
  322.     ++fidx;
  323.     return key ? (-fidx) : (fidx);
  324. }
  325. /////////////////////////////////////////////////////////////////////////////
  326. //  CBDB_RawFile::
  327. //
  328. inline 
  329. void CBDB_RawFile::Open(const char* filename, EOpenMode open_mode)
  330. {
  331.     Open(filename, 0, open_mode);
  332. }
  333. inline 
  334. const string& CBDB_RawFile::FileName() const
  335. {
  336.     return m_FileName;
  337. }
  338. inline 
  339. const string& CBDB_RawFile::Database() const
  340. {
  341.     return m_Database;
  342. }
  343. inline 
  344. bool CBDB_RawFile::IsOpen() const
  345. {
  346.     return !m_FileName.empty();
  347. }
  348. inline 
  349. bool CBDB_RawFile::IsAttached() const
  350. {
  351.     return m_DB_Attached;
  352. }
  353. /////////////////////////////////////////////////////////////////////////////
  354. //
  355. //  CBDB_File::
  356. //
  357. inline 
  358. void CBDB_File::Open(const char* filename, EOpenMode open_mode)
  359. {
  360.     Open(filename, 0, open_mode);
  361. }
  362. inline 
  363. void CBDB_File::CheckNullDataConstraint() const
  364. {
  365.     if ( m_DataBuf.get() )
  366.         m_DataBuf->CheckNullConstraint();
  367. }
  368. inline
  369. void CBDB_File::SetFieldCompareLimit(unsigned int n_fields)
  370. {
  371.     m_KeyBuf->SetFieldCompareLimit(n_fields);
  372. }
  373. END_NCBI_SCOPE
  374. /*
  375.  * ===========================================================================
  376.  * $Log: bdb_file.hpp,v $
  377.  * Revision 1000.2  2004/06/01 18:37:00  gouriano
  378.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.30
  379.  *
  380.  * Revision 1.30  2004/05/06 18:17:58  rotmistr
  381.  * Cursor Update/Delete implemented
  382.  *
  383.  * Revision 1.29  2004/03/08 13:31:58  kuznets
  384.  * CBDB_File some methods made public
  385.  *
  386.  * Revision 1.28  2004/02/13 15:00:12  kuznets
  387.  * + typedef TUnifiedFieldIndex plus methods to work with fields in CBDB_File
  388.  *
  389.  * Revision 1.27  2003/12/29 13:23:01  kuznets
  390.  * Added support for transaction protected cursors.
  391.  *
  392.  * Revision 1.26  2003/12/22 18:53:50  kuznets
  393.  * Added legacy(c-string) string format check flag.
  394.  *
  395.  * Revision 1.25  2003/12/16 13:42:58  kuznets
  396.  * Added internal method to close association between transaction object
  397.  * and BDB file object when transaction goes out of scope.
  398.  *
  399.  * Revision 1.24  2003/12/10 19:13:27  kuznets
  400.  * Added support of berkeley db transactions
  401.  *
  402.  * Revision 1.23  2003/10/27 14:20:31  kuznets
  403.  * + Buffer manager accessor functions for CBDB_File
  404.  *
  405.  * Revision 1.22  2003/10/16 19:26:07  kuznets
  406.  * Added field comparison limit to the fields manager
  407.  *
  408.  * Revision 1.21  2003/10/15 18:10:09  kuznets
  409.  * Several functions(Close, Delete) received optional parameter to ignore
  410.  * errors (if any).
  411.  *
  412.  * Revision 1.20  2003/09/26 21:08:30  kuznets
  413.  * Comments reformatting for doxygen
  414.  *
  415.  * Revision 1.19  2003/09/17 18:16:21  kuznets
  416.  * Some class functions migrated into the public scope.
  417.  *
  418.  * Revision 1.18  2003/09/16 20:17:29  kuznets
  419.  * CBDB_File: added methods to clone (and then destroy) DBT Key.
  420.  *
  421.  * Revision 1.17  2003/09/11 16:34:13  kuznets
  422.  * Implemented byte-order independence.
  423.  *
  424.  * Revision 1.16  2003/08/27 20:02:10  kuznets
  425.  * Added DB_ENV support
  426.  *
  427.  * Revision 1.15  2003/07/23 20:21:27  kuznets
  428.  * Implemented new improved scheme for setting BerkeleyDB comparison function.
  429.  * When table has non-segmented key the simplest(and fastest) possible function
  430.  * is assigned (automatically without reloading CBDB_File::SetCmp function).
  431.  *
  432.  * Revision 1.14  2003/07/23 18:07:56  kuznets
  433.  * Implemented couple new functions to work with attached files
  434.  *
  435.  * Revision 1.13  2003/07/22 19:21:04  kuznets
  436.  * Implemented support of attachable berkeley db files
  437.  *
  438.  * Revision 1.12  2003/07/22 15:14:33  kuznets
  439.  * + RawFile::CountRecs() function
  440.  *
  441.  * Revision 1.11  2003/07/18 20:11:05  kuznets
  442.  * Added ReadWrite or Create open mode, added several accessor methods, Sync() method.
  443.  *
  444.  * Revision 1.10  2003/07/09 14:29:01  kuznets
  445.  * Added support of files with duplicate access keys. (DB_DUP mode)
  446.  *
  447.  * Revision 1.9  2003/07/02 17:53:59  kuznets
  448.  * Eliminated direct dependency from <db.h>
  449.  *
  450.  * Revision 1.8  2003/06/27 18:57:16  dicuccio
  451.  * Uninlined strerror() adaptor.  Changed to use #include<> instead of #include ""
  452.  *
  453.  * Revision 1.7  2003/06/10 20:07:27  kuznets
  454.  * Fixed header files not to repeat information from the README file
  455.  *
  456.  * Revision 1.6  2003/06/03 18:50:09  kuznets
  457.  * Added dll export/import specifications
  458.  *
  459.  * Revision 1.5  2003/05/27 16:13:21  kuznets
  460.  * Destructors of key classes declared virtual to make GCC happy
  461.  *
  462.  * Revision 1.4  2003/05/05 20:14:41  kuznets
  463.  * Added CBDB_BLobFile, CBDB_File changed to support more flexible data record
  464.  * management.
  465.  *
  466.  * Revision 1.3  2003/05/02 14:14:18  kuznets
  467.  * new method UpdateInsert
  468.  *
  469.  * Revision 1.2  2003/04/29 16:48:31  kuznets
  470.  * Fixed minor warnings in Sun Workshop compiler
  471.  *
  472.  * Revision 1.1  2003/04/24 16:31:16  kuznets
  473.  * Initial revision
  474.  *
  475.  *
  476.  * ===========================================================================
  477.  */
  478. #endif