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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bdb_blobcache.hpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 18:36:54  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef BDB___BLOBCACHE__HPP
  10. #define BDB___BLOBCACHE__HPP
  11. /*  $Id: bdb_blobcache.hpp,v 1000.4 2004/06/01 18:36:54 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.  * Authors:  Anatoliy Kuznetsov
  37.  *
  38.  * File Description: BerkeleyDB based local BLOB cache. 
  39.  *
  40.  */
  41. /// @file bdb_blobcache.hpp
  42. /// ICache interface implementation on top of Berkeley DB
  43. #include <corelib/ncbiobj.hpp>
  44. #include <util/cache/icache.hpp>
  45. #include <bdb/bdb_file.hpp>
  46. #include <bdb/bdb_blob.hpp>
  47. #include <bdb/bdb_env.hpp>
  48. BEGIN_NCBI_SCOPE
  49. /** @addtogroup BDB_BLOB_Cache
  50.  *
  51.  * @{
  52.  */
  53. struct NCBI_BDB_EXPORT SCacheDB : public CBDB_BLobFile
  54. {
  55.     CBDB_FieldString       key;
  56.     CBDB_FieldInt4         version;
  57.     CBDB_FieldString       subkey;
  58.     SCacheDB()
  59.     {
  60.         BindKey("key",     &key, 256);
  61.         BindKey("version", &version);
  62.         BindKey("subkey",  &subkey, 256);
  63.     }
  64. };
  65. struct NCBI_BDB_EXPORT SCache_AttrDB : public CBDB_File
  66. {
  67.     CBDB_FieldString       key;
  68.     CBDB_FieldInt4         version;
  69.     CBDB_FieldString       subkey;
  70.     CBDB_FieldInt4         time_stamp;
  71.     CBDB_FieldInt4         overflow;
  72.     SCache_AttrDB()
  73.     {
  74.         BindKey("key",     &key, 256);
  75.         BindKey("version", &version);
  76.         BindKey("subkey",  &subkey, 256);
  77.         BindData("time_stamp", &time_stamp);
  78.         BindData("overflow",   &overflow);
  79.     }
  80. };
  81. class CPIDGuard;
  82. /// BDB cache implementation.
  83. ///
  84. /// Class implements ICache interface using local Berkeley DB
  85. /// database.
  86. class NCBI_BDB_EXPORT CBDB_Cache : public ICache
  87. {
  88. public:
  89.     CBDB_Cache();
  90.     virtual ~CBDB_Cache();
  91.     enum ELockMode 
  92.     {
  93.         eNoLock,     ///< Do not lock-protect cache instance
  94.         ePidLock     ///< Create PID lock on cache (exception if failed) 
  95.     };
  96.     /// Open local cache instance (read-write access)
  97.     /// If cache does not exists it is created.
  98.     ///
  99.     /// @param cache_path  Path to cache
  100.     /// @param cache_name  Cache instance name
  101.     /// @param lm          Locking mode, protection against using the 
  102.     ///                    cache from multiple applications
  103.     /// @param cache_size  Berkeley DB memory cache settings
  104.     void Open(const char*  cache_path, 
  105.               const char*  cache_name,
  106.               ELockMode    lm = eNoLock,
  107.               unsigned int cache_ram_size = 0);
  108.     void Close();
  109.     // ICache interface 
  110.     virtual void SetTimeStampPolicy(TTimeStampFlags policy, int timeout);
  111.     virtual TTimeStampFlags GetTimeStampPolicy() const;
  112.     virtual int GetTimeout();
  113.     virtual void SetVersionRetention(EKeepVersions policy);
  114.     virtual EKeepVersions GetVersionRetention() const;
  115.     virtual void Store(const string&  key,
  116.                        int            version,
  117.                        const string&  subkey,
  118.                        const void*    data,
  119.                        size_t         size);
  120.     virtual size_t GetSize(const string&  key,
  121.                            int            version,
  122.                            const string&  subkey);
  123.     virtual bool Read(const string& key, 
  124.                       int           version, 
  125.                       const string& subkey,
  126.                       void*         buf, 
  127.                       size_t        buf_size);
  128.     virtual IReader* GetReadStream(const string&  key, 
  129.                                    int            version,
  130.                                    const string&  subkey);
  131.     virtual IWriter* GetWriteStream(const string&    key,
  132.                                     int              version,
  133.                                     const string&    subkey);
  134.     virtual void Remove(const string& key);
  135.     virtual time_t GetAccessTime(const string&  key,
  136.                                  int            version,
  137.                                  const string&  subkey);
  138.     virtual void Purge(time_t           access_timeout,
  139.                        EKeepVersions    keep_last_version = eDropAll);
  140.     virtual void Purge(const string&    key,
  141.                        const string&    subkey,
  142.                        time_t           access_timeout,
  143.                        EKeepVersions    keep_last_version = eDropAll);
  144. private:
  145.     /// Return TRUE if cache item expired according to the current timestamp
  146.     bool x_CheckTimestampExpired();
  147.     void x_UpdateAccessTime(const string&  key,
  148.                             int            version,
  149.                             const string&  subkey);
  150.     void x_DropBlob(const char*    key,
  151.                     int            version,
  152.                     const char*    subkey,
  153.                     int            overflow);
  154.     void x_TruncateDB();
  155. private:
  156.     CBDB_Cache(const CBDB_Cache&);
  157.     CBDB_Cache& operator=(const CBDB_Cache);
  158. private:
  159.     string                  m_Path;       ///< Path to storage
  160.     string                  m_Name;       ///< Cache name
  161.     CPIDGuard*              m_PidGuard;   ///< Cache lock
  162.     CBDB_Env*               m_Env;          ///< Common environment for cache DBs
  163.     SCacheDB*               m_CacheDB;      ///< Cache BLOB storage
  164.     SCache_AttrDB*          m_CacheAttrDB;  ///< Cache attributes database
  165.     TTimeStampFlags         m_TimeStampFlag;///< Time stamp flag
  166.     int                     m_Timeout;      ///< Timeout expiration policy
  167.     EKeepVersions           m_VersionFlag;  ///< Version retention policy
  168. };
  169. extern NCBI_BDB_EXPORT const char* kBDBCacheDriverName;
  170. extern "C" 
  171. {
  172. void NCBI_BDB_EXPORT NCBI_BDB_ICacheEntryPoint(
  173.      CPluginManager<ICache>::TDriverInfoList&   info_list,
  174.      CPluginManager<ICache>::EEntryPointRequest method);
  175. } // extern C
  176. ///
  177. /// Class container for BDB cache objects.
  178. ///
  179. /// @internal
  180. class NCBI_BDB_EXPORT CBDB_CacheHolder : public CObject
  181. {
  182. public:
  183.     CBDB_CacheHolder(ICache* blob_cache, ICache* id_cache); 
  184.     ~CBDB_CacheHolder();
  185.     ICache* GetBlobCache() { return m_BlobCache; }
  186.     ICache* GetIdCache() { return m_IdCache; }
  187. private:
  188.     CBDB_CacheHolder(const CBDB_CacheHolder&);
  189.     CBDB_CacheHolder& operator=(const CBDB_CacheHolder&);
  190. private:
  191.     ICache*           m_BlobCache;
  192.     ICache*           m_IdCache;
  193. };
  194. /* @} */
  195. END_NCBI_SCOPE
  196. /*
  197.  * ===========================================================================
  198.  * $Log: bdb_blobcache.hpp,v $
  199.  * Revision 1000.4  2004/06/01 18:36:54  gouriano
  200.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  201.  *
  202.  * Revision 1.17  2004/05/24 18:02:49  kuznets
  203.  * CBDB_Cache::Open added parameter to specify RAM cache size
  204.  *
  205.  * Revision 1.16  2004/04/28 12:21:46  kuznets
  206.  * Cleaned up dead code
  207.  *
  208.  * Revision 1.15  2004/04/28 12:11:08  kuznets
  209.  * Replaced static string with char* (fix crash on Linux)
  210.  *
  211.  * Revision 1.14  2004/04/27 19:11:49  kuznets
  212.  * Commented old cache implementation
  213.  *
  214.  * Revision 1.13  2004/02/27 17:29:05  kuznets
  215.  * +CBDB_CacheHolder
  216.  *
  217.  * Revision 1.12  2004/01/13 16:37:27  vasilche
  218.  * Removed extra comma.
  219.  *
  220.  * Revision 1.11  2003/12/08 16:12:02  kuznets
  221.  * Added plugin mananger support
  222.  *
  223.  * Revision 1.10  2003/11/25 19:36:24  kuznets
  224.  * + ICache implementation
  225.  *
  226.  * Revision 1.9  2003/10/24 12:35:28  kuznets
  227.  * Added cache locking options.
  228.  *
  229.  * Revision 1.8  2003/10/21 11:56:41  kuznets
  230.  * Fixed bug with non-updated Int cache timestamp.
  231.  *
  232.  * Revision 1.7  2003/10/16 19:27:04  kuznets
  233.  * Added Int cache (AKA id resolution cache)
  234.  *
  235.  * Revision 1.6  2003/10/15 18:12:49  kuznets
  236.  * Implemented new cache architecture based on combination of BDB tables
  237.  * and plain files. Fixes the performance degradation in Berkeley DB
  238.  * when it has to work with a lot of overflow pages.
  239.  *
  240.  * Revision 1.5  2003/10/02 20:14:16  kuznets
  241.  * Minor code cleanup
  242.  *
  243.  * Revision 1.4  2003/10/01 20:49:41  kuznets
  244.  * Changed several function prototypes (were marked as pure virual)
  245.  *
  246.  * Revision 1.3  2003/09/29 15:46:18  kuznets
  247.  * Fixed warning (Sun WorkShop)
  248.  *
  249.  * Revision 1.2  2003/09/26 20:54:37  kuznets
  250.  * Documentaion change
  251.  *
  252.  * Revision 1.1  2003/09/24 14:29:42  kuznets
  253.  * Initial revision
  254.  *
  255.  *
  256.  * ===========================================================================
  257.  */
  258. #endif