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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: reader_pubseq.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:42:05  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.52
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: reader_pubseq.cpp,v 1000.1 2004/06/01 19:42:05 gouriano Exp $
  10. * ===========================================================================
  11. *                            PUBLIC DOMAIN NOTICE
  12. *               National Center for Biotechnology Information
  13. *
  14. *  This software/database is a "United States Government Work" under the
  15. *  terms of the United States Copyright Act.  It was written as part of
  16. *  the author's official duties as a United States Government employee and
  17. *  thus cannot be copyrighted.  This software/database is freely available
  18. *  to the public for use. The National Library of Medicine and the U.S.
  19. *  Government have not placed any restriction on its use or reproduction.
  20. *
  21. *  Although all reasonable efforts have been taken to ensure the accuracy
  22. *  and reliability of the software and data, the NLM and the U.S.
  23. *  Government do not and cannot warrant the performance or results that
  24. *  may be obtained by using this software or data. The NLM and the U.S.
  25. *  Government disclaim all warranties, express or implied, including
  26. *  warranties of performance, merchantability or fitness for any particular
  27. *  purpose.
  28. *
  29. *  Please cite the author in any work or product based on this material.
  30. * ===========================================================================
  31. *
  32. *  Author:  Anton Butanaev, Eugene Vasilchenko
  33. *
  34. *  File Description: Data reader from Pubseq_OS
  35. *
  36. */
  37. #include <ncbi_pch.hpp>
  38. #include <objtools/data_loaders/genbank/readers/pubseqos/reader_pubseq.hpp>
  39. #include <objtools/data_loaders/genbank/readers/pubseqos/seqref_pubseq.hpp>
  40. #include <objtools/data_loaders/genbank/reader_snp.hpp>
  41. #include <objmgr/objmgr_exception.hpp>
  42. #include <objmgr/impl/tse_info.hpp>
  43. #include <dbapi/driver/exception.hpp>
  44. #include <dbapi/driver/driver_mgr.hpp>
  45. #include <dbapi/driver/drivers.hpp>
  46. #include <objects/seqloc/Seq_id.hpp>
  47. #include <objects/seqset/Seq_entry.hpp>
  48. #include <objects/seqset/Bioseq_set.hpp>
  49. #include <objects/seq/Seq_annot.hpp>
  50. #include <corelib/ncbicntr.hpp>
  51. #include <corelib/plugin_manager_impl.hpp>
  52. #include <serial/objostrasn.hpp>
  53. #include <util/compress/reader_zlib.hpp>
  54. #include <memory>
  55. BEGIN_NCBI_SCOPE
  56. BEGIN_SCOPE(objects)
  57. #if !defined(HAVE_SYBASE_REENTRANT) && defined(NCBI_THREADS)
  58. // we have non MT-safe library used in MT application
  59. static CAtomicCounter s_pubseq_readers;
  60. #endif
  61. CPubseqReader::CPubseqReader(TConn noConn,
  62.                              const string& server,
  63.                              const string& user,
  64.                              const string& pswd)
  65.     : m_Server(server) , m_User(user), m_Password(pswd), m_Context(NULL),
  66.       m_NoMoreConnections(false)
  67. {
  68.     noConn=1; // limit number of simultaneous connections to one
  69. #if !defined(HAVE_SYBASE_REENTRANT)
  70.     noConn=1;
  71. #endif
  72. #if defined(NCBI_THREADS) && !defined(HAVE_SYBASE_REENTRANT)
  73.     if ( s_pubseq_readers.Add(1) > 1 ) {
  74.         s_pubseq_readers.Add(-1);
  75.         NCBI_THROW(CLoaderException, eNoConnection,
  76.                    "Attempt to open multiple pubseq_readers "
  77.                    "without MT-safe DB library");
  78.     }
  79. #endif
  80.     try {
  81.         SetParallelLevel(noConn);
  82.     }
  83.     catch ( ... ) {
  84.         SetParallelLevel(0);
  85.         throw;
  86.     }
  87. }
  88. CPubseqReader::~CPubseqReader()
  89. {
  90.     SetParallelLevel(0);
  91. #if !defined(HAVE_SYBASE_REENTRANT) && defined(NCBI_THREADS)
  92.     s_pubseq_readers.Add(-1);
  93. #endif
  94. }
  95. CReader::TConn CPubseqReader::GetParallelLevel(void) const
  96. {
  97.     return m_Pool.size();
  98. }
  99. void CPubseqReader::SetParallelLevel(TConn size)
  100. {
  101.     size_t oldSize = m_Pool.size();
  102.     for(size_t i = size; i < oldSize; ++i) {
  103.         delete m_Pool[i];
  104.         m_Pool[i] = 0;
  105.     }
  106.     m_Pool.resize(size);
  107.     for(size_t i = oldSize; i < min(1u, size); ++i) {
  108.         m_Pool[i] = x_NewConnection();
  109.     }
  110. }
  111. CDB_Connection* CPubseqReader::x_GetConnection(TConn conn)
  112. {
  113.     conn = conn % m_Pool.size();
  114.     CDB_Connection* ret = m_Pool[conn];
  115.     if ( !ret ) {
  116.         ret = x_NewConnection();
  117.         if ( !ret ) {
  118.             NCBI_THROW(CLoaderException, eNoConnection,
  119.                        "too many connections failed: probably server is dead");
  120.         }
  121.         m_Pool[conn] = ret;
  122.     }
  123.     return ret;
  124. }
  125. void CPubseqReader::Reconnect(TConn conn)
  126. {
  127.     LOG_POST("Reconnect");
  128.     conn = conn % m_Pool.size();
  129.     delete m_Pool[conn];
  130.     m_Pool[conn] = 0;
  131. }
  132. CDB_Connection *CPubseqReader::x_NewConnection(void)
  133. {
  134.     for ( int i = 0; !m_NoMoreConnections && i < 3; ++i ) {
  135.         if ( m_Context.get() == NULL ) {
  136.             C_DriverMgr drvMgr;
  137.             //DBAPI_RegisterDriver_CTLIB(drvMgr);
  138.             //DBAPI_RegisterDriver_DBLIB(drvMgr);
  139.             string errmsg;
  140.             FDBAPI_CreateContext createContextFunc =
  141.                 drvMgr.GetDriver("ctlib",&errmsg);
  142.             if ( !createContextFunc ) {
  143.                 LOG_POST(errmsg);
  144. #if defined(HAVE_SYBASE_REENTRANT) && defined(NCBI_THREADS)
  145.                 m_NoMoreConnections = true;
  146.                 NCBI_THROW(CLoaderException, eNoConnection,
  147.                            "Neither ctlib nor dblib are available");
  148. #else
  149.                 createContextFunc = drvMgr.GetDriver("dblib",&errmsg);
  150.                 if ( !createContextFunc ) {
  151.                     LOG_POST(errmsg);
  152.                     m_NoMoreConnections = true;
  153.                     NCBI_THROW(CLoaderException, eNoConnection,
  154.                                "Neither ctlib nor dblib are available");
  155.                 }
  156. #endif
  157.             }
  158.             map<string,string> args;
  159.             args["packet"]="3584"; // 7*512
  160.             m_Context.reset((*createContextFunc)(&args));
  161.             //m_Context.reset((*createContextFunc)(0));
  162.         }
  163.         try {
  164.             auto_ptr<CDB_Connection> conn(m_Context->Connect(m_Server,
  165.                                                              m_User,
  166.                                                              m_Password,
  167.                                                              0));
  168.             if ( conn.get() ) {
  169.                 auto_ptr<CDB_LangCmd> cmd(conn->LangCmd("set blob_stream on"));
  170.                 if ( cmd.get() ) {
  171.                     cmd->Send();
  172.                 }
  173.             }
  174.             return conn.release();
  175.         }
  176.         catch ( CException& exc ) {
  177.             ERR_POST("CPubseqReader::x_NewConnection: "
  178.                      "cannot connect: " << exc.what());
  179.         }
  180.     }
  181.     m_NoMoreConnections = true;
  182.     return 0;
  183. }
  184. int CPubseqReader::ResolveSeq_id_to_gi(const CSeq_id& seqId, TConn conn)
  185. {
  186.     // note: this was
  187.     //CDB_VarChar asnIn(static_cast<string>(CNcbiOstrstreamToString(oss)));
  188.     // but MSVC doesn't like this.  This is the only version that
  189.     // will compile:
  190.     CDB_VarChar asnIn;
  191.     {{
  192.         CNcbiOstrstream oss;
  193.         {{
  194.             CObjectOStreamAsn ooss(oss);
  195.             ooss << seqId;
  196.         }}
  197.         asnIn = CNcbiOstrstreamToString(oss);
  198.     }}
  199.     
  200.     CDB_Connection* db_conn = x_GetConnection(conn);
  201.     auto_ptr<CDB_RPCCmd> cmd(db_conn->RPC("id_gi_by_seqid_asn", 1));
  202.     cmd->SetParam("@asnin", &asnIn);
  203.     cmd->Send();
  204.     while(cmd->HasMoreResults()) {
  205.         auto_ptr<CDB_Result> result(cmd->Result());
  206.         if (result.get() == 0  ||  result->ResultType() != eDB_RowResult)
  207.             continue;
  208.             
  209.         while(result->Fetch()) {
  210.             for(unsigned pos = 0; pos < result->NofItems(); ++pos) {
  211.                 const string& name = result->ItemName(pos);
  212.                 if (name == "gi") {
  213.                     CDB_Int giFound;
  214.                     result->GetItem(&giFound);
  215.                     return giFound.Value();
  216.                 }
  217.                 else {
  218.                     result->SkipItem();
  219.                 }
  220.             }
  221.         }
  222.     }
  223.     return 0;
  224. }
  225. void CPubseqReader::ResolveSeq_id(TSeqrefs& srs, const CSeq_id& id, TConn conn)
  226. {
  227.     _TRACE("ResolveSeq_id: " << id.AsFastaString());
  228.     // note: this was
  229.     //CDB_VarChar asnIn(static_cast<string>(CNcbiOstrstreamToString(oss)));
  230.     // but MSVC doesn't like this.  This is the only version that
  231.     // will compile:
  232.     CDB_VarChar asnIn;
  233.     {{
  234.         CNcbiOstrstream oss;
  235.         {{
  236.             CObjectOStreamAsn ooss(oss);
  237.             ooss << id;
  238.         }}
  239.         asnIn = CNcbiOstrstreamToString(oss);
  240.     }}
  241.     CDB_Connection* db_conn = x_GetConnection(conn);
  242.     auto_ptr<CDB_RPCCmd> cmd(db_conn->RPC("id_gi_by_seqid_asn", 1));
  243.     cmd->SetParam("@asnin", &asnIn);
  244.     cmd->Send();
  245.     x_RetrieveSeqrefs(srs, *cmd, 0);
  246. }
  247. void CPubseqReader::RetrieveSeqrefs(TSeqrefs& srs, int gi, TConn conn)
  248. {
  249.     _TRACE("RetrieveSeqrefs: " << gi);
  250.     CDB_Int giIn(gi);
  251.     CDB_Connection* db_conn = x_GetConnection(conn);
  252.     auto_ptr<CDB_RPCCmd> cmd(db_conn->RPC("id_gi_class", 1));
  253.     cmd->SetParam("@gi", &giIn);
  254.     cmd->Send();
  255.     x_RetrieveSeqrefs(srs, *cmd, gi);
  256. }
  257. void CPubseqReader::x_RetrieveSeqrefs(TSeqrefs& srs, CDB_RPCCmd& cmd, int gi)
  258. {
  259.     while(cmd.HasMoreResults()) {
  260.         auto_ptr<CDB_Result> result(cmd.Result());
  261.         if (result.get() == 0  ||  result->ResultType() != eDB_RowResult)
  262.             continue;
  263.             
  264.         while(result->Fetch()) {
  265.             CDB_Int giGot(gi);
  266.             CDB_Int sat;
  267.             CDB_Int satKey;
  268.             CDB_Int extFeat;
  269.             
  270.             _TRACE("next fetch: " << result->NofItems() << " items");
  271.             for ( unsigned pos = 0; pos < result->NofItems(); ++pos ) {
  272.                 const string& name = result->ItemName(pos);
  273.                 _TRACE("next item: " << name);
  274.                 if (name == "gi") {
  275.                     result->GetItem(&giGot);
  276.                     _TRACE("gi: "<<giGot.Value());
  277.                 }
  278.                 else if (name == "sat" ) {
  279.                     result->GetItem(&sat);
  280.                     _TRACE("sat: "<<sat.Value());
  281.                 }
  282.                 else if(name == "sat_key") {
  283.                     result->GetItem(&satKey);
  284.                     _TRACE("sat_key: "<<satKey.Value());
  285.                 }
  286.                 else if(name == "extra_feat" || name == "ext_feat") {
  287.                     result->GetItem(&extFeat);
  288. #ifdef _DEBUG
  289.                     if ( extFeat.IsNULL() ) {
  290.                         _TRACE("ext_feat = NULL");
  291.                     }
  292.                     else {
  293.                         _TRACE("ext_feat = "<<extFeat.Value());
  294.                     }
  295. #endif
  296.                 }
  297.                 else {
  298.                     result->SkipItem();
  299.                 }
  300.             }
  301.             _ASSERT(sat.Value() != eSatellite_SNP);
  302.             srs.push_back(Ref(new CSeqref(giGot.Value(),
  303.                                           sat.Value(), satKey.Value())));
  304.             if ( TrySNPSplit() ) {
  305.                 if ( extFeat.IsNULL() ) {
  306.                     AddSNPSeqref(srs, giGot.Value(), CSeqref::fPossible);
  307.                 }
  308.                 else if ( extFeat.Value() & 1 ) {
  309.                     AddSNPSeqref(srs, giGot.Value());
  310.                 }
  311.             }
  312.         }
  313.     }
  314. }
  315. CRef<CTSE_Info> CPubseqReader::GetTSEBlob(const CSeqref& seqref, TConn conn)
  316. {
  317.     CDB_Connection* db_conn = x_GetConnection(conn);
  318.     auto_ptr<CDB_RPCCmd> cmd(x_SendRequest(seqref, db_conn, false));
  319.     auto_ptr<CDB_Result> result(x_ReceiveData(*cmd));
  320.     return x_ReceiveMainBlob(*result);
  321. }
  322. CRef<CSeq_annot_SNP_Info> CPubseqReader::GetSNPAnnot(const CSeqref& seqref,
  323.                                                      TConn conn)
  324. {
  325.     CDB_Connection* db_conn = x_GetConnection(conn);
  326.     auto_ptr<CDB_RPCCmd> cmd(x_SendRequest(seqref, db_conn, true));
  327.     auto_ptr<CDB_Result> result(x_ReceiveData(*cmd));
  328.     return x_ReceiveSNPAnnot(*result);
  329. }
  330. CDB_RPCCmd* CPubseqReader::x_SendRequest(const CSeqref& seqref,
  331.                                          CDB_Connection* db_conn,
  332.                                          bool is_snp)
  333. {
  334.     auto_ptr<CDB_RPCCmd> cmd(db_conn->RPC("id_get_asn", 4));
  335.     CDB_Int giIn(seqref.GetGi());
  336.     CDB_SmallInt satIn(seqref.GetSat());
  337.     CDB_Int satKeyIn(seqref.GetSatKey());
  338.     bool is_external = is_snp;
  339.     bool load_external = is_external || !TrySNPSplit();
  340.     CDB_Int ext_feat(load_external);
  341.     _TRACE("x_SendRequest: "<<seqref.print()<<", ext_feat="<<load_external);
  342.     cmd->SetParam("@gi", &giIn);
  343.     cmd->SetParam("@sat_key", &satKeyIn);
  344.     cmd->SetParam("@sat", &satIn);
  345.     cmd->SetParam("@ext_feat", &ext_feat);
  346.     cmd->Send();
  347.     return cmd.release();
  348. }
  349. CDB_Result* CPubseqReader::x_ReceiveData(CDB_RPCCmd& cmd)
  350. {
  351.     // new row
  352.     CDB_VarChar descrOut("-");
  353.     CDB_Int classOut(0);
  354.     CDB_Int confidential(0),withdrawn(0);
  355.     
  356.     while( cmd.HasMoreResults() ) {
  357.         _TRACE("next result");
  358.         if ( cmd.HasFailed() && confidential.Value()>0 ||
  359.              withdrawn.Value()>0 ) {
  360.             break;
  361.         }
  362.         
  363.         auto_ptr<CDB_Result> result(cmd.Result());
  364.         if ( !result.get() || result->ResultType() != eDB_RowResult ) {
  365.             continue;
  366.         }
  367.         
  368.         while ( result->Fetch() ) {
  369.             _TRACE("next fetch: " << result->NofItems() << " items");
  370.             for ( unsigned pos = 0; pos < result->NofItems(); ++pos ) {
  371.                 const string& name = result->ItemName(pos);
  372.                 _TRACE("next item: " << name);
  373.                 if ( name == "asn1" ) {
  374.                     return result.release();
  375.                 }
  376.                 else if ( name == "confidential" ) {
  377.                     result->GetItem(&confidential);
  378.                 }
  379.                 else if ( name == "override" ) {
  380.                     result->GetItem(&withdrawn);
  381.                 }
  382.                 else {
  383.                     result->SkipItem();
  384.                 }
  385.             }
  386.         }
  387.     }
  388.     if ( confidential.Value()>0 || withdrawn.Value()>0 ) {
  389.         NCBI_THROW(CLoaderException, ePrivateData, "gi is private");
  390.     }
  391.     NCBI_THROW(CLoaderException, eNoData, "no data");
  392. }
  393. CRef<CTSE_Info> CPubseqReader::x_ReceiveMainBlob(CDB_Result& result)
  394. {
  395.     CRef<CSeq_entry> seq_entry(new CSeq_entry);
  396.     CResultBtSrcRdr reader(&result);
  397.     CObjectIStreamAsnBinary in(reader);
  398.     
  399.     CReader::SetSeqEntryReadHooks(in);
  400.     in >> *seq_entry;
  401.     return Ref(new CTSE_Info(*seq_entry));
  402. }
  403. CRef<CSeq_annot_SNP_Info> CPubseqReader::x_ReceiveSNPAnnot(CDB_Result& result)
  404. {
  405.     CRef<CSeq_annot_SNP_Info> snp_annot_info(new CSeq_annot_SNP_Info);
  406.     
  407.     {{
  408.         CResultBtSrcRdr src(&result);
  409.         CNlmZipBtRdr src2(&src);
  410.         
  411.         CObjectIStreamAsnBinary in(src2);
  412.         
  413.         CSeq_annot_SNP_Info_Reader::Parse(in, *snp_annot_info);
  414.     }}
  415.     
  416.     return snp_annot_info;
  417. }
  418. CResultBtSrcRdr::CResultBtSrcRdr(CDB_Result* result)
  419.     : m_Result(result)
  420. {
  421. }
  422. CResultBtSrcRdr::~CResultBtSrcRdr()
  423. {
  424. }
  425. size_t CResultBtSrcRdr::Read(char* buffer, size_t bufferLength)
  426. {
  427.     size_t ret;
  428.     while ( (ret = m_Result->ReadItem(buffer, bufferLength)) == 0 ) {
  429.         if ( !m_Result->Fetch() )
  430.             break;
  431.     }
  432.     return ret;
  433. }
  434. END_SCOPE(objects)
  435. const string kPubseqReaderDriverName("pubseq_reader");
  436. /// Class factory for Pubseq reader
  437. ///
  438. /// @internal
  439. ///
  440. class CPubseqReaderCF : 
  441.     public CSimpleClassFactoryImpl<objects::CReader, objects::CPubseqReader>
  442. {
  443. public:
  444.     typedef CSimpleClassFactoryImpl<objects::CReader, 
  445.                                     objects::CPubseqReader> TParent;
  446. public:
  447.     CPubseqReaderCF() : TParent(kPubseqReaderDriverName, 0)
  448.     {
  449.     }
  450.     ~CPubseqReaderCF()
  451.     {
  452.     }
  453. };
  454. void NCBI_EntryPoint_ReaderPubseqos(
  455.      CPluginManager<objects::CReader>::TDriverInfoList&   info_list,
  456.      CPluginManager<objects::CReader>::EEntryPointRequest method)
  457. {
  458.     CHostEntryPointImpl<CPubseqReaderCF>::NCBI_EntryPointImpl(info_list, method);
  459. }
  460. END_NCBI_SCOPE
  461. /*
  462. * $Log: reader_pubseq.cpp,v $
  463. * Revision 1000.1  2004/06/01 19:42:05  gouriano
  464. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.52
  465. *
  466. * Revision 1.52  2004/05/21 21:42:52  gorelenk
  467. * Added PCH ncbi_pch.hpp
  468. *
  469. * Revision 1.51  2004/02/18 14:01:26  dicuccio
  470. * Added new satellites for TRACE_ASSM, TR_ASSM_CH.  Added support for overloading
  471. * the ID1 named service
  472. *
  473. * Revision 1.50  2004/02/04 17:47:42  kuznets
  474. * Fixed naming of entry points
  475. *
  476. * Revision 1.49  2004/01/22 20:10:38  vasilche
  477. * 1. Splitted ID2 specs to two parts.
  478. * ID2 now specifies only protocol.
  479. * Specification of ID2 split data is moved to seqsplit ASN module.
  480. * For now they are still reside in one resulting library as before - libid2.
  481. * As the result split specific headers are now in objects/seqsplit.
  482. * 2. Moved ID2 and ID1 specific code out of object manager.
  483. * Protocol is processed by corresponding readers.
  484. * ID2 split parsing is processed by ncbi_xreader library - used by all readers.
  485. * 3. Updated OBJMGR_LIBS correspondingly.
  486. *
  487. * Revision 1.48  2004/01/20 16:55:28  vasilche
  488. * Do more common check first.
  489. *
  490. * Revision 1.47  2004/01/13 21:54:50  vasilche
  491. * Requrrected new version
  492. *
  493. * Revision 1.4  2004/01/13 16:55:57  vasilche
  494. * CReader, CSeqref and some more classes moved from xobjmgr to separate lib.
  495. * Headers moved from include/objmgr to include/objtools/data_loaders/genbank.
  496. *
  497. * Revision 1.3  2003/12/30 22:14:43  vasilche
  498. * Updated genbank loader and readers plugins.
  499. *
  500. * Revision 1.45  2003/12/19 19:47:45  vasilche
  501. * Added support for TRACE data, Seq-id ::= general { db "ti", tag id NNN }.
  502. *
  503. * Revision 1.44  2003/12/03 16:15:29  ucko
  504. * Correct spelling of NCBI_Pubseq_ReaderEntryPoint.
  505. *
  506. * Revision 1.43  2003/12/03 14:30:03  kuznets
  507. * Code clean up.
  508. * Made use of driver name constant instead of immediate in-place string.
  509. *
  510. * Revision 1.42  2003/12/02 16:18:17  kuznets
  511. * Added plugin manager support for CReader interface and implementaions
  512. * (id1 reader, pubseq reader)
  513. *
  514. * Revision 1.41  2003/11/26 17:55:59  vasilche
  515. * Implemented ID2 split in ID1 cache.
  516. * Fixed loading of splitted annotations.
  517. *
  518. * Revision 1.40  2003/11/04 14:43:26  vasilche
  519. * Load SNP only when bit 1 in ext_feat is set.
  520. *
  521. * Revision 1.39  2003/10/22 16:12:38  vasilche
  522. * Added CLoaderException::eNoConnection.
  523. * Added check for 'fail' state of ID1 connection stream.
  524. * CLoaderException::eNoConnection will be rethrown from CGBLoader.
  525. *
  526. * Revision 1.38  2003/10/21 14:27:35  vasilche
  527. * Added caching of gi -> sat,satkey,version resolution.
  528. * SNP blobs are stored in cache in preprocessed format (platform dependent).
  529. * Limit number of connections to GenBank servers.
  530. * Added collection of ID1 loader statistics.
  531. *
  532. * Revision 1.37  2003/10/14 21:06:25  vasilche
  533. * Fixed compression statistics.
  534. * Disabled caching of SNP blobs.
  535. *
  536. * Revision 1.36  2003/09/30 16:22:02  vasilche
  537. * Updated internal object manager classes to be able to load ID2 data.
  538. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  539. * Scope caches results of requests for data to data loaders.
  540. * Optimized CSeq_id_Handle for gis.
  541. * Optimized bioseq lookup in scope.
  542. * Reduced object allocations in annotation iterators.
  543. * CScope is allowed to be destroyed before other objects using this scope are
  544. * deleted (feature iterators, bioseq handles etc).
  545. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  546. * Added 'adaptive' option to objmgr_demo application.
  547. *
  548. * Revision 1.35  2003/08/27 14:25:22  vasilche
  549. * Simplified CCmpTSE class.
  550. *
  551. * Revision 1.34  2003/08/14 20:05:19  vasilche
  552. * Simple SNP features are stored as table internally.
  553. * They are recreated when needed using CFeat_CI.
  554. *
  555. * Revision 1.33  2003/07/24 20:35:16  vasilche
  556. * Fix includes.
  557. *
  558. * Revision 1.32  2003/07/24 19:28:09  vasilche
  559. * Implemented SNP split for ID1 loader.
  560. *
  561. * Revision 1.31  2003/07/18 20:27:54  vasilche
  562. * Check if reference counting is working before trying ot use it.
  563. *
  564. * Revision 1.30  2003/07/17 22:23:27  vasilche
  565. * Fixed unsigned <-> size_t argument.
  566. *
  567. * Revision 1.29  2003/07/17 20:07:56  vasilche
  568. * Reduced memory usage by feature indexes.
  569. * SNP data is loaded separately through PUBSEQ_OS.
  570. * String compression for SNP data.
  571. *
  572. * Revision 1.28  2003/06/02 16:06:38  dicuccio
  573. * Rearranged src/objects/ subtree.  This includes the following shifts:
  574. *     - src/objects/asn2asn --> arc/app/asn2asn
  575. *     - src/objects/testmedline --> src/objects/ncbimime/test
  576. *     - src/objects/objmgr --> src/objmgr
  577. *     - src/objects/util --> src/objmgr/util
  578. *     - src/objects/alnmgr --> src/objtools/alnmgr
  579. *     - src/objects/flat --> src/objtools/flat
  580. *     - src/objects/validator --> src/objtools/validator
  581. *     - src/objects/cddalignview --> src/objtools/cddalignview
  582. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  583. * replaces the three libmmdb? libs.
  584. *
  585. * Revision 1.27  2003/05/13 20:14:40  vasilche
  586. * Catching exceptions and reconnection were moved from readers to genbank loader.
  587. *
  588. * Revision 1.26  2003/04/24 16:12:38  vasilche
  589. * Object manager internal structures are splitted more straightforward.
  590. * Removed excessive header dependencies.
  591. *
  592. * Revision 1.25  2003/04/15 16:33:29  dicuccio
  593. * Minor logic reorganization to appease MSVC - wasn't dealing well with a verbose
  594. * cast
  595. *
  596. * Revision 1.24  2003/04/15 15:30:15  vasilche
  597. * Added include <memory> when needed.
  598. * Removed buggy buffer in printing methods.
  599. * Removed unnecessary include of stream_util.hpp.
  600. *
  601. * Revision 1.23  2003/04/15 14:24:08  vasilche
  602. * Changed CReader interface to not to use fake streams.
  603. *
  604. * Revision 1.22  2003/04/02 03:57:09  kimelman
  605. * packet size tuning
  606. *
  607. * Revision 1.21  2003/03/03 20:34:51  vasilche
  608. * Added NCBI_THREADS macro - it's opposite to NCBI_NO_THREADS.
  609. * Avoid using _REENTRANT macro - use NCBI_THREADS instead.
  610. *
  611. * Revision 1.20  2003/03/01 22:26:56  kimelman
  612. * performance fixes
  613. *
  614. * Revision 1.19  2003/01/18 08:42:25  kimelman
  615. * 1.added SNP retrieval per M.DiCuccio request; 2.avoid gi relookup
  616. *
  617. * Revision 1.18  2002/12/30 23:36:22  vakatov
  618. * CPubseqStreamBuf::underflow() -- strstream::freeze(false) to avoid mem.leak
  619. *
  620. * Revision 1.17  2002/12/26 20:53:41  dicuccio
  621. * Minor tweaks to relieve compiler warnings in MSVC
  622. *
  623. * Revision 1.16  2002/09/19 20:05:44  vasilche
  624. * Safe initialization of static mutexes
  625. *
  626. * Revision 1.15  2002/07/22 22:55:55  kimelman
  627. * bugfixes: a) null termination added for text seqid strstream.
  628. *           b) processing of failed request.
  629. *
  630. * Revision 1.14  2002/07/10 16:49:59  grichenk
  631. * Removed CRef<CSeq_entry>, use pointer instead
  632. *
  633. * Revision 1.13  2002/06/04 17:18:33  kimelman
  634. * memory cleanup :  new/delete/Cref rearrangements
  635. *
  636. * Revision 1.12  2002/05/09 21:40:59  kimelman
  637. * MT tuning
  638. *
  639. * Revision 1.11  2002/05/06 03:28:47  vakatov
  640. * OM/OM1 renaming
  641. *
  642. * Revision 1.10  2002/05/03 21:28:10  ucko
  643. * Introduce T(Signed)SeqPos.
  644. *
  645. * Revision 1.9  2002/04/25 20:54:07  kimelman
  646. * noise off
  647. *
  648. * Revision 1.8  2002/04/12 22:56:23  kimelman
  649. * processing of ctlib fail
  650. *
  651. * Revision 1.7  2002/04/12 14:52:34  butanaev
  652. * Typos fixed, code cleanup.
  653. *
  654. * Revision 1.6  2002/04/11 20:03:26  kimelman
  655. * switch to pubseq
  656. *
  657. * Revision 1.5  2002/04/11 17:59:36  butanaev
  658. * Typo fixed.
  659. *
  660. * Revision 1.4  2002/04/11 17:47:17  butanaev
  661. * Switched to using dbapi driver manager.
  662. *
  663. * Revision 1.3  2002/04/10 22:47:56  kimelman
  664. * added pubseq_reader as default one
  665. *
  666. * Revision 1.2  2002/04/09 16:10:57  ucko
  667. * Split CStrStreamBuf out into a common location.
  668. *
  669. * Revision 1.1  2002/04/08 20:52:27  butanaev
  670. * Added PUBSEQ reader.
  671. *
  672. * Revision 1.8  2002/04/03 18:37:33  butanaev
  673. * Replaced DBLink with dbapi.
  674. *
  675. * Revision 1.7  2002/01/10 16:24:26  butanaev
  676. * Fixed possible memory leaks.
  677. *
  678. * Revision 1.6  2001/12/21 15:01:49  butanaev
  679. * Removed debug code, bug fixes.
  680. *
  681. * Revision 1.5  2001/12/19 19:42:13  butanaev
  682. * Implemented construction of PUBSEQ blob stream, CPubseqReader family  interfaces.
  683. *
  684. * Revision 1.4  2001/12/14 20:48:07  butanaev
  685. * Implemented fetching Seqrefs from PUBSEQ.
  686. *
  687. * Revision 1.3  2001/12/13 17:50:34  butanaev
  688. * Adjusted for new interface changes.
  689. *
  690. * Revision 1.2  2001/12/12 22:08:58  butanaev
  691. * Removed duplicate code, created frame for CPubseq* implementation.
  692. *
  693. */