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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: id1_fetch_simple.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:30:33  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: id1_fetch_simple.cpp,v 1000.2 2004/06/01 18:30:33 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.  * Author:  Denis Vakatov, Aleksey Grichenko
  35.  *
  36.  * File Description:
  37.  *   New IDFETCH network client (get Seq-Entry by GI)
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiapp.hpp>
  41. #include <corelib/ncbienv.hpp>
  42. #include <corelib/ncbiargs.hpp>
  43. #include <corelib/ncbireg.hpp>
  44. #include <connect/ncbi_util.h>
  45. #include <connect/ncbi_socket.h>
  46. #include <connect/ncbi_core_cxx.hpp>
  47. #include <connect/ncbi_conn_stream.hpp>
  48. #include <serial/serial.hpp>
  49. #include <serial/objistrasnb.hpp>
  50. #include <serial/objostrasnb.hpp>
  51. #include <objects/id1/ID1server_request.hpp>
  52. #include <objects/id1/ID1server_maxcomplex.hpp>
  53. #include <objects/seqloc/Seq_id.hpp>
  54. #include <objects/id1/ID1server_back.hpp>
  55. #include <objects/seqset/Seq_entry.hpp>
  56. #include <memory>
  57. USING_NCBI_SCOPE;
  58. USING_SCOPE(objects);
  59. /////////////////////////////////
  60. //  CId1FetchApp::
  61. //
  62. class CId1FetchApp : public CNcbiApplication
  63. {
  64.     virtual void Init(void);
  65.     virtual int  Run(void);
  66.     virtual void Exit(void);
  67. };
  68. void CId1FetchApp::Init(void)
  69. {
  70.     // Prepare command line descriptions
  71.     //
  72.     // Create
  73.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  74.     // GI
  75.     arg_desc->AddOptionalKey
  76.         ("gi", "SeqEntryID",
  77.          "GI id of the Seq-Entry to fetch",
  78.          CArgDescriptions::eInteger);
  79.     // Request
  80.     arg_desc->AddOptionalKey
  81.         ("req", "Request",
  82.          "ID1 request in ASN.1 text format",
  83.          CArgDescriptions::eString);
  84.     // Output format
  85.     arg_desc->AddDefaultKey
  86.         ("fmt", "OutputFormat",
  87.          "Format to dump the resulting data in",
  88.          CArgDescriptions::eString, "asn");
  89.     arg_desc->SetConstraint("fmt", &(*new CArgAllow_Strings,
  90.                                      "asn", "asnb", "xml", "raw"));
  91.     // Output datafile
  92.     arg_desc->AddDefaultKey
  93.         ("out", "ResultFile",
  94.          "File to dump the resulting data to",
  95.          CArgDescriptions::eOutputFile, "-", CArgDescriptions::fBinary);
  96.     // Log file
  97.     arg_desc->AddOptionalKey
  98.         ("log", "LogFile",
  99.          "File to post errors and messages to",
  100.          CArgDescriptions::eOutputFile,
  101.          0);
  102.     // Program description
  103.     string prog_description =
  104.         "Fetch SeqEntry from ID server by its GI id";
  105.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  106.                               prog_description, false);
  107.     // Pass argument descriptions to the application
  108.     //
  109.     SetupArgDescriptions(arg_desc.release());
  110. }
  111. int CId1FetchApp::Run(void)
  112. {
  113.     // Process command line args
  114.     const CArgs& args = GetArgs();
  115.     // Setup and tune logging facilities
  116.     if ( args["log"] ) {
  117.         SetDiagStream( &args["log"].AsOutputFile() );
  118.     }
  119. #ifdef _DEBUG
  120.     // SetDiagTrace(eDT_Enable);
  121.     SetDiagPostLevel(eDiag_Info);
  122.     SetDiagPostFlag(eDPF_All);
  123. #endif
  124.     // Setup application registry, error log, and MT-lock for CONNECT library
  125.     CONNECT_Init(&GetConfig());
  126.     
  127.     // Compose request to ID1 server
  128.     CID1server_request id1_request;
  129.     if ( args["gi"] ) {
  130.         int gi = args["gi"].AsInteger();
  131.         //    id1_request.SetGetsefromgi().SetGi() = gi;
  132.         id1_request.SetGetseqidsfromgi() = gi;
  133.     }
  134.     else if ( args["req"] ) {
  135.         string text = args["req"].AsString();
  136.         if ( text.find("::=") == NPOS ) {
  137.             text = "ID1server-request ::= " + text;
  138.         }
  139.         CNcbiIstrstream in(text.data(), text.size());
  140.         in >> MSerial_AsnText >> id1_request;
  141.     }
  142.     // Open connection to ID1 server
  143.     STimeout tmout;  tmout.sec = 9;  tmout.usec = 0;  
  144.     CConn_ServiceStream id1_server("ID1", fSERV_Any, 0, 0, &tmout);
  145.     {{
  146.         CObjectOStreamAsnBinary id1_server_output(id1_server);
  147.         // Send request to the server
  148.         id1_server_output << id1_request;
  149.         id1_server_output.Flush();
  150.     }}
  151.     // Get response (Seq-Entry) from the server, dump it to the
  152.     // output data file in the requested format
  153.     CNcbiOstream& datafile = args["out"].AsOutputFile();
  154.     const string& fmt = args["fmt"].AsString();
  155.     // Dump the raw data coming from server "as is", if so specified
  156.     if (fmt == "raw") {
  157.         datafile << id1_server.rdbuf();
  158.         return 0;  // Done
  159.     }
  160.     CID1server_back id1_response;
  161.     {{
  162.         // Read server response in ASN.1 binary format
  163.         CObjectIStreamAsnBinary id1_server_input(id1_server, false);
  164.         id1_server_input >> id1_response;
  165.     }}
  166.     // Dump server response in the specified format
  167.     ESerialDataFormat format;
  168.     if        (fmt == "asn") {
  169.         format = eSerial_AsnText;
  170.     } else if (fmt == "asnb") {
  171.         format = eSerial_AsnBinary;
  172.     } else if (fmt == "xml") {
  173.         format = eSerial_Xml;
  174.     }
  175.     {{
  176.         auto_ptr<CObjectOStream> id1_client_output
  177.             (CObjectOStream::Open(format, datafile));
  178.         *id1_client_output << id1_response;
  179.         if (fmt == "asn"  ||  fmt == "xml") {
  180.             datafile << NcbiEndl;
  181.         }
  182.     }}
  183.     return 0;  // Done
  184. }
  185. // Cleanup
  186. void CId1FetchApp::Exit(void)
  187. {
  188.     SOCK_ShutdownAPI();
  189.     SetDiagStream(0);
  190. }
  191. /////////////////////////////////////////////////////////////////////////////
  192. //  MAIN
  193. //
  194. int main(int argc, const char* argv[]) 
  195. {
  196.     return CId1FetchApp().AppMain(argc, argv /*, 0, eDS_Default, 0*/);
  197. }
  198. /*
  199.  * ---------------------------------------------------------------------------
  200.  * $Log: id1_fetch_simple.cpp,v $
  201.  * Revision 1000.2  2004/06/01 18:30:33  gouriano
  202.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  203.  *
  204.  * Revision 1.13  2004/05/21 21:41:40  gorelenk
  205.  * Added PCH ncbi_pch.hpp
  206.  *
  207.  * Revision 1.12  2004/02/20 20:04:08  vasilche
  208.  * Added possibility to send any request to ID1.
  209.  *
  210.  * Revision 1.11  2002/06/12 16:51:55  lavr
  211.  * Take advantage of CONNECT_Init()
  212.  *
  213.  * Revision 1.10  2002/03/11 21:52:05  lavr
  214.  * Print complete debug and trace information when compiled with _DEBUG
  215.  *
  216.  * Revision 1.9  2002/01/17 17:22:21  vakatov
  217.  * It should be okay to use "CObjectIStreamAsnBinary" instead of
  218.  * CObjectIStream::Open() for non-blocking streams now (so rollback R1.4)
  219.  *
  220.  * Revision 1.8  2001/09/25 14:04:06  ucko
  221.  * Update call to CConn_ServiceStream constructor for new interface.
  222.  *
  223.  * Revision 1.7  2001/07/19 19:40:20  lavr
  224.  * Typo fixed
  225.  *
  226.  * Revision 1.6  2001/06/01 18:43:44  vakatov
  227.  * Comment out excessive debug/trace printout
  228.  *
  229.  * Revision 1.5  2001/05/16 17:55:37  grichenk
  230.  * Redesigned support for non-blocking stream read operations
  231.  *
  232.  * Revision 1.4  2001/05/11 20:41:16  grichenk
  233.  * Added support for non-blocking stream reading
  234.  *
  235.  * Revision 1.3  2001/05/11 14:06:45  grichenk
  236.  * The first working revision
  237.  *
  238.  * Revision 1.2  2001/04/13 14:09:34  grichenk
  239.  * Next debug version, still not working
  240.  *
  241.  * Revision 1.1  2001/04/10 22:39:04  vakatov
  242.  * Initial revision.
  243.  * Compiles and links, but apparently is not working yet.
  244.  *
  245.  * ===========================================================================
  246.  */