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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bdb_env.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 18:37:19  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.20
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: bdb_env.cpp,v 1000.4 2004/06/01 18:37:19 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author: Anatoliy Kuznetsov
  35.  *
  36.  * File Description:  BDB libarary environment class implementation.
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <bdb/bdb_env.hpp>
  41. #include <db.h>
  42. BEGIN_NCBI_SCOPE
  43. CBDB_Env::CBDB_Env()
  44. : m_Env(0),
  45.   m_Transactional(false),
  46.   m_ErrFile(0)
  47. {
  48.     int ret = db_env_create(&m_Env, 0);
  49.     BDB_CHECK(ret, "DB_ENV");
  50. }
  51. CBDB_Env::CBDB_Env(DB_ENV* env)
  52. : m_Env(env),
  53.   m_Transactional(false),
  54.   m_ErrFile(0)
  55. {
  56. }
  57. CBDB_Env::~CBDB_Env()
  58. {
  59.     /*int ret = */m_Env->close(m_Env, 0);
  60.     if (m_ErrFile) {
  61.         fclose(m_ErrFile);
  62.     }
  63. }
  64. void CBDB_Env::SetCacheSize(unsigned int cache_size)
  65. {
  66.     int ret = m_Env->set_cachesize(m_Env, 0, cache_size, 1);
  67.     BDB_CHECK(ret, 0);
  68. }
  69. void CBDB_Env::Open(const char* db_home, int flags)
  70. {
  71.     int ret = m_Env->open(m_Env, db_home, flags, 0664);
  72.     BDB_CHECK(ret, "DB_ENV");
  73. }
  74. void CBDB_Env::OpenWithLocks(const char* db_home)
  75. {
  76.     Open(db_home, DB_CREATE/*|DB_RECOVER*/|DB_INIT_LOCK|DB_INIT_MPOOL);
  77. }
  78. void CBDB_Env::OpenWithTrans(const char* db_home)
  79. {
  80.     int ret = m_Env->set_lk_detect(m_Env, DB_LOCK_DEFAULT);
  81.     BDB_CHECK(ret, "DB_ENV");
  82.     Open(db_home, 
  83.          DB_INIT_TXN | DB_RECOVER |
  84.          DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_THREAD);
  85.     m_Transactional = true;
  86. }
  87. void CBDB_Env::OpenConcurrentDB(const char* db_home)
  88. {
  89.     int ret = 
  90.       m_Env->set_flags(m_Env, 
  91.                        DB_CDB_ALLDB|DB_DIRECT_DB, 1);
  92.     BDB_CHECK(ret, "DB_ENV::set_flags");
  93.     Open(db_home, DB_INIT_CDB|DB_INIT_MPOOL);
  94. }
  95. void CBDB_Env::JoinEnv(const char* db_home, unsigned int opt)
  96. {
  97.     int flag = DB_JOINENV;
  98.     if (opt & eThreaded) {
  99.         flag |= DB_THREAD;
  100.     }
  101.     Open(db_home, flag);
  102.     // Check if we joined the transactional environment
  103.     // Try to create a fake transaction to test the environment
  104.     DB_TXN* txn = 0;
  105.     int ret = m_Env->txn_begin(m_Env, 0, &txn, 0);
  106.     if (ret == 0) {
  107.         m_Transactional = true;
  108.         ret = txn->abort(txn);
  109.     }
  110.     // commented since it caused crash on windows trying to free
  111.     // txn_statp structure. (Why it happened remains unknown)
  112. /*
  113.     DB_TXN_STAT *txn_statp = 0;
  114.     int ret = m_Env->txn_stat(m_Env, &txn_statp, 0);
  115.     if (ret == 0)
  116.     {
  117.         ::free(txn_statp);
  118.         txn_statp = 0;
  119.         // Try to create a fake transaction to test the environment
  120.         DB_TXN* txn = 0;
  121.         ret = m_Env->txn_begin(m_Env, 0, &txn, 0);
  122.         if (ret == 0) {
  123.             m_Transactional = true;
  124.             ret = txn->abort(txn);
  125.         }
  126.     }
  127. */
  128. }
  129. DB_TXN* CBDB_Env::CreateTxn(DB_TXN* parent_txn, unsigned int flags)
  130. {
  131.     DB_TXN* txn = 0;
  132.     int ret = m_Env->txn_begin(m_Env, parent_txn, &txn, flags);
  133.     BDB_CHECK(ret, "DB_ENV::txn_begin");
  134.     return txn;
  135. }
  136. void CBDB_Env::OpenErrFile(const char* file_name)
  137. {
  138.     if (m_ErrFile) {
  139.         fclose(m_ErrFile);
  140.         m_ErrFile = 0;
  141.     }
  142.     m_ErrFile = fopen(file_name, "a");
  143.     if (m_ErrFile) {
  144.         m_Env->set_errfile(m_Env, m_ErrFile);
  145.     }
  146. }
  147. void CBDB_Env::SetDirectDB(bool on_off)
  148. {
  149.     // error checking commented (not all platforms support direct IO)
  150.     /*int ret = */ m_Env->set_flags(m_Env, DB_DIRECT_DB, (int)on_off);
  151.     // BDB_CHECK(ret, "DB_ENV::set_flags(DB_DIRECT_DB)");   
  152. }
  153. void CBDB_Env::SetDirectLog(bool on_off)
  154. {
  155.     // error checking commented (not all platforms support direct IO)
  156.     /*int ret = */ m_Env->set_flags(m_Env, DB_DIRECT_LOG, (int)on_off);
  157.     // BDB_CHECK(ret, "DB_ENV::set_flags(DB_DIRECT_LOG)");   
  158. }
  159. void CBDB_Env::TransactionCheckpoint()
  160. {
  161.     if (IsTransactional()) {
  162.         int ret = m_Env->txn_checkpoint(m_Env, 0, 0, 0);
  163.         BDB_CHECK(ret, "DB_ENV::txn_checkpoint");   
  164.     }
  165. }
  166. END_NCBI_SCOPE
  167. /*
  168.  * ===========================================================================
  169.  * $Log: bdb_env.cpp,v $
  170.  * Revision 1000.4  2004/06/01 18:37:19  gouriano
  171.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.20
  172.  *
  173.  * Revision 1.20  2004/05/17 20:55:11  gorelenk
  174.  * Added include of PCH ncbi_pch.hpp
  175.  *
  176.  * Revision 1.19  2004/04/08 18:10:23  vakatov
  177.  * Rollback to R1.17, as <db_config.h> is not a part of standard BerkleyDB
  178.  * installation (as we have it, at least). Must be done in a different way.
  179.  *
  180.  * Revision 1.17  2004/03/26 14:53:59  kuznets
  181.  * No error checking for direct IO functions (does not work on some platforms)
  182.  *
  183.  * Revision 1.16  2004/03/26 14:05:04  kuznets
  184.  * + implemented transaction checkpoints and buffering functions
  185.  *
  186.  * Revision 1.15  2004/03/12 15:09:57  kuznets
  187.  * OpenWithLocks removed DB_RECOVER flag
  188.  * (only applicable for transactional environments)
  189.  *
  190.  * Revision 1.14  2004/02/06 16:23:31  kuznets
  191.  * Simplified JoinEnv function to avoid misterious crash on some systems
  192.  *
  193.  * Revision 1.13  2004/02/04 14:39:01  kuznets
  194.  * Minor code clean up in JoinEnv when deallocating transaction statistics
  195.  * structure
  196.  *
  197.  * Revision 1.12  2003/12/29 18:45:41  kuznets
  198.  * JoinEnv changed to support thread safe join
  199.  *
  200.  * Revision 1.11  2003/12/29 17:24:07  kuznets
  201.  * Created fake transaction when joining environment to check if it supports
  202.  * transactions.
  203.  *
  204.  * Revision 1.10  2003/12/29 16:15:37  kuznets
  205.  * +OpenErrFile
  206.  *
  207.  * Revision 1.9  2003/12/29 12:55:35  kuznets
  208.  * Minor tweaking of locking mechanism.
  209.  *
  210.  * Revision 1.8  2003/12/15 14:51:43  kuznets
  211.  * Checking environment flags in JoinEnv to determine environment is
  212.  * transactional.
  213.  *
  214.  * Revision 1.7  2003/12/12 14:07:40  kuznets
  215.  * JoinEnv: checking if we joining transactional environment
  216.  *
  217.  * Revision 1.6  2003/12/10 19:14:02  kuznets
  218.  * Added support of berkeley db transactions
  219.  *
  220.  * Revision 1.5  2003/11/24 13:49:19  kuznets
  221.  * +OpenConcurrentDB
  222.  *
  223.  * Revision 1.4  2003/11/03 13:07:22  kuznets
  224.  * JoinEnv implemented
  225.  *
  226.  * Revision 1.3  2003/10/20 15:23:55  kuznets
  227.  * Added cache management for BDB environment
  228.  *
  229.  * Revision 1.2  2003/08/27 20:04:29  kuznets
  230.  * Set the correct combination of open flags (CBDB_Env::OpenWithLocks)
  231.  *
  232.  * Revision 1.1  2003/08/27 15:04:25  kuznets
  233.  * Initial revision
  234.  *
  235.  *
  236.  * ===========================================================================
  237.  */