reader_pubseq.cpp
来自「ncbi源码」· C++ 代码 · 共 772 行 · 第 1/2 页
CPP
772 行
/* * =========================================================================== * PRODUCTION $Log: reader_pubseq.cpp,v $ * PRODUCTION Revision 1000.1 2004/06/01 19:42:05 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.52 * PRODUCTION * =========================================================================== *//* $Id: reader_pubseq.cpp,v 1000.1 2004/06/01 19:42:05 gouriano Exp $* ===========================================================================* PUBLIC DOMAIN NOTICE* National Center for Biotechnology Information** This software/database is a "United States Government Work" under the* terms of the United States Copyright Act. It was written as part of* the author's official duties as a United States Government employee and* thus cannot be copyrighted. This software/database is freely available* to the public for use. The National Library of Medicine and the U.S.* Government have not placed any restriction on its use or reproduction.** Although all reasonable efforts have been taken to ensure the accuracy* and reliability of the software and data, the NLM and the U.S.* Government do not and cannot warrant the performance or results that* may be obtained by using this software or data. The NLM and the U.S.* Government disclaim all warranties, express or implied, including* warranties of performance, merchantability or fitness for any particular* purpose.** Please cite the author in any work or product based on this material.* ===========================================================================** Author: Anton Butanaev, Eugene Vasilchenko** File Description: Data reader from Pubseq_OS**/#include <ncbi_pch.hpp>#include <objtools/data_loaders/genbank/readers/pubseqos/reader_pubseq.hpp>#include <objtools/data_loaders/genbank/readers/pubseqos/seqref_pubseq.hpp>#include <objtools/data_loaders/genbank/reader_snp.hpp>#include <objmgr/objmgr_exception.hpp>#include <objmgr/impl/tse_info.hpp>#include <dbapi/driver/exception.hpp>#include <dbapi/driver/driver_mgr.hpp>#include <dbapi/driver/drivers.hpp>#include <objects/seqloc/Seq_id.hpp>#include <objects/seqset/Seq_entry.hpp>#include <objects/seqset/Bioseq_set.hpp>#include <objects/seq/Seq_annot.hpp>#include <corelib/ncbicntr.hpp>#include <corelib/plugin_manager_impl.hpp>#include <serial/objostrasn.hpp>#include <util/compress/reader_zlib.hpp>#include <memory>BEGIN_NCBI_SCOPEBEGIN_SCOPE(objects)#if !defined(HAVE_SYBASE_REENTRANT) && defined(NCBI_THREADS)// we have non MT-safe library used in MT applicationstatic CAtomicCounter s_pubseq_readers;#endifCPubseqReader::CPubseqReader(TConn noConn, const string& server, const string& user, const string& pswd) : m_Server(server) , m_User(user), m_Password(pswd), m_Context(NULL), m_NoMoreConnections(false){ noConn=1; // limit number of simultaneous connections to one#if !defined(HAVE_SYBASE_REENTRANT) noConn=1;#endif#if defined(NCBI_THREADS) && !defined(HAVE_SYBASE_REENTRANT) if ( s_pubseq_readers.Add(1) > 1 ) { s_pubseq_readers.Add(-1); NCBI_THROW(CLoaderException, eNoConnection, "Attempt to open multiple pubseq_readers " "without MT-safe DB library"); }#endif try { SetParallelLevel(noConn); } catch ( ... ) { SetParallelLevel(0); throw; }}CPubseqReader::~CPubseqReader(){ SetParallelLevel(0);#if !defined(HAVE_SYBASE_REENTRANT) && defined(NCBI_THREADS) s_pubseq_readers.Add(-1);#endif}CReader::TConn CPubseqReader::GetParallelLevel(void) const{ return m_Pool.size();}void CPubseqReader::SetParallelLevel(TConn size){ size_t oldSize = m_Pool.size(); for(size_t i = size; i < oldSize; ++i) { delete m_Pool[i]; m_Pool[i] = 0; } m_Pool.resize(size); for(size_t i = oldSize; i < min(1u, size); ++i) { m_Pool[i] = x_NewConnection(); }}CDB_Connection* CPubseqReader::x_GetConnection(TConn conn){ conn = conn % m_Pool.size(); CDB_Connection* ret = m_Pool[conn]; if ( !ret ) { ret = x_NewConnection(); if ( !ret ) { NCBI_THROW(CLoaderException, eNoConnection, "too many connections failed: probably server is dead"); } m_Pool[conn] = ret; } return ret;}void CPubseqReader::Reconnect(TConn conn){ LOG_POST("Reconnect"); conn = conn % m_Pool.size(); delete m_Pool[conn]; m_Pool[conn] = 0;}CDB_Connection *CPubseqReader::x_NewConnection(void){ for ( int i = 0; !m_NoMoreConnections && i < 3; ++i ) { if ( m_Context.get() == NULL ) { C_DriverMgr drvMgr; //DBAPI_RegisterDriver_CTLIB(drvMgr); //DBAPI_RegisterDriver_DBLIB(drvMgr); string errmsg; FDBAPI_CreateContext createContextFunc = drvMgr.GetDriver("ctlib",&errmsg); if ( !createContextFunc ) { LOG_POST(errmsg);#if defined(HAVE_SYBASE_REENTRANT) && defined(NCBI_THREADS) m_NoMoreConnections = true; NCBI_THROW(CLoaderException, eNoConnection, "Neither ctlib nor dblib are available");#else createContextFunc = drvMgr.GetDriver("dblib",&errmsg); if ( !createContextFunc ) { LOG_POST(errmsg); m_NoMoreConnections = true; NCBI_THROW(CLoaderException, eNoConnection, "Neither ctlib nor dblib are available"); }#endif } map<string,string> args; args["packet"]="3584"; // 7*512 m_Context.reset((*createContextFunc)(&args)); //m_Context.reset((*createContextFunc)(0)); } try { auto_ptr<CDB_Connection> conn(m_Context->Connect(m_Server, m_User, m_Password, 0)); if ( conn.get() ) { auto_ptr<CDB_LangCmd> cmd(conn->LangCmd("set blob_stream on")); if ( cmd.get() ) { cmd->Send(); } } return conn.release(); } catch ( CException& exc ) { ERR_POST("CPubseqReader::x_NewConnection: " "cannot connect: " << exc.what()); } } m_NoMoreConnections = true; return 0;}int CPubseqReader::ResolveSeq_id_to_gi(const CSeq_id& seqId, TConn conn){ // note: this was //CDB_VarChar asnIn(static_cast<string>(CNcbiOstrstreamToString(oss))); // but MSVC doesn't like this. This is the only version that // will compile: CDB_VarChar asnIn; {{ CNcbiOstrstream oss; {{ CObjectOStreamAsn ooss(oss); ooss << seqId; }} asnIn = CNcbiOstrstreamToString(oss); }} CDB_Connection* db_conn = x_GetConnection(conn); auto_ptr<CDB_RPCCmd> cmd(db_conn->RPC("id_gi_by_seqid_asn", 1)); cmd->SetParam("@asnin", &asnIn); cmd->Send(); while(cmd->HasMoreResults()) { auto_ptr<CDB_Result> result(cmd->Result()); if (result.get() == 0 || result->ResultType() != eDB_RowResult) continue; while(result->Fetch()) { for(unsigned pos = 0; pos < result->NofItems(); ++pos) { const string& name = result->ItemName(pos); if (name == "gi") { CDB_Int giFound; result->GetItem(&giFound); return giFound.Value(); } else { result->SkipItem(); } } } } return 0;}void CPubseqReader::ResolveSeq_id(TSeqrefs& srs, const CSeq_id& id, TConn conn){ _TRACE("ResolveSeq_id: " << id.AsFastaString()); // note: this was //CDB_VarChar asnIn(static_cast<string>(CNcbiOstrstreamToString(oss))); // but MSVC doesn't like this. This is the only version that // will compile: CDB_VarChar asnIn; {{ CNcbiOstrstream oss; {{ CObjectOStreamAsn ooss(oss); ooss << id; }} asnIn = CNcbiOstrstreamToString(oss); }} CDB_Connection* db_conn = x_GetConnection(conn); auto_ptr<CDB_RPCCmd> cmd(db_conn->RPC("id_gi_by_seqid_asn", 1)); cmd->SetParam("@asnin", &asnIn); cmd->Send(); x_RetrieveSeqrefs(srs, *cmd, 0);}void CPubseqReader::RetrieveSeqrefs(TSeqrefs& srs, int gi, TConn conn){ _TRACE("RetrieveSeqrefs: " << gi); CDB_Int giIn(gi); CDB_Connection* db_conn = x_GetConnection(conn); auto_ptr<CDB_RPCCmd> cmd(db_conn->RPC("id_gi_class", 1)); cmd->SetParam("@gi", &giIn); cmd->Send(); x_RetrieveSeqrefs(srs, *cmd, gi);}void CPubseqReader::x_RetrieveSeqrefs(TSeqrefs& srs, CDB_RPCCmd& cmd, int gi){ while(cmd.HasMoreResults()) { auto_ptr<CDB_Result> result(cmd.Result()); if (result.get() == 0 || result->ResultType() != eDB_RowResult) continue; while(result->Fetch()) { CDB_Int giGot(gi); CDB_Int sat; CDB_Int satKey; CDB_Int extFeat; _TRACE("next fetch: " << result->NofItems() << " items"); for ( unsigned pos = 0; pos < result->NofItems(); ++pos ) { const string& name = result->ItemName(pos); _TRACE("next item: " << name); if (name == "gi") { result->GetItem(&giGot); _TRACE("gi: "<<giGot.Value()); } else if (name == "sat" ) { result->GetItem(&sat); _TRACE("sat: "<<sat.Value()); } else if(name == "sat_key") { result->GetItem(&satKey); _TRACE("sat_key: "<<satKey.Value()); } else if(name == "extra_feat" || name == "ext_feat") { result->GetItem(&extFeat);#ifdef _DEBUG if ( extFeat.IsNULL() ) { _TRACE("ext_feat = NULL"); } else { _TRACE("ext_feat = "<<extFeat.Value()); }#endif } else { result->SkipItem(); } } _ASSERT(sat.Value() != eSatellite_SNP); srs.push_back(Ref(new CSeqref(giGot.Value(), sat.Value(), satKey.Value()))); if ( TrySNPSplit() ) { if ( extFeat.IsNULL() ) { AddSNPSeqref(srs, giGot.Value(), CSeqref::fPossible); } else if ( extFeat.Value() & 1 ) { AddSNPSeqref(srs, giGot.Value()); } } } }}CRef<CTSE_Info> CPubseqReader::GetTSEBlob(const CSeqref& seqref, TConn conn){ CDB_Connection* db_conn = x_GetConnection(conn); auto_ptr<CDB_RPCCmd> cmd(x_SendRequest(seqref, db_conn, false)); auto_ptr<CDB_Result> result(x_ReceiveData(*cmd)); return x_ReceiveMainBlob(*result);}CRef<CSeq_annot_SNP_Info> CPubseqReader::GetSNPAnnot(const CSeqref& seqref, TConn conn){ CDB_Connection* db_conn = x_GetConnection(conn); auto_ptr<CDB_RPCCmd> cmd(x_SendRequest(seqref, db_conn, true)); auto_ptr<CDB_Result> result(x_ReceiveData(*cmd)); return x_ReceiveSNPAnnot(*result);}CDB_RPCCmd* CPubseqReader::x_SendRequest(const CSeqref& seqref, CDB_Connection* db_conn, bool is_snp){ auto_ptr<CDB_RPCCmd> cmd(db_conn->RPC("id_get_asn", 4)); CDB_Int giIn(seqref.GetGi()); CDB_SmallInt satIn(seqref.GetSat()); CDB_Int satKeyIn(seqref.GetSatKey());
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?