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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: comprot_cli.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:21:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: comprot_cli.cpp,v 1000.1 2004/06/01 19:21:03 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:  Victor Sapojnikov
  35.  *
  36.  * File Description:
  37.  *   Conveniency shortcut functions for CompactProtocol client,
  38.  *   returning bool/int/void and accepting 0 or 1 parameters.
  39.  *
  40.  */
  41. #include <ncbi_pch.hpp>
  42. #include <dbapi/driver/gateway/comprot_cli.hpp>
  43. BEGIN_NCBI_SCOPE
  44. CSSSConnection* conn=NULL;
  45. //USING_NCBI_SCOPE;
  46. void comprot_errmsg()
  47. {
  48.   const char* pchAnswer;
  49.   unsigned sz;
  50.   IGate* pGate = conn->getProtocol();
  51.   if( pGate->get_input_arg("Error", &pchAnswer, &sz) == IGate::eGood ) {
  52.     conn->setErrMsg(pchAnswer);
  53.     cerr << "comprot_errmsg=" << pchAnswer << "n";
  54.   }
  55.   else {
  56.     conn->setErrMsg("");
  57.     cerr << "comprot_errmsg - no Error message from servern";
  58.   }
  59.   CDB_Exception* ex = read_CDB_Exception(pGate);
  60.   if( ex ) {
  61.     // Re-throw the exception caught on a server
  62.     throw ex;
  63.   }
  64. }
  65. bool comprot_bool( const char *procName, int object )
  66. {
  67.   IGate* pGate = conn->getProtocol();
  68.   pGate->set_RPC_call(procName);
  69.   pGate->set_output_arg( "object", &object );
  70.   pGate->send_data();
  71.   pGate->send_done();
  72.   int nOk;
  73.   if (pGate->get_input_arg("result", &nOk) != IGate::eGood) {
  74.     comprot_errmsg();
  75.     return false;
  76.   }
  77.   return nOk;
  78. }
  79. int comprot_int( const char *procName, int object )
  80. {
  81.   IGate* pGate = conn->getProtocol();
  82.   pGate->set_RPC_call(procName);
  83.   pGate->set_output_arg( "object", &object );
  84.   pGate->send_data();
  85.   pGate->send_done();
  86.   int res;
  87.   if (pGate->get_input_arg("result", &res) != IGate::eGood) {
  88.     comprot_errmsg();
  89.     return 0;
  90.   }
  91.   return res;
  92. }
  93. void comprot_void( const char *procName, int object )
  94. {
  95.   IGate* pGate = conn->getProtocol();
  96.   pGate->set_RPC_call(procName);
  97.   pGate->set_output_arg( "object", &object );
  98.   pGate->send_data();
  99.   pGate->send_done();
  100. }
  101. char* comprot_chars( const char *procName, int object, char* buf, int len )
  102. {
  103.   IGate* pGate = conn->getProtocol();
  104.   pGate->set_RPC_call(procName);
  105.   pGate->set_output_arg( "object", &object );
  106.   pGate->send_data();
  107.   pGate->send_done();
  108.   if (pGate->get_input_arg("result", buf, len) != IGate::eGood) {
  109.     comprot_errmsg();
  110.     return 0;
  111.   }
  112.   return buf;
  113. }
  114. CDB_Exception* read_CDB_Exception(IGate *pGate)
  115. {
  116.   int exceptionType;
  117.   if( pGate->get_input_arg("exception", &exceptionType) != IGate::eGood )
  118.     return NULL;
  119.   int severity = (int)eDB_Unknown; // EDB_Severity::
  120.   pGate->get_input_arg("severity", &severity);
  121.   int code = 0;
  122.   pGate->get_input_arg("code"    , &code    );
  123.   const char* from="";
  124.   pGate->get_input_arg("from"    , &from    );
  125.   const char* msg="";
  126.   pGate->get_input_arg("msg"     , &msg     );
  127.   switch( (CDB_Exception::EType)exceptionType ) {
  128.     case CDB_Exception::eRPC:
  129.     {
  130.       const char* proc="";
  131.       pGate->get_input_arg("proc", &proc);
  132.       int line = 0;
  133.       pGate->get_input_arg("line", &line);
  134.       return new CDB_RPCEx( (EDB_Severity)severity,code,from,msg,  proc,line );
  135.     }
  136.     case CDB_Exception::eSQL:
  137.     {
  138.       const char* state="";
  139.       pGate->get_input_arg("state", &state);
  140.       int line = 0;
  141.       pGate->get_input_arg("line" , &line );
  142.       return new CDB_SQLEx( (EDB_Severity)severity,code,from,msg,  state,line );
  143.     }
  144.     case CDB_Exception::eDS      : return new CDB_DSEx      ( (EDB_Severity)severity, code, from, msg );
  145.     case CDB_Exception::eDeadlock: return new CDB_DeadlockEx( from, msg );
  146.     case CDB_Exception::eTimeout : return new CDB_TimeoutEx ( code, from, msg );
  147.     case CDB_Exception::eClient  : return new CDB_ClientEx  ( (EDB_Severity)severity, code, from, msg );
  148.     case CDB_Exception::eMulti :
  149.     {
  150.       int count = 0;
  151.       pGate->get_input_arg("count", &count);
  152.       CDB_MultiEx* multi = new CDB_MultiEx(from); // , count
  153.       for(int i=0;i<count;i++) {
  154.         pGate->Fetch(0);
  155.         CDB_Exception* ex = read_CDB_Exception(pGate);
  156.         multi->Push(*ex);
  157.         delete ex;
  158.       }
  159.       return multi;
  160.     }
  161.     default:
  162.       cerr<< "Unrecognized exception in comprot_errmsg(): n  type=" << exceptionType;
  163.       cerr << " code=" << code << " severity=" << severity << "n";
  164.       cerr<< "  from=" << from << "n";
  165.       cerr<< "  msg=" << msg << "n";
  166.       //throw CDB_Exception( (CDB_Exception::EType)exceptionType,  (EDB_Severity)severity,code,from,msg );
  167.       return NULL;
  168.   }
  169. }
  170. END_NCBI_SCOPE