⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 entrez2client.cpp

📁 ncbi源码
💻 CPP
字号:
/* * =========================================================================== * PRODUCTION $Log: entrez2client.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:32:10  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4 * PRODUCTION * =========================================================================== *//* $Id: entrez2client.cpp,v 1000.2 2004/06/01 19:32:10 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:  Mike DiCuccio * * File Description: * */#include <ncbi_pch.hpp>#include <connect/ncbi_core_cxx.hpp>#include <corelib/ncbiapp.hpp>#include <corelib/ncbiargs.hpp>#include <corelib/ncbienv.hpp>#include <corelib/ncbistd.hpp>#include <objects/entrez2/Entrez2_boolean_element.hpp>#include <objects/entrez2/Entrez2_boolean_exp.hpp>#include <objects/entrez2/Entrez2_boolean_reply.hpp>#include <objects/entrez2/Entrez2_db_id.hpp>#include <objects/entrez2/Entrez2_docsum_list.hpp>#include <objects/entrez2/Entrez2_eval_boolean.hpp>#include <objects/entrez2/Entrez2_id_list.hpp>#include <objects/entrez2/Entrez2_info.hpp>#include <objects/entrez2/Entrez2_limits.hpp>#include <objects/entrez2/entrez2_client.hpp>#include <serial/objostrasn.hpp>#include <serial/serial.hpp>using namespace ncbi;using namespace objects;class CEntrez2ClientApp : public CNcbiApplication{public:    virtual void Init(void);    virtual int  Run (void);private:    CRef<CEntrez2Client>     m_Client;    CNcbiOstream*            m_Ostream;    auto_ptr<CObjectOStream> m_ObjOstream;    //    // handlers for specific requests    //    void x_GetInfo         (CEntrez2Client& client);    void x_GetCount        (CEntrez2Client& client,                            const string& query, const string& db);    void x_GetParsedQuery  (CEntrez2Client& client,                            const string& query, const string& db);    void x_GetUids         (CEntrez2Client& client,                            const string& query, const string& db);    void x_GetDocsums      (CEntrez2Client& client,                            const string& query, const string& db,                            int start, int max_num);    void x_GetTermPositions(CEntrez2Client& client,                            const string& query, const string& db);    void x_GetTermList(CEntrez2Client& client,                       const string& query, const string& db);    void x_GetTermHierarchy(CEntrez2Client& client,                            const string& query, const string& db);    void x_GetLinks(CEntrez2Client& client,                    const string& query, const string& db);    void x_GetLinked(CEntrez2Client& client,                     const string& query, const string& db);    void x_GetLinkCounts(CEntrez2Client& client,                         const string& query, const string& db);    // format a reply (basic formatting only)    void x_FormatReply(CEntrez2_boolean_reply& reply);    // main internal query function    CEntrez2_boolean_reply* x_EvalBoolean(CEntrez2Client& client,                                          const string& query,                                          const string& db,                                          bool parse, bool uids,                                          int start = -1, int max_num = -1);};void CEntrez2ClientApp::Init(void){    // Prepare command line descriptions    auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);    arg_desc->AddKey("query", "QueryString", "Query to submit",                     CArgDescriptions::eString);    arg_desc->AddKey("db", "Database", "Name of database to query",                     CArgDescriptions::eString);    arg_desc->AddDefaultKey("lt", "Lookup", "Type of lookup to perform",                            CArgDescriptions::eString, "info");    arg_desc->SetConstraint("lt",                            &(*new CArgAllow_Strings,                              "info",     // get-info request                              "count",    // eval-boolean: count only                              "parse",    // eval-boolean: parsed query                              "uids",     // eval-boolean: uid list                              "docsum",   // get docsums for our query                              "termpos",  // get term positions                              "termhier", // get term hierarchy                              "termlist", // get term list                              "links",    // get links                              "linked",   // get linked status                              "linkct"    // get link count                             ));    arg_desc->AddDefaultKey("start", "StartPos",                            "Starting point in the UID list for retrieval",                            CArgDescriptions::eInteger, "-1");    arg_desc->AddDefaultKey("max", "MaxNum",                            "Maximum number of records to retrieve",                            CArgDescriptions::eInteger, "-1");    arg_desc->AddDefaultKey("out", "OutputFile", "File to dump output to",                            CArgDescriptions::eOutputFile, "-");    // Pass argument descriptions to the application    //    SetupArgDescriptions(arg_desc.release());}int CEntrez2ClientApp::Run(void){    // Setup application registry, error log, and MT-lock for CONNECT library    CONNECT_Init(&GetConfig());    CArgs args = GetArgs();    string db          = args["db"].AsString();    string query       = args["query"].AsString();    string lt          = args["lt"].AsString();    CNcbiOstream& ostr = args["out"].AsOutputFile();    int start          = args["start"].AsInteger();    int max_num        = args["max"].AsInteger();    m_Client.Reset(new CEntrez2Client());    m_Client->SetDefaultRequest().SetTool("Entrez2 Command-line Test");    m_ObjOstream.reset(CObjectOStream::Open(eSerial_AsnText, ostr));    m_Ostream = &ostr;    //    // process each lookup type    //    if (lt == "info") {        LOG_POST(Info << "performing look-up type: get-info");        x_GetInfo(*m_Client);    } else if (lt == "count") {        LOG_POST(Info << "performing look-up type: eval-boolean (count only)");        x_GetCount(*m_Client, query, db);    } else if (lt == "parse") {        LOG_POST(Info << "performing look-up type: eval-boolean (show parsed expression)");        x_GetParsedQuery(*m_Client, query, db);    } else if (lt == "uids") {        LOG_POST(Info << "performing look-up type: eval-boolean (UID list)");        x_GetUids(*m_Client, query, db);    } else if (lt == "docsum") {        LOG_POST(Info << "performing look-up type: get-docsum");        x_GetDocsums(*m_Client, query, db, start, max_num);    } else if (lt == "termpos") {        LOG_POST(Info << "performing look-up type: get-termpos");        x_GetTermPositions(*m_Client, query, db);    } else {        LOG_POST(Error << "unrecognized lookup type: " << lt);        return 1;    }    return 0;}//// get-info// returns information about active databases//void CEntrez2ClientApp::x_GetInfo(CEntrez2Client& client){    CRef<CEntrez2_info> info = client.AskGet_info();    *m_ObjOstream << *info;}//// display only the number fo records that match a query//void CEntrez2ClientApp::x_GetCount(CEntrez2Client& client,                                   const string& query, const string& db){    *m_Ostream << "query: " << query << endl;    CRef<CEntrez2_boolean_reply> reply(x_EvalBoolean(client, query, db,                                                     false, false));    x_FormatReply(*reply);}//// display only the number fo records that match a query//void CEntrez2ClientApp::x_GetUids(CEntrez2Client& client,                                  const string& query, const string& db){    CRef<CEntrez2_boolean_reply> reply(x_EvalBoolean(client, query, db,                                                     true, true));    *m_Ostream << "query: " << query << endl;    x_FormatReply(*reply);}//// display only the number fo records that match a query//void CEntrez2ClientApp::x_GetParsedQuery(CEntrez2Client& client,                                         const string& query,                                         const string& db){    CRef<CEntrez2_boolean_reply> reply(x_EvalBoolean(client, query, db,                                                     true, false));    x_FormatReply(*reply);}//// display docsums for a given query//void CEntrez2ClientApp::x_GetDocsums(CEntrez2Client& client,                                     const string& query,                                     const string& db,                                     int start, int max_num){    // retrieve our list of UIDs    CRef<CEntrez2_boolean_reply> reply(x_EvalBoolean(client, query, db,                                                     false, true,                                                     start, max_num));    // retrieve the docsums    CRef<CEntrez2_docsum_list> docsums =        client.AskGet_docsum(reply->GetUids());    *m_Ostream << reply->GetCount() << " records match" << endl;    *m_Ostream << "docsums:" << endl;    *m_Ostream << string(72, '-') << endl;    *m_ObjOstream << *docsums;    *m_Ostream << endl << string(72, '-') << endl;}//// display term positions for a given query//void CEntrez2ClientApp::x_GetTermPositions(CEntrez2Client& client,                                           const string& query,                                           const string& db){    LOG_POST(Error << "get-term-pos query unimplemented");}//// display term list for a given query//void CEntrez2ClientApp::x_GetTermList(CEntrez2Client& client,                                      const string& query,                                      const string& db){    LOG_POST(Error << "get-term-list query unimplemented");}//// display term hierarchy for a given query//void CEntrez2ClientApp::x_GetTermHierarchy(CEntrez2Client& client,                                           const string& query,                                           const string& db){    LOG_POST(Error << "get-term-hierarchy query unimplemented");}//// display links for a given query//void CEntrez2ClientApp::x_GetLinks(CEntrez2Client& client,                                   const string& query,                                   const string& db){    LOG_POST(Error << "get-links query unimplemented");}//// display linked status for a given query//void CEntrez2ClientApp::x_GetLinked(CEntrez2Client& client,                                    const string& query,                                    const string& db){    LOG_POST(Error << "get-linked query unimplemented");}//// display link counts for a given query//void CEntrez2ClientApp::x_GetLinkCounts(CEntrez2Client& client,                                        const string& query,                                        const string& db){    LOG_POST(Error << "get-link-counts query unimplemented");}//// eval-boolean// returns a count of the number of items that match//CEntrez2_boolean_reply*CEntrez2ClientApp::x_EvalBoolean(CEntrez2Client& client,                                 const string& query, const string& db,                                 bool parse, bool uids,                                 int start, int max_num){    CEntrez2_eval_boolean req;    if (parse) {        req.SetReturn_parse(true);    }    if (uids) {        req.SetReturn_UIDs(true);    }    CEntrez2_boolean_exp& exp = req.SetQuery();    if (start != -1) {        exp.SetLimits().SetOffset_UIDs(start);    }    if (max_num != -1) {        exp.SetLimits().SetMax_UIDs(max_num);    }    // set the database we're querying    exp.SetDb().Set(db);    // set the query    CRef<CEntrez2_boolean_element> elem(new CEntrez2_boolean_element());    elem->SetStr(query);    exp.SetExp().push_back(elem);    CRef<CEntrez2_boolean_reply> reply = client.AskEval_boolean(req);    return reply.Release();}//// x_FormatReply()// dump results from the reply block//void CEntrez2ClientApp::x_FormatReply(CEntrez2_boolean_reply& reply){    if (reply.CanGetCount()) {        *m_Ostream << reply.GetCount() << " uids match" << endl;    }    if (reply.IsSetQuery()) {        *m_Ostream << "parsed query:" << endl;        *m_Ostream << string(75, '-') << endl;        *m_ObjOstream << reply.GetQuery();        *m_Ostream << endl << string(75, '-') << endl;    }    if (reply.IsSetUids()) {        *m_Ostream << "decoded UIDs:" << endl;        CEntrez2_id_list::TConstUidIterator iter =            reply.GetUids().GetConstUidIterator();        for ( ; !iter.AtEnd();  ++iter) {            *m_Ostream << "    " << *iter << endl;        }    }}///////////////////////////////////////////////////////////////////////////////  MAINint main(int argc, const char* argv[]){    return CEntrez2ClientApp().AppMain(argc, argv, 0, eDS_Default, 0);}/* * =========================================================================== * $Log: entrez2client.cpp,v $ * Revision 1000.2  2004/06/01 19:32:10  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4 * * Revision 1.4  2004/05/19 17:21:09  gorelenk * Added include of PCH - ncbi_pch.hpp * * Revision 1.3  2003/11/20 15:41:17  ucko * Update for new (saner) treatment of ASN.1 NULLs. * * Revision 1.2  2003/07/31 18:12:26  dicuccio * Code clean-up.  Added limits for docsum retrieval (start pos / max number of * records) * * Revision 1.1  2003/07/31 17:38:51  dicuccio * Added subproject demo with a single applicaiton, a command-line demo app * * =========================================================================== */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -