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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bind_send.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:21:00  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: bind_send.cpp,v 1000.1 2004/06/01 19:21:00 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.  *   Support for various Bind*() and Send*() methods in CGW_*Cmd classes.
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <dbapi/driver/gateway/internal_cli.hpp>
  42. #ifdef NCBI_OS_MSWIN
  43. #define DllExport   __declspec( dllexport )
  44. #else
  45. #define DllExport
  46. #endif
  47. BEGIN_NCBI_SCOPE
  48. // Assign value to already existing remote CDB_Object
  49. bool assign_CDB_Object(int remoteObj, CDB_Object* localObj)
  50. {
  51.   IGate* pGate = conn->getProtocol();
  52.   pGate->set_RPC_call( "GWLib:Object:AssignValue" );
  53.   pGate->set_output_arg( "object", &remoteObj);
  54.   // cerr << "assign_CDB_Object ( remote=" << remoteObj;
  55.   // cerr << " <= local=" << localObj << " )n";
  56.   send_CDB_Object(pGate, localObj);
  57.   pGate->send_done();
  58.   int res;
  59.   if( pGate->get_input_arg("result", &res) != IGate::eGood ) {
  60.     comprot_errmsg();
  61.     return false;
  62.   }
  63.   return res;
  64. }
  65. CRLObjPairs* CGW_Base::getBoundObjects(CRLObjPairs** ppVector)
  66. {
  67.   if(*ppVector==NULL) {
  68.     *ppVector=new CRLObjPairs();
  69.   }
  70.   return *ppVector;
  71. }
  72. /* The common part of various Bind*() commands.
  73.  * Initiates creation of empty CDB_Object on server;
  74.  * gets back its id;
  75.  * stores it paired with localObj in boundObjects vector.
  76.  */
  77. bool CGW_Base::xBind(IGate* pGate, CDB_Object* localObj, CRLObjPairs** boundObjects)
  78. {
  79.   pGate->set_output_arg( "object", &remoteObj);
  80.   send_CDB_ObjTS(pGate, localObj);
  81.   int remoteDataObj;
  82.   if( pGate->get_input_arg("cdb_object", &remoteDataObj) != IGate::eGood ) {
  83.     comprot_errmsg();
  84.     return false;
  85.   }
  86.   getBoundObjects(boundObjects)->addObjPair(remoteDataObj, localObj);
  87.   int res;
  88.   if( pGate->get_input_arg("result", &res) != IGate::eGood ) {
  89.     comprot_errmsg();
  90.     return false;
  91.   }
  92.   return res;
  93. }
  94. bool CGW_BaseCmd::Send()
  95. {
  96.   return xSend("GWLib:BaseCmd:Send", boundObjects);
  97. }
  98. int CGW_Base::xSend(const char* rpc_name, CRLObjPairs* boundObjects)
  99. {
  100.   IGate* pGate = conn->getProtocol();
  101.   // Send to server the values of all boundObjects (except CDB_Text/Image)
  102.   if(boundObjects) {
  103.     boundObjects->updateRemoteObjs();
  104.   }
  105.   // May need a callback to handle CDB_Text/Image
  106.   void* pOldUserData = pGate->get_user_data();
  107.   C_GWLib_TextImageCallback::SContext callback_args;
  108.   pGate->set_user_data((void*)&callback_args);
  109.   /* Change mode to ensure that nested callbacks work properly:
  110.      cli: CGW_BCPInCmd::SendRow()
  111.      srv:   CGW_Stream_Read()
  112.      cli:     C_GWLib_TextImageCallback()
  113.      srv:       CGW_Stream_DataReceiver::procEvent()
  114.   */
  115.   IGate::ETransmissionMode oldMode=pGate->get_transmission_mode();
  116.   pGate->set_no_bulk();
  117.   pGate->set_RPC_call  ( rpc_name );
  118.   pGate->set_output_arg( "object", &remoteObj     );
  119.   pGate->send_data();
  120.   pGate->send_done();
  121.   pGate->set_user_data(pOldUserData);
  122.   pGate->set_transmission_mode(oldMode);
  123.   if( callback_args.bError ) {
  124.     comprot_errmsg();
  125.     return false;
  126.   }
  127.   return callback_args.result;
  128. }
  129. bool CGW_BCPInCmd::Cancel()
  130. {
  131.   if(boundObjects) {
  132.     boundObjects->deleteRemoteObjects();
  133.   }
  134.   return comprot_bool( "GWLib:BCPInCmd:Cancel", remoteObj );
  135. }
  136. bool CGW_BaseCmd::Cancel()
  137. {
  138.   if(boundObjects) {
  139.     boundObjects->deleteRemoteObjects();
  140.   }
  141.   return comprot_bool( "GWLib:BaseCmd:Cancel", remoteObj );
  142. }
  143. bool CGW_LangCmd::BindParam(const string& param_name, CDB_Object* param_ptr)
  144. {
  145.   IGate* pGate = conn->getProtocol();
  146.   pGate->set_RPC_call( "GWLib:LangCmd:BindParam" );
  147.   pGate->set_output_arg( "param_name", param_name.c_str() );
  148.   return xBind(pGate, param_ptr, &boundObjects);
  149. }
  150. bool CGW_RPCCmd::BindParam(const string& param_name, CDB_Object* param_ptr, bool out_param)
  151. {
  152.   IGate* pGate = conn->getProtocol();
  153.   int i = out_param;
  154.   pGate->set_RPC_call( "GWLib:RPCCmd:BindParam" );
  155.   pGate->set_output_arg( "param_name", param_name.c_str() );
  156.   pGate->set_output_arg( "out_param", &i );
  157.   return xBind(pGate, param_ptr, &boundObjects);
  158. }
  159. bool CGW_CursorCmd::BindParam(const string& param_name, CDB_Object* param_ptr)
  160. {
  161.   IGate* pGate = conn->getProtocol();
  162.   pGate->set_RPC_call( "GWLib:CursorCmd:BindParam" );
  163.   pGate->set_output_arg( "param_name", param_name.c_str() );
  164.   return xBind(pGate, param_ptr, &boundObjects);
  165. }
  166. CDB_Result* CGW_CursorCmd::Open()
  167. {
  168.   int remoteResult = xSend( "GWLib:CursorCmd:Open", boundObjects );
  169.   if(remoteResult) {
  170.     CGW_Result* p = new CGW_Result(remoteResult);
  171.     return Create_Result( *p );
  172.   }
  173.   else {
  174.     return NULL;
  175.   }
  176. }
  177. bool CGW_BCPInCmd::Bind(unsigned int column_num, CDB_Object* localObj)
  178. {
  179.   IGate* pGate = conn->getProtocol();
  180.   pGate->set_RPC_call( "GWLib:BCPInCmd:Bind" );
  181.   pGate->set_output_arg( "column_num", (int*)&column_num );
  182.   return xBind(pGate, localObj, &boundObjects);
  183. }
  184. bool CGW_BCPInCmd::SendRow()
  185. {
  186.   return xSend("GWLib:BCPInCmd:SendRow", boundObjects);
  187. }
  188. bool CGW_BCPInCmd::CompleteBCP()
  189. {
  190.   if(boundObjects) {
  191.     boundObjects->deleteRemoteObjects();
  192.   }
  193.   return comprot_bool( "GWLib:BCPInCmd:CompleteBCP", remoteObj );
  194. }
  195. /////////////////////////////////////////////////////////////////////////
  196. //// Bound CDB_Object support (except CDB_Stream-s ?)
  197. /////////////////////////////////////////////////////////////////////////
  198. int CRLObjPairs::updateRemoteObjs()
  199. {
  200.   int imageTextCount = 0;
  201.   for( iterator it = begin(); it != end(); ++it) {
  202.     CDB_Object* localObj = it->second;
  203.     EDB_Type localType = localObj->GetType();
  204.     if( localType == eDB_Text || localType == eDB_Image )
  205. imageTextCount++;
  206.     if( !assign_CDB_Object(it->first, localObj) ) {
  207. return -1;
  208. }
  209.   }
  210.   return imageTextCount;
  211. }
  212. void CRLObjPairs::deleteRemoteObjects()
  213. {
  214.   IGate* pGate = conn->getProtocol();
  215.   for( iterator it = begin(); it != end(); ++it) {
  216.     int remoteObj = it->first;
  217.     pGate->set_RPC_call( "GWLib:Object:delete" );
  218.     pGate->set_output_arg( "object", &remoteObj);
  219.     pGate->send_data();
  220.   }
  221.   clear();
  222. }
  223. CGW_BaseCmd::~CGW_BaseCmd()
  224. {
  225.   if(boundObjects) {
  226.     delete boundObjects; // this also invokes CRLObjPairs::deleteRemoteObjects();
  227.                           // which may need to communicate with server
  228.     boundObjects=0;
  229.   }
  230. }
  231. CGW_BCPInCmd::~CGW_BCPInCmd()
  232. {
  233.   if(boundObjects) {
  234.     delete boundObjects; // this also invokes CRLObjPairs::deleteRemoteObjects();
  235.                           // which may need to communicate with server
  236.     boundObjects=0;
  237.   }
  238. }
  239. CGW_CursorCmd::~CGW_CursorCmd()
  240. {
  241.   if(boundObjects) {
  242.     delete boundObjects; // this also invokes CRLObjPairs::deleteRemoteObjects();
  243.                           // which may need to communicate with server
  244.     boundObjects=0;
  245.   }
  246. }
  247. bool CGW_CursorCmd::Close()
  248. {
  249.   if(boundObjects) {
  250.     boundObjects->deleteRemoteObjects();
  251.   }
  252.   return comprot_bool("GWLib:CursorCmd:Close", remoteObj);
  253. }
  254. END_NCBI_SCOPE
  255. /*
  256.  * ===========================================================================
  257.  * $Log: bind_send.cpp,v $
  258.  * Revision 1000.1  2004/06/01 19:21:00  gouriano
  259.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  260.  *
  261.  * Revision 1.2  2004/05/17 21:14:35  gorelenk
  262.  * Added include of PCH ncbi_pch.hpp
  263.  *
  264.  * Revision 1.1  2003/05/19 21:51:51  sapojnik
  265.  * Client portion of gateway driver back in C++ tree - now assembles as dll, and runs on Sparc Solaris
  266.  *
  267.  * Revision 1.5  2003/05/05 21:51:56  sapojnik
  268.  * CGW_CursorCmd::Open()
  269.  *
  270.  * Revision 1.4  2003/05/05 14:27:16  sapojnik
  271.  * CGW_Base::xBind(),xSend() and boundObjects member in classes with Send/Bind()
  272.  *
  273.  * Revision 1.3  2003/04/22 17:02:17  sapojnik
  274.  * bugfix: GWLib:Object:delete separate from GWLib:Base:delete
  275.  *
  276.  * Revision 1.2  2003/03/03 22:02:16  sapojnik
  277.  * CGW_BCPInCmd finally debugged
  278.  *
  279.  * Revision 1.1  2003/02/21 20:10:25  sapojnik
  280.  * many changes, mostly implementing and debugging BCP Bind/SendRow() (not completely debugged yet)
  281.  *
  282.  *
  283.  * ===========================================================================
  284.  */