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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: gateway.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:21:09  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: gateway.cpp,v 1000.1 2004/06/01 19:21:09 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.  *   A comprot client proxies for remote:
  38.  *   I_Connection objects.
  39.  *
  40.  */
  41. #include <ncbi_pch.hpp>
  42. #include <dbapi/driver/gateway/internal_cli.hpp>
  43. #ifdef NCBI_OS_MSWIN
  44. #define DllExport   __declspec( dllexport )
  45. #else
  46. #define DllExport
  47. #endif
  48. BEGIN_NCBI_SCOPE
  49. ///////////////////////////////////////////////////////////////////////
  50. // Driver manager related functions
  51. //
  52. I_DriverContext* GW_CreateContext(map<string,string>* attr = 0)
  53. {
  54.   static CLogger *log;
  55.   static CSSSConnection *sssConnection=NULL;
  56.   if(sssConnection==NULL) {
  57.     log = new CLogger(&cerr); // Do it better??
  58.     sssConnection = new CSSSConnection(log);
  59.   }
  60.   // To do: read defaults from ssssrv.ini
  61.   string sHost = "stmartin";
  62.   unsigned short iPort = 8765;
  63.   if(attr) {
  64.     map<string,string>::iterator it;
  65.     it=attr->find("host"  ); if( it!=attr->end() ) { sHost  =it->second; }
  66.     it=attr->find("port"  ); if( it!=attr->end() ) {
  67.       iPort  = NStr::StringToUInt(it->second);
  68. }
  69.   }
  70.   if( sssConnection->connect(sHost.c_str(), iPort) != CSSSConnection::eOk ) {
  71.       cerr<< "FATAL(" << sssConnection->getRetCodeDesc()
  72.           << "):Failed to connect to SSS server on host:""
  73.           << sHost << "" port:" << iPort << endl
  74.           << "tReason:" << sssConnection->getErrMsg() << endl;
  75.       return NULL;
  76.   }
  77.   return new CGWContext(*sssConnection);
  78. }
  79. void DBAPI_RegisterDriver_GATEWAY(I_DriverMgr& mgr)
  80. {
  81.     mgr.RegisterDriver("gateway", GW_CreateContext);
  82. }
  83. extern "C" {
  84.     DllExport void* DBAPI_E_gateway()
  85.     {
  86.         return (void*)DBAPI_RegisterDriver_GATEWAY;
  87.     }
  88. }
  89. /////////////////////////////////////////////////////////////////////////////
  90. //
  91. //  Commands
  92. //
  93. CDB_Result* CGW_BaseCmd::Result()
  94. {
  95.   int remoteResult = comprot_int( "GWLib:BaseCmd:Result", remoteObj );
  96.   if(remoteResult) {
  97.     CGW_Result* p = new CGW_Result(remoteResult);
  98.     return Create_Result( *p );
  99.   }
  100.   else {
  101.     return NULL;
  102.   }
  103. }
  104. bool CGW_CursorCmd::UpdateTextImage(unsigned int item_num, CDB_Stream& data, bool log_it)
  105. {
  106.   IGate* pGate = conn->getProtocol();
  107.   void* pOldUserData = pGate->get_user_data();
  108.   C_GWLib_TextImageCallback::SContext callback_args; //(&data);
  109.   pGate->set_user_data((void*)&callback_args);
  110.   pGate->set_RPC_call  ( "GWLib:CursorCmd:UpdateTextImage" );
  111.   pGate->set_output_arg( "object"  , &remoteObj      );
  112.   pGate->set_output_arg( "item_num", (int*)&item_num );
  113.   int type = (int)( data.GetType() );
  114.   int sz   = (int)( data.Size   () );
  115.   CDB_Stream* pdata = &data;
  116.   pGate->set_output_arg( "type"    , &type);
  117.   pGate->set_output_arg( "size"    , &sz  );
  118.   pGate->set_output_arg( "stream"  , (int*)&pdata     );
  119.   pGate->set_output_arg( "log_it"  , (int*)&log_it   );
  120.   pGate->send_data();
  121.   //pGate->send_done();
  122.   pGate->set_user_data(pOldUserData);
  123.   if( callback_args.bError ) {
  124.     comprot_errmsg();
  125.     return false;
  126.   }
  127.   return callback_args.result;
  128. }
  129. CDB_SendDataCmd* CGW_CursorCmd::SendDataCmd(unsigned int item_num, size_t size, bool log_it)
  130. {
  131.   IGate* pGate = conn->getProtocol();
  132.   pGate->set_RPC_call  ( "GWLib:CursorCmd:SendDataCmd" );
  133.   pGate->set_output_arg( "object"  , &remoteObj      );
  134.   pGate->set_output_arg( "item_num", (int*)&item_num );
  135.   pGate->set_output_arg( "size"    , (int*)&size     );
  136.   pGate->set_output_arg( "log_it"  , (int*)&log_it   );
  137.   pGate->send_data();
  138.   int res;
  139.   if( pGate->get_input_arg("result", &res) != IGate::eGood ) {
  140.     comprot_errmsg();
  141.     return NULL;
  142.   }
  143.   if(res) {
  144.     CGW_SendDataCmd* p = new CGW_SendDataCmd(con, res);
  145.     return con->Create_SendDataCmd( *p );
  146.   }
  147.   else{
  148.     return NULL;
  149.   }
  150. }
  151. /* A more complex function than the rest:
  152.  * needs to handle all possible EDB_Type-s and memory allocation.
  153.  */
  154. CDB_Object* CGW_Result::GetItem(CDB_Object* item_buf)
  155. {
  156.   // Send the type and size to server (if they are available),
  157.   // so that an appropriate receiving object might be created.
  158.   int type = -1;
  159.   int size = -1;
  160.   if( item_buf!=NULL ) {
  161.     type = (int)( item_buf->GetType() );
  162.     CDB_Binary* objBinary = dynamic_cast<CDB_Binary*>(item_buf);
  163.     if(objBinary) {
  164.       size = objBinary->Size();
  165.     }
  166.     else {
  167.       CDB_Char* objChar = dynamic_cast<CDB_Char*>(item_buf);
  168.       if(objChar) {
  169.         size = objChar->Size();
  170.       }
  171.     }
  172.   }
  173.   IGate* pGate = conn->getProtocol();
  174.   C_GWLib_ObjectGetter::SContext callback_args( item_buf );
  175.   void* pOldUserData = pGate->get_user_data();
  176.   pGate->set_user_data(&callback_args);
  177.   pGate->set_RPC_call("GWLib:Result:GetItem");
  178.   pGate->set_output_arg( "object", &remoteObj );
  179.   pGate->set_output_arg( "type"  , &type      );
  180.   if(size>=0) {
  181.     pGate->set_output_arg( "size"  , &size      );
  182.   }
  183.   pGate->send_data();
  184.   //CDB_Object* obj=read_CDB_Object(pGate,item_buf);
  185.   //return obj;
  186.   pGate->set_user_data(pOldUserData);
  187.   if( callback_args.bError ) {
  188.     comprot_errmsg();
  189.     return 0;
  190.   }
  191.   return callback_args.obj;
  192. }
  193. size_t CGW_Result::ReadItem(void* buffer, size_t buffer_size, bool* is_null)
  194. {
  195.   //cerr << "CGW_Result::ReadItemn";
  196.   IGate* pGate = conn->getProtocol();
  197.   C_GWLib_Result_ReadItem::SContext callback_args( (char*)buffer, buffer_size, is_null );
  198.   void* pOldUserData = pGate->get_user_data();
  199.   pGate->set_user_data(&callback_args);
  200.   pGate->set_RPC_call("GWLib:Result:ReadItem");
  201.   pGate->set_output_arg( "object",       &remoteObj   );
  202.   pGate->set_output_arg( "size"  , (int*)&buffer_size );
  203.   pGate->send_data();
  204.   pGate->set_user_data(pOldUserData);
  205.   if( callback_args.bError ) {
  206.     comprot_errmsg();
  207.     return 0;
  208.   }
  209.   return callback_args.bytesReceived;
  210. }
  211. const char* CGW_Result::ItemName(unsigned int item_num) const
  212. {
  213.   char buf[1024];
  214.   const char* res = comprot_chars1( "GWLib:Result:ItemName", remoteObj, (int*)&item_num, buf, sizeof(buf) );
  215.   if(!res) return NULL;
  216.   //mapItemNames[item_num] = buf;
  217.   //return mapItemNames[item_num].c_str();
  218.   MapUnsignedToString* m = const_cast<MapUnsignedToString*>(&mapItemNames);
  219.   MapUnsignedToString::iterator it = (MapUnsignedToString::iterator) m->find(item_num);
  220.   if( it==m->end() ) {
  221.     m->insert( MapUnsignedToString::value_type(item_num,res) );
  222.     it = m->find(item_num);
  223.   }
  224.   else {
  225.     it->second = res;
  226.   }
  227.   return it->second.c_str();
  228. }
  229. CGWContext::CGWContext(CSSSConnection& sssConnection)
  230. {
  231.   conn = &sssConnection;
  232.   CProcBinCli* pBin = conn->getProcBin();
  233.   pBin->regProc( new C_GWLib_Result_ReadItem  () );
  234.   pBin->regProc( new C_GWLib_ObjectGetter     () );
  235.   pBin->regProc( new C_GWLib_TextImageCallback() );
  236.   pBin->regProc( new C_GWLib_MsgCallback      () );
  237.   remoteObj = comprot_int( "GWLib:Context:new", 0 );
  238. }
  239. size_t CGW_SendDataCmd::SendChunk(const void* pChunk, size_t nofBytes)
  240. {
  241.   IGate* pGate = conn->getProtocol();
  242.   pGate->set_RPC_call  ( "GWLib:SendDataCmd:SendChunk" );
  243.   pGate->set_output_arg( "object"  , &remoteObj      );
  244.   pGate->set_output_arg( "data", pChunk, (const unsigned*)&nofBytes );
  245.   pGate->send_data();
  246.   int res;
  247.   if( pGate->get_input_arg("result", &res) != IGate::eGood ) {
  248.     comprot_errmsg();
  249.     return 0;
  250.   }
  251.   return res;
  252. }
  253. bool CGW_LangCmd::SetParam(const string& param_name, CDB_Object* param_ptr)
  254. {
  255.   IGate* pGate = conn->getProtocol();
  256.   pGate->set_RPC_call( "GWLib:LangCmd:SetParam" );
  257.   pGate->set_output_arg( "object"  , &remoteObj      );
  258.   pGate->set_output_arg( "param_name", param_name.c_str() );
  259.   send_CDB_Object(pGate, param_ptr);
  260.   int res;
  261.   if( pGate->get_input_arg("result", &res) != IGate::eGood ) {
  262.     comprot_errmsg();
  263.     return false;
  264.   }
  265.   return res;
  266. }
  267. bool CGW_RPCCmd::SetParam(const string& param_name, CDB_Object* param_ptr, bool out_param)
  268. {
  269.   IGate* pGate = conn->getProtocol();
  270.   int i = out_param;
  271.   pGate->set_RPC_call( "GWLib:RPCCmd:SetParam" );
  272.   pGate->set_output_arg( "object"  , &remoteObj      );
  273.   pGate->set_output_arg( "param_name", param_name.c_str() );
  274.   pGate->set_output_arg( "out_param", &i );
  275.   send_CDB_Object(pGate, param_ptr);
  276.   int res;
  277.   if( pGate->get_input_arg("result", &res) != IGate::eGood ) {
  278.     comprot_errmsg();
  279.     return false;
  280.   }
  281.   return res;
  282. }
  283. bool CGW_LangCmd::Cancel()
  284. {
  285.   return CGW_BaseCmd::Cancel();
  286. }
  287. END_NCBI_SCOPE
  288. /*
  289.  * ===========================================================================
  290.  * $Log: gateway.cpp,v $
  291.  * Revision 1000.1  2004/06/01 19:21:09  gouriano
  292.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  293.  *
  294.  * Revision 1.7  2004/05/17 21:14:35  gorelenk
  295.  * Added include of PCH ncbi_pch.hpp
  296.  *
  297.  * Revision 1.6  2003/05/19 21:51:51  sapojnik
  298.  * Client portion of gateway driver back in C++ tree - now assembles as dll, and runs on Sparc Solaris
  299.  *
  300.  * Revision 1.13  2003/05/12 20:51:34  sapojnik
  301.  * register C_GWLib_MsgCallback
  302.  *
  303.  * Revision 1.12  2003/05/05 21:52:49  sapojnik
  304.  * CGW_CursorCmd::Open() - moved to bind_send.cpp
  305.  *
  306.  * Revision 1.11  2003/05/05 14:33:23  sapojnik
  307.  * CGW_LangCmd::Cancel()
  308.  *
  309.  * Revision 1.10  2003/04/30 14:22:44  sapojnik
  310.  * CGW_CursorCmd::UpdateTextImage() fixed
  311.  *
  312.  * Revision 1.9  2003/04/25 22:36:32  sapojnik
  313.  * CGW_Result::GetItem() can handle CDB_Stream-s; it uses the new C_GWLib_ObjectGetter
  314.  *
  315.  * Revision 1.8  2003/04/22 16:59:31  sapojnik
  316.  * read host, port from the "attr" hash
  317.  *
  318.  * Revision 1.7  2003/03/03 21:57:18  sapojnik
  319.  * debug diagnostic messages commented out
  320.  *
  321.  * Revision 1.6  2003/02/21 20:12:22  sapojnik
  322.  * many changes, mostly implementing and debugging BCP Bind/SendRow() (not completely debugged yet)
  323.  *
  324.  * Revision 1.5  2003/01/08 22:52:26  sapojnik
  325.  * *** empty log message ***
  326.  *
  327.  * Revision 1.4  2003/01/08 22:09:17  sapojnik
  328.  * bugfix in GW_CreateContext - do not delete CSSSConnection on return
  329.  *
  330.  * Revision 1.3  2002/12/03 16:43:02  sapojnik
  331.  * Driver manager related functions
  332.  *
  333.  * Revision 1.2  2002/11/27 21:11:22  sapojnik
  334.  * Bind/SetParam(), SendData(), sending CDB_Float/DoubleO. etc. implemented for various classes, not tested yet; it seems that only CGW_Connection::Push/PopMsgHandler() still remain
  335.  *
  336.  * Revision 1.1  2002/11/26 21:16:09  sapojnik
  337.  * first commit - not guaranteed to compile or to work
  338.  *
  339.  * Revision 1.5  2002/03/26 17:58:06  sapojnik
  340.  * Functions for sending/receiving CDB_Object-s moved to new gateway_common.lib
  341.  *
  342.  * Revision 1.4  2002/03/19 21:45:10  sapojnik
  343.  * some small bugs fixed after testing - the ones related to Connection:SendDataCmd,DropCmd; BaseCmd:Send
  344.  *
  345.  * Revision 1.3  2002/03/15 22:01:45  sapojnik
  346.  * more methods and classes
  347.  *
  348.  * Revision 1.2  2002/03/14 22:53:22  sapojnik
  349.  * Inheriting from I_ interfaces instead of CDB_ classes from driver/public.hpp
  350.  *
  351.  * Revision 1.1  2002/03/14 20:00:41  sapojnik
  352.  * A driver that communicates with a dbapi driver on another machine via CompactProtocol(aka ssssrv)
  353.  *
  354.  * Revision 1.2  2002/02/15 22:01:01  sapojnik
  355.  * uses CDB_Object::create() instead of new_CDB_Object()
  356.  *
  357.  * Revision 1.1  2002/02/13 20:41:18  sapojnik
  358.  * Remote dblib: MS SQL plus sss comprot
  359.  *
  360.  *
  361.  * ===========================================================================
  362.  */