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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: internal_cli.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/21 14:47:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_DRIVER_GATEWAY___INTERNAL_CLI__HPP
  10. #define DBAPI_DRIVER_GATEWAY___INTERNAL_CLI__HPP
  11. /* $Id: internal_cli.hpp,v 1000.1 2004/04/21 14:47:25 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Victor Sapojnikov
  37.  *
  38.  * File Description:
  39.  *   Functions/classes used inside the implementation of the dbapi gateway client.
  40.  *
  41.  */
  42. #include <dbapi/driver/gateway/interfaces.hpp>
  43. #include <dbgateway/cdb_object_send_read.hpp>
  44. #include <dbgateway/cdb_stream_methods.hpp>
  45. #include <dbapi/driver/util/parameters.hpp>
  46. #ifdef NCBI_OS_MSWIN
  47. #define DllExport   __declspec( dllexport )
  48. #else
  49. #define DllExport
  50. #endif
  51. BEGIN_NCBI_SCOPE
  52. /* Sends either an existing server I_ITDescriptor id ,
  53.  * or 3 strings needed to re-create desriptor from a client CDB_ITDescriptor.
  54.  * See also readITDescriptor().
  55.  */
  56. bool sendITDescriptor(IGate* pGate, I_ITDescriptor& desc);
  57. // A client callback invoked by comprot server from GWLib:Result:UpdateTextImage
  58. // and other RPCs.
  59. // Called multiple times ( once on each send_data() ) in responce to send_data() in:
  60. //   CGW_Text/Image::Read(),
  61. DllExport class C_GWLib_TextImageCallback : public CRegProcCli
  62. {
  63. public:
  64.   C_GWLib_TextImageCallback() : CRegProcCli("GWLib:_TextImageCallback") {}
  65.   struct SContext {
  66.     // In
  67.     // CDB_Stream* pStream;
  68.     // CDB_Params* pParams;
  69.     // Out
  70.     bool bError;
  71.     int result;
  72.     SContext() //(CDB_Stream* pStream_arg, CDB_Params* pParams_arg=NULL)
  73.     {
  74.       // pStream=pStream_arg;
  75.       // pParams=pParams_arg;
  76.       bError=false;
  77.       result=false;
  78.     }
  79.   };
  80.   virtual bool begin(IGate*) { return false; }
  81.   virtual void end(IGate*, bool) {}
  82.   virtual void exec(IGate* pGate);
  83. };
  84. // A client callback invoked by comprot server from GWLib:Result:ReadItem
  85. // May be called multiple times ( once on each send_data() ), to transfer
  86. // smaller chunks of blob data. This allows to save both client and server memory.
  87. DllExport class C_GWLib_Result_ReadItem : public CRegProcCli
  88. {
  89. public:
  90.   // In/out args to be passed to exec() from CGW_Result::ReadItem() via
  91.   // IGate::set/getUserData().
  92.   struct SContext {
  93.     // In
  94.     char* buffer;
  95.     bool* is_null;
  96.     size_t buffer_size;
  97.     // Out
  98.     bool bError;
  99.     size_t bytesReceived;
  100.     // Alternative in/out
  101.     //CDB_Stream* stream;
  102.     SContext(char* buffer_arg, size_t buffer_size_arg, bool* is_null_arg=NULL)
  103.     {
  104.       buffer      = buffer_arg;
  105.       buffer_size = buffer_size_arg;
  106.       is_null     = is_null_arg;
  107.       //stream      = NULL;
  108.       bError=false;
  109.       bytesReceived=0;
  110.     }
  111.     /*
  112.     SContext(CDB_Stream* stream_arg) // Assert it is not null
  113.     {
  114.       bError=false;
  115.       is_null=NULL;
  116.       stream=stream_arg;
  117.       stream->Truncate(0);
  118.     }
  119.     */
  120.   };
  121.   C_GWLib_Result_ReadItem() : CRegProcCli("GWLib:Result:ReadItem") {}
  122.   virtual bool begin(IGate*) { return false; }
  123.   virtual void end(IGate*, bool) {}
  124.   virtual void exec(IGate* pGate);
  125. };
  126. // A client callback invoked by comprot server from GWLib:ObjectGetter.
  127. // We cannot use C_GWLib_ObjectGetter on server, and this is why
  128. // stream content reading is not incorporated into read_CDB_Object().
  129. DllExport class C_GWLib_ObjectGetter : public CRegProcCli
  130. {
  131. public:
  132.   // In/out args to be passed to exec() from CGW_Result::ReadItem() via
  133.   // IGate::set/getUserData().
  134.   struct SContext {
  135.     CDB_Object* obj;
  136.     bool bError; // Out
  137.     bool bStreamAppend;
  138.     SContext(CDB_Object* obj_arg)
  139.     {
  140.       bError=false;
  141.       bStreamAppend=false;
  142.       obj=obj_arg;
  143.     }
  144.   };
  145.   C_GWLib_ObjectGetter() : CRegProcCli("GWLib:ObjectGetter") {}
  146.   virtual bool begin(IGate*) { return false; }
  147.   virtual void end(IGate*, bool) {}
  148.   virtual void exec(IGate* pGate);
  149. };
  150. DllExport class C_GWLib_MsgCallback : public CRegProcCli
  151. {
  152. public:
  153.   C_GWLib_MsgCallback() : CRegProcCli("GWLib:HandleMsg") {}
  154.   virtual bool begin(IGate*) { return false; }
  155.   virtual void end(IGate*, bool) {}
  156.   virtual void exec(IGate* pGate);
  157. };
  158. /////////////////////////////////////////////////////////////////////////
  159. //// Bound CDB_Object support (CDB_Stream-s, and all other compact types)
  160. /////////////////////////////////////////////////////////////////////////
  161. typedef pair<int,CDB_Object*> CRemoteLocalObjPair;
  162. // Filled in Bind/BindParam(), used in Send/SendRow().
  163. class CRLObjPairs : public vector<CRemoteLocalObjPair>
  164. {
  165. public:
  166.   void deleteRemoteObjects(); // Also cleans up the vector
  167.   ~CRLObjPairs()
  168.   {
  169.     deleteRemoteObjects();
  170.   }
  171.   /* Send "obj_ref", "type", "size" to pGate,
  172.    * retrieve remotely constructed object,
  173.    * add another CRemoteLocalObjPair to the vector.
  174.    */
  175.   void addObjPair(int remoteObj, CDB_Object* localObj)
  176.   {
  177.     //cerr << "addObjPair( remote=" << remoteObj;
  178.     //cerr << ", local=" << (int)localObj << " )n";
  179.     push_back( CRemoteLocalObjPair( remoteObj, localObj ) );
  180.   }
  181.   /* Transfer local object values to remote objects
  182.    * CDB_Text and CDB_Image objects are skipped here.
  183.    *
  184.    * Returns: number of CDB_Text or CDB_Image objects,
  185.    * -1 on error.
  186.    */
  187.   int updateRemoteObjs();
  188. };
  189. END_NCBI_SCOPE
  190. #endif  /* DBAPI_DRIVER_GATEWAY___INTERNAL_CLI__HPP */