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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_rid_cache.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:26:10  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: blast_rid_cache.cpp,v 1000.0 2004/06/01 21:26:10 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.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "blast_rid_cache.hpp"
  41. #include <corelib/ncbiapp.hpp>
  42. #include <corelib/ncbireg.hpp>
  43. #include <corelib/ncbi_process.hpp>
  44. #include <bdb/bdb_blobcache.hpp>
  45. #include <gui/utils/system_path.hpp>
  46. #include <connect/ncbi_conn_stream.hpp>
  47. #include <serial/serial.hpp>
  48. #include <serial/objostr.hpp>
  49. #include <serial/objistr.hpp>
  50. BEGIN_NCBI_SCOPE
  51. USING_SCOPE(objects);
  52. CBlastRidCache::CBlastRidCache()
  53. {
  54.     CNcbiApplication* app = CNcbiApplication::Instance();
  55.     _ASSERT(app);
  56.     const CNcbiRegistry& reg = app->GetConfig();
  57.     string cache_path = CSystemPath::ResolvePath("<home>", "cache.rid");
  58.     cache_path = reg.GetString("BLAST", "CachePath", cache_path,
  59.                                CNcbiRegistry::eErrPost);
  60.     m_Cache.reset(new CBDB_Cache());
  61.     try {
  62.         ICache::TTimeStampFlags flags = ICache::fTimeStampOnRead;
  63.         m_Cache->SetTimeStampPolicy(flags, 0);
  64.         m_Cache->Open(cache_path.c_str(), "blast-rid-cache",
  65.                       CBDB_Cache::ePidLock);
  66.     }
  67.     catch (CPIDGuardException& e) {
  68.         switch (e.GetErrCode())
  69.         {
  70.         case CPIDGuardException::eStillRunning:
  71.             LOG_POST(Error << "BLAST RID Cache: Another process is accessing "
  72.                 "the cache, access is disabled.");
  73.             break;
  74.         default:
  75.             LOG_POST(Error
  76.                 << "Error creating BLAST RID cache: " << e.GetMsg());
  77.             break;
  78.         }
  79.         m_Cache.reset();
  80.     }
  81.     catch (CException& e) {
  82.         LOG_POST(Error << "Error creating BLAST RID cache: " << e.GetMsg());
  83.         m_Cache.reset();
  84.     }
  85.     catch (...) {
  86.         LOG_POST(Error << "Unknown error creating BLAST RID cache");
  87.         m_Cache.reset();
  88.     }
  89. }
  90. void CBlastRidCache::AddRID(const string& rid, const CSeq_annot& annot)
  91. {
  92.     if ( !m_Cache.get() ) {
  93.         // caching disabled
  94.         return;
  95.     }
  96.     CConn_MemoryStream mem_str;
  97.     {{
  98.         auto_ptr<CObjectOStream> os
  99.             (CObjectOStream::Open(eSerial_AsnBinary, mem_str));
  100.         *os << annot;
  101.     }}
  102.     size_t size = mem_str.tellp() - CT_POS_TYPE(0);
  103.     string data;
  104.     data.resize(size);
  105.     mem_str.read(const_cast<char*>(data.data()), size);
  106.     m_Cache->Store(rid, 0, "", static_cast<const void*>(data.data()), size);
  107.     LOG_POST(Info << "Cached results for RID " << rid);
  108. }
  109. CSeq_annot* CBlastRidCache::GetRID(const string& rid)
  110. {
  111.     if ( !m_Cache.get() ) {
  112.         // caching disabled
  113.         return NULL;
  114.     }
  115.     try {
  116.         size_t size = m_Cache->GetSize(rid, 0, "");
  117.         if (size == 0) {
  118.             return NULL;
  119.         }
  120.         string data;
  121.         data.resize(size);
  122.         m_Cache->Read(rid, 0, "",
  123.                       static_cast<void*>(const_cast<char*>(data.data())),
  124.                       size);
  125.         CNcbiIstrstream istr(data.data(), size);
  126.         auto_ptr<CObjectIStream> is
  127.             (CObjectIStream::Open(eSerial_AsnBinary, istr));
  128.         CRef<CSeq_annot> annot(new CSeq_annot());
  129.         *is >> *annot;
  130.         LOG_POST(Info << "Retrieved cached results for RID " << rid);
  131.         return annot.Release();
  132.     }
  133.     catch (CException& e) {
  134.         LOG_POST(Error << "failed to retrieve RID " << rid
  135.             << " from cache: " << e.GetMsg());
  136.         return NULL;
  137.     }
  138.     catch (...) {
  139.         LOG_POST(Error << "failed to retrieve RID " << rid
  140.             << " from cache: unknown error");
  141.         return NULL;
  142.     }
  143. }
  144. END_NCBI_SCOPE
  145. /*
  146.  * ===========================================================================
  147.  * $Log: blast_rid_cache.cpp,v $
  148.  * Revision 1000.0  2004/06/01 21:26:10  gouriano
  149.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.3
  150.  *
  151.  * Revision 1.3  2004/05/21 22:27:46  gorelenk
  152.  * Added PCH ncbi_pch.hpp
  153.  *
  154.  * Revision 1.2  2004/04/23 21:37:23  ucko
  155.  * Cope with strict definitions of CT_POS_TYPE.
  156.  *
  157.  * Revision 1.1  2004/04/22 12:22:36  dicuccio
  158.  * Initial revision
  159.  *
  160.  * ===========================================================================
  161.  */