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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bdb_cursor.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:36:57  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef BDB___CURSOR_HPP__
  10. #define BDB___CURSOR_HPP__
  11. /* $Id: bdb_cursor.hpp,v 1000.2 2004/06/01 18:36:57 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 Cursor.
  39.  *
  40.  */
  41. /// @file bdb_cursor.hpp
  42. /// Berkeley BDB file cursor
  43. #include <bdb/bdb_file.hpp>
  44. #include <algorithm>
  45. BEGIN_NCBI_SCOPE
  46. /** @addtogroup BDB_Files
  47.  *
  48.  * @{
  49.  */
  50. class CBDB_FileCursor;
  51. class CBDB_FC_Condition;
  52. /// File cursor condition handle.
  53. ///
  54. /// Used for assigning search conditions to a cursor. 
  55. ///
  56. /// <pre>
  57. ///
  58. /// Example:
  59. /// 
  60. ///    CBDB_FileCursor  cursor(bdb_file);
  61. ///    cursor.From << 10;
  62. ///    cursor.To << 20;
  63. ///
  64. /// </pre>
  65. ///
  66. class NCBI_BDB_EXPORT CBDB_ConditionHandle
  67. {
  68. public:
  69.     CBDB_ConditionHandle& operator<< (int           val);
  70.     CBDB_ConditionHandle& operator<< (unsigned int  val);
  71.     CBDB_ConditionHandle& operator<< (float         val);
  72.     CBDB_ConditionHandle& operator<< (double        val);
  73.     CBDB_ConditionHandle& operator<< (const char*   val);
  74.     CBDB_ConditionHandle& operator<< (const string& val);
  75. protected:
  76.     CBDB_ConditionHandle(CBDB_FC_Condition& cond);
  77.     ~CBDB_ConditionHandle();
  78.     CBDB_FC_Condition& m_Condition;
  79.     friend class CBDB_FileCursor;
  80. };
  81. /// Berkeley DB file cursor class. 
  82. ///
  83. /// BDB btree cursors can retrieve values using FROM-TO range criteria.
  84. ///
  85. class NCBI_BDB_EXPORT CBDB_FileCursor
  86. {
  87. public:
  88.     // Cursor search conditions
  89.     enum ECondition {
  90.         eNotSet,
  91.         eFirst,
  92.         eLast,
  93.         eEQ,
  94.         eGT,
  95.         eGE,
  96.         eLT,
  97.         eLE
  98.     };
  99.     enum EFetchDirection {
  100.         eForward,
  101.         eBackward,
  102.         eDefault
  103.     };
  104.     typedef unsigned long TRecordCount;
  105.     
  106. public:
  107.     CBDB_FileCursor(CBDB_File& dbf);
  108.     CBDB_FileCursor(CBDB_File& dbf, CBDB_Transaction& trans);
  109.     ~CBDB_FileCursor();
  110.     void SetCondition(ECondition cond_from, ECondition cond_to = eNotSet);
  111.     void SetFetchDirection(EFetchDirection fdir);
  112.     EFetchDirection GetFetchDirection() const { return m_FetchDirection; }
  113.     EFetchDirection GetReverseFetchDirection() const;
  114.     void ReverseFetchDirection();
  115.     EBDB_ErrCode FetchFirst();    
  116.     EBDB_ErrCode Fetch(EFetchDirection fdir = eDefault);
  117.     EBDB_ErrCode Update(CBDB_File::EAfterWrite = CBDB_File::eDiscardData);
  118.     EBDB_ErrCode Delete(CBDB_File::EIgnoreError on_error = 
  119.                         CBDB_File::eThrowOnError);
  120.     // Returns number of records with same key as this cursor refers
  121.     TRecordCount KeyDupCount() const;
  122. protected:
  123.     /// Test "TO" search criteria. Return "true" if current value satisfies it
  124.     bool TestTo() const;
  125.     /// Set m_FirstFetched field to FALSE.
  126.     void ResetFirstFetched();
  127.     /// Return next field's IBDB_FieldConvert interface 
  128.     /// (hidden cast to non-public parent class)
  129.     IBDB_FieldConvert& GetFieldConvert(CBDB_BufferManager& buf, 
  130.                                        unsigned int n);
  131. protected:
  132.     /// Reference on the "mother" file
  133.     CBDB_File&                   m_Dbf;
  134.        
  135. public:
  136.     CBDB_ConditionHandle  From;
  137.     CBDB_ConditionHandle  To;
  138. private:
  139.     CBDB_FileCursor(const CBDB_FileCursor&);
  140.     CBDB_FileCursor& operator= (const CBDB_FileCursor&);
  141. private:
  142.     /// Berkeley DB DBC thing
  143.     DBC*                   m_DBC;
  144.     /// From condition proxy-object
  145.     ECondition             m_CondFrom;
  146.     /// To condition proxy-object
  147.     ECondition             m_CondTo;
  148.     /// Fetch direction (forward/backward)
  149.     EFetchDirection        m_FetchDirection;
  150.     /// Flag if FetchFirst is already been done
  151.     bool                   m_FirstFetched;
  152.     friend class CBDB_FC_Condition;
  153. };
  154. /* @} */
  155. /////////////////////////////////////////////////////////////////////////////
  156. //  IMPLEMENTATION of INLINE functions
  157. /////////////////////////////////////////////////////////////////////////////
  158. /////////////////////////////////////////////////////////////////////////////
  159. //  CBDB_FileCursor::
  160. //
  161. inline void CBDB_FileCursor::ResetFirstFetched()
  162. {
  163.     m_FirstFetched = false;
  164. }
  165. inline 
  166. IBDB_FieldConvert& CBDB_FileCursor::GetFieldConvert(CBDB_BufferManager& buf,
  167.                                                     unsigned int        n)
  168. {
  169.     return static_cast<IBDB_FieldConvert&> (buf.GetField(n));
  170. }
  171. inline
  172. void CBDB_FileCursor::SetFetchDirection(EFetchDirection fdir)
  173. {
  174.     m_FetchDirection = fdir;
  175. }
  176. inline
  177. CBDB_FileCursor::EFetchDirection 
  178. CBDB_FileCursor::GetReverseFetchDirection() const
  179. {
  180.     if (m_FetchDirection == eForward) return eBackward;
  181.     return eForward;
  182. }
  183. inline
  184. void CBDB_FileCursor::ReverseFetchDirection()
  185. {
  186.     if (m_FetchDirection == eForward) m_FetchDirection = eBackward;
  187.     if (m_FetchDirection == eBackward) m_FetchDirection = eForward;
  188. }
  189. END_NCBI_SCOPE
  190. /*
  191.  * ===========================================================================
  192.  * $Log: bdb_cursor.hpp,v $
  193.  * Revision 1000.2  2004/06/01 18:36:57  gouriano
  194.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  195.  *
  196.  * Revision 1.10  2004/05/06 19:18:46  rotmistr
  197.  * Cursor KeyDupCount added
  198.  *
  199.  * Revision 1.9  2004/05/06 18:17:58  rotmistr
  200.  * Cursor Update/Delete implemented
  201.  *
  202.  * Revision 1.8  2003/12/29 13:23:24  kuznets
  203.  * Added support for transaction protected cursors.
  204.  *
  205.  * Revision 1.7  2003/09/26 21:01:05  kuznets
  206.  * Comments changed to meet doxygen format requirements
  207.  *
  208.  * Revision 1.6  2003/07/18 20:09:38  kuznets
  209.  * Added several FetchDirection manipulation functions.
  210.  *
  211.  * Revision 1.5  2003/06/27 18:57:16  dicuccio
  212.  * Uninlined strerror() adaptor.  Changed to use #include<> instead of #include ""
  213.  *
  214.  * Revision 1.4  2003/06/10 20:07:27  kuznets
  215.  * Fixed header files not to repeat information from the README file
  216.  *
  217.  * Revision 1.3  2003/06/03 18:50:09  kuznets
  218.  * Added dll export/import specifications
  219.  *
  220.  * Revision 1.2  2003/04/29 16:48:31  kuznets
  221.  * Fixed minor warnings in Sun Workshop compiler
  222.  *
  223.  * Revision 1.1  2003/04/24 16:31:16  kuznets
  224.  * Initial revision
  225.  *
  226.  * ===========================================================================
  227.  */
  228. #endif