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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: interfaces.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/21 14:47:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_DRIVER_GATEWAY___INTERFACES__HPP
  10. #define DBAPI_DRIVER_GATEWAY___INTERFACES__HPP
  11. /* $Id: interfaces.hpp,v 1000.1 2004/04/21 14:47:22 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.  *   A gateway to a remote database driver that is running on the sss server.
  40.  *
  41.  */
  42. #include <dbapi/driver/interfaces.hpp>
  43. #include <dbapi/driver/public.hpp>
  44. #include <dbapi/driver/util/handle_stack.hpp>
  45. #include <dbapi/driver/gateway/comprot_cli.hpp>
  46. #include <srv/igate.hpp>
  47. #include <map>
  48. BEGIN_NCBI_SCOPE
  49. // DllExport ...
  50. class CRLObjPairs;
  51. void DBAPI_RegisterDriver_GW(I_DriverMgr& mgr);
  52. class CGWContext;
  53. class CGW_Connection;
  54. class CGW_RPCCmd;
  55. class CGW_CursorCmd;
  56. class C_GWLib_MsgCallback;
  57. class CGW_Base
  58. {
  59.   friend class CGW_Connection;
  60. protected:
  61.   int remoteObj;
  62.   virtual void Release()
  63.   {
  64.     comprot_void("GWLib:Base:Release",remoteObj);
  65.   }
  66.   ~CGW_Base()
  67.   {
  68.     comprot_void("GWLib:Base:delete",remoteObj);
  69.   }
  70.   int xSend(const char* rpc_name, CRLObjPairs* boundObjects);
  71.   bool xBind(IGate* pGate, CDB_Object* localObj, CRLObjPairs** boundObjects);
  72.   CRLObjPairs* getBoundObjects(CRLObjPairs** ppVector); // Allocate vector on first request
  73. };
  74. class CGWContext : public I_DriverContext
  75. {
  76.   int remoteObj;
  77. public:
  78.   CGWContext(CSSSConnection& sssConnection);
  79.   virtual bool IsAbleTo(ECapability cpb) const
  80.   {
  81.     return comprot_bool1( "GWLib:Context:IsAbleTo", remoteObj, (int*)&cpb );
  82.   }
  83.   virtual bool SetLoginTimeout (unsigned int nof_secs = 0)
  84.   {
  85.     return comprot_bool1( "GWLib:Context:SetLoginTimeout", remoteObj, &nof_secs );
  86.   }
  87.   virtual bool SetTimeout(unsigned int nof_secs = 0)
  88.   {
  89.     return comprot_bool1( "GWLib:Context:SetTimeout", remoteObj, &nof_secs );
  90.   }
  91.   virtual bool SetMaxTextImageSize(size_t nof_bytes)
  92.   {
  93.     return comprot_bool1( "GWLib:Context:SetMaxTextImageSize", remoteObj, (int*)&nof_bytes );
  94.   }
  95.   virtual unsigned int NofConnections(const string& srv_name = kEmptyStr) const
  96.   {
  97.     return (unsigned int)(comprot_int1( "GWLib:Context:NofConnections", remoteObj, srv_name.c_str() ));
  98.   }
  99.   virtual ~CGWContext()
  100.   {
  101.     // cerr << "~CGWContext()n";
  102.     comprot_void( "GWLib:Context:delete", remoteObj );
  103.   }
  104.   virtual CDB_Connection* Connect(
  105.       const string&   srv_name,
  106.       const string&   user_name,
  107.       const string&   passwd,
  108.       TConnectionMode mode,
  109.       bool            reusable  = false,
  110.       const string&   pool_name = kEmptyStr);
  111. };
  112. struct SConnectionVars
  113. {
  114.   // These variables are not stored directly in CGW_Connection
  115.   // in order to make it possible to change them in const methods:
  116.   // ServerName(), UserName(), etc.
  117.   string m_Server, m_User, m_Password, m_PoolName;
  118. };
  119. class CGW_Connection : public I_Connection, CGW_Base
  120. {
  121.   friend class CGWContext;
  122.   friend class CGW_CursorCmd;
  123.   friend class C_GWLib_MsgCallback;
  124. protected:
  125.   CGWContext* localContext;
  126.   SConnectionVars* vars;
  127.   CGW_Connection(CGWContext* localContext_arg, int remoteObj_arg)
  128.   {
  129.     localContext = localContext_arg;
  130.     remoteObj    = remoteObj_arg;
  131.     vars = new SConnectionVars;
  132.   }
  133.   // virtual
  134.   ~CGW_Connection()
  135.   {
  136.     delete vars;
  137.     // Free server-side MsgHandler
  138.     comprot_void("GWLib:Connection:delete",remoteObj);
  139.   }
  140.   virtual bool IsAlive()
  141.   {
  142.     return comprot_bool( "GWLib:Connection:IsAlive", remoteObj );
  143.   }
  144.   virtual CDB_RPCCmd* RPC( const string& rpc_name, unsigned int nof_args);
  145.   virtual CDB_LangCmd* LangCmd(const string&  lang_query, unsigned int nof_params = 0);
  146.   virtual CDB_BCPInCmd* BCPIn(const string&  table_name, unsigned int   nof_columns);
  147.   virtual CDB_CursorCmd* Cursor(
  148.     const string&  cursor_name,
  149.     const string&  query,
  150.     unsigned int   nof_params,
  151.     unsigned int   batch_size = 1);
  152.   virtual CDB_SendDataCmd* SendDataCmd(
  153.     I_ITDescriptor& desc,
  154.     size_t          data_size,
  155.     bool            log_it = true);
  156.   virtual bool Refresh()
  157.   {
  158.     return comprot_bool("GWLib:Connection:Refresh", remoteObj);
  159.   }
  160.   virtual const string& ServerName() const;
  161.   virtual const string& UserName()   const;
  162.   virtual const string& Password()   const;
  163.   virtual const string& PoolName()   const;
  164.   virtual I_DriverContext::TConnectionMode ConnectMode() const
  165.   {
  166.     return (I_DriverContext::TConnectionMode)
  167.       comprot_int("GWLib:Connection:ConnectMode", remoteObj);
  168.   }
  169.   virtual bool IsReusable() const
  170.   {
  171.     return comprot_bool("GWLib:Connection:IsReusable", remoteObj);
  172.   }
  173.   virtual I_DriverContext* Context() const
  174.   {
  175.     return localContext;
  176.   }
  177.   // void DropCmd(CDB_BaseEnt& cmd);
  178.   virtual bool xSendData(I_ITDescriptor& desc, CDB_Stream* img, bool log_it = true);
  179.   virtual bool SendData(I_ITDescriptor& desc, CDB_Image& img, bool log_it = true);
  180.   virtual bool SendData(I_ITDescriptor& desc, CDB_Text&  txt, bool log_it = true);
  181.   virtual CDB_ResultProcessor* SetResultProcessor(CDB_ResultProcessor* rp) { return NULL; }
  182.   virtual void PushMsgHandler(CDB_UserHandler* /*h*/);
  183.   virtual void PopMsgHandler (CDB_UserHandler* /*h*/);
  184.   // virtual void Release() {}
  185.   CDBHandlerStack m_MsgHandlers;
  186. };
  187. class CGW_BaseCmd : public I_BaseCmd, public CGW_Base
  188. {
  189. protected:
  190.   CRLObjPairs* boundObjects;
  191. public:
  192.   CGW_BaseCmd()
  193.   {
  194.     boundObjects=NULL;
  195.   }
  196.   virtual bool Send();
  197.   virtual bool WasSent() const
  198.   {
  199.     return comprot_bool("GWLib:BaseCmd:WasSent", remoteObj);
  200.   }
  201.   // Cancel the command execution
  202.   virtual bool Cancel();
  203.   virtual bool WasCanceled() const
  204.   {
  205.     return comprot_bool("GWLib:BaseCmd:WasCanceled", remoteObj);
  206.   }
  207.   // Get result set
  208.   virtual CDB_Result* Result();
  209.   virtual bool HasMoreResults() const
  210.   {
  211.     return comprot_bool( "GWLib:BaseCmd:HasMoreResults", remoteObj );
  212.   }
  213.   // Check if command has failed
  214.   virtual bool HasFailed() const
  215.   {
  216.     return comprot_bool("GWLib:BaseCmd:HasFailed", remoteObj );
  217.   }
  218.   // Get the number of rows affected by the command
  219.   // Special case:  negative on error or if there is no way that this
  220.   //                command could ever affect any rows (like PRINT).
  221.   virtual int RowCount() const
  222.   {
  223.     return comprot_int("GWLib:BaseCmd:RowCount", remoteObj );
  224.   }
  225.   // Destructor
  226.   virtual ~CGW_BaseCmd();
  227. };
  228. class CGW_LangCmd : public I_LangCmd, CGW_BaseCmd
  229. {
  230.   friend class CGW_Connection;
  231. protected:
  232.   CGW_Connection* con;
  233.   CGW_LangCmd(CGW_Connection* con_arg, int remoteObj_arg)
  234.   {
  235.     con       = con_arg;
  236.     remoteObj = remoteObj_arg;
  237.   }
  238.   virtual bool More(const string& query_text)
  239.   {
  240.     return comprot_bool1("GWLib:LangCmd:More", remoteObj, query_text.c_str() );
  241.   }
  242.   virtual bool BindParam(const string& param_name, CDB_Object* param_ptr);
  243.   virtual bool SetParam(const string& param_name, CDB_Object* param_ptr);
  244.   virtual bool Send()
  245.   {
  246.     // ?? send bound params ??
  247.     return CGW_BaseCmd::Send();
  248.   }
  249.   virtual bool WasSent() const
  250.   {
  251.     return CGW_BaseCmd::WasSent();
  252.   }
  253.   virtual bool Cancel();
  254.   /*
  255.   {
  256.     return CGW_BaseCmd::Cancel();
  257.   }
  258.   */
  259.   virtual bool WasCanceled() const
  260.   {
  261.     return CGW_BaseCmd::WasCanceled();
  262.   }
  263.   virtual CDB_Result* Result()
  264.   {
  265.     return CGW_BaseCmd::Result();
  266.   }
  267.   virtual bool HasMoreResults() const
  268.   {
  269.     return CGW_BaseCmd::HasMoreResults();
  270.   }
  271.   virtual bool HasFailed() const
  272.   {
  273.     return CGW_BaseCmd::HasFailed();
  274.   }
  275.   virtual int  RowCount() const
  276.   {
  277.     return CGW_BaseCmd::RowCount();
  278.   }
  279.   virtual void DumpResults()
  280.   {
  281.     comprot_void("GWLib:LangCmd:DumpResults",remoteObj);
  282.   }
  283. };
  284. class CGW_RPCCmd : public I_RPCCmd, CGW_BaseCmd
  285. {
  286.   friend class CGW_Connection;
  287. protected:
  288.   CGW_Connection* con;
  289.   CGW_RPCCmd(CGW_Connection* con_arg, int remoteObj_arg)
  290.   {
  291.     con       = con_arg;
  292.     remoteObj = remoteObj_arg;
  293.   }
  294.   virtual bool BindParam(const string& param_name, CDB_Object* param_ptr, bool out_param = false);
  295.   virtual bool SetParam(const string& param_name, CDB_Object* param_ptr, bool out_param = false);
  296.   virtual bool Send()
  297.   {
  298.     // ?? send bound params ??
  299.     return CGW_BaseCmd::Send();
  300.   }
  301.   virtual bool WasSent() const
  302.   {
  303.     return CGW_BaseCmd::WasSent();
  304.   }
  305.   virtual bool Cancel()
  306.   {
  307.     return CGW_BaseCmd::Cancel();
  308.   }
  309.   virtual bool WasCanceled() const
  310.   {
  311.     return CGW_BaseCmd::WasCanceled();
  312.   }
  313.   virtual CDB_Result* Result()
  314.   {
  315.     return CGW_BaseCmd::Result();
  316.   }
  317.   virtual bool HasMoreResults() const
  318.   {
  319.     return CGW_BaseCmd::HasMoreResults();
  320.   }
  321.   virtual bool HasFailed() const
  322.   {
  323.     return CGW_BaseCmd::HasFailed();
  324.   }
  325.   virtual int  RowCount() const
  326.   {
  327.     return CGW_BaseCmd::RowCount();
  328.   }
  329.   virtual void SetRecompile(bool recompile = true)
  330.   {
  331.     int i = (int)recompile;
  332.     comprot_void1("GWLib:RPCCmd:SetRecompile", remoteObj, &i );
  333.   }
  334.   virtual void DumpResults()
  335.   {
  336.     comprot_void("GWLib:RPCCmd:DumpResults",remoteObj);
  337.   }
  338. };
  339. class CGW_BCPInCmd : public I_BCPInCmd, CGW_Base
  340. {
  341.   friend class CGW_Connection;
  342. protected:
  343.   CGW_Connection* con;
  344.   CRLObjPairs* boundObjects;
  345.   CGW_BCPInCmd(CGW_Connection* con_arg, int remoteObj_arg)
  346.   {
  347.     con       = con_arg;
  348.     remoteObj = remoteObj_arg;
  349.     boundObjects=NULL;
  350.   }
  351.   // Binding
  352.   virtual bool Bind(unsigned int column_num, CDB_Object* param_ptr);
  353.   // Send row to the server
  354.   virtual bool SendRow();
  355.   // Complete batch -- to store all rows transferred so far in this batch
  356.   // into the table
  357.   virtual bool CompleteBatch()
  358.   {
  359.     return comprot_bool( "GWLib:BCPInCmd:CompleteBatch", remoteObj );
  360.   }
  361.   // Cancel the BCP command
  362.   virtual bool Cancel();
  363.   // Complete the BCP and store all rows transferred in last batch
  364.   // into the table
  365.   virtual bool CompleteBCP();
  366.   ~CGW_BCPInCmd();
  367. };
  368. class CGW_CursorCmd : public I_CursorCmd, CGW_Base
  369. {
  370.   friend class CGW_Connection;
  371. protected:
  372.   CGW_Connection* con;
  373.   CRLObjPairs* boundObjects;
  374.   CGW_CursorCmd(CGW_Connection* con_arg, int remoteObj_arg)
  375.   {
  376.     con       = con_arg;
  377.     remoteObj = remoteObj_arg;
  378.     boundObjects = NULL;
  379.   }
  380.   // Not implemented
  381.   virtual bool BindParam(const string& name, CDB_Object* param_ptr);
  382.   // Open the cursor.
  383.   // Return NULL if cursor resulted in no data.
  384.   // Throw exception on error.
  385.   virtual CDB_Result* Open();
  386.   // Update the last fetched row.
  387.   // NOTE: the cursor must be declared for update in CDB_Connection::Cursor()
  388.   virtual bool Update(const string& table_name, const string& upd_query)
  389.   {
  390.     return comprot_int2(
  391.       "GWLib:CursorCmd:Update", remoteObj,
  392.       "table_name", table_name.c_str(),
  393.       "upd_query", upd_query.c_str() );
  394.   }
  395.   virtual bool UpdateTextImage(unsigned int item_num, CDB_Stream& data,
  396.                                 bool log_it = true);
  397.   virtual CDB_SendDataCmd* SendDataCmd(
  398.       unsigned int item_num, size_t size, bool log_it = true);
  399.   // Delete the last fetched row.
  400.   // NOTE: the cursor must be declared for delete in CDB_Connection::Cursor()
  401.   virtual bool Delete(const string& table_name)
  402.   {
  403.     return comprot_bool1("GWLib:CursorCmd:Delete", remoteObj, table_name.c_str() );
  404.   }
  405.   // Get the number of fetched rows
  406.   // Special case:  negative on error or if there is no way that this
  407.   //                command could ever affect any rows (like PRINT).
  408.   virtual int RowCount() const
  409.   {
  410.     return comprot_int("GWLib:CursorCmd:RowCount", remoteObj);
  411.   }
  412.   // Close the cursor.
  413.   // Return FALSE if the cursor is closed already (or not opened yet)
  414.   virtual bool Close();
  415.   ~CGW_CursorCmd();
  416. };
  417. class CGW_SendDataCmd : public I_SendDataCmd, CGW_Base
  418. {
  419.   friend class CGW_Connection;
  420.   friend class CGW_CursorCmd;
  421. protected:
  422.   CGW_Connection* con;
  423.   CGW_SendDataCmd(CGW_Connection* con_arg, int remoteObj_arg)
  424.   {
  425.     con       = con_arg;
  426.     remoteObj = remoteObj_arg;
  427.   }
  428.   // Send chunk of data to the server.
  429.   // Return number of bytes actually transferred to server.
  430.   virtual size_t SendChunk(const void* pChunk, size_t nofBytes);
  431. };
  432. class CGW_ITDescriptor : public I_ITDescriptor
  433. {
  434. private:
  435.   int remoteObj;
  436. public:
  437.   CGW_ITDescriptor(int remoteObj_arg)
  438.   {
  439.     remoteObj = remoteObj_arg;
  440.   }
  441.   int getRemoteObj()
  442.   {
  443.     return remoteObj;
  444.   }
  445.   int DescriptorType() const
  446.   {
  447.     return comprot_int("GWLib:ITDescriptor:DescriptorType", remoteObj);
  448.   }
  449. };
  450. class CGW_Result : public I_Result, CGW_Base
  451. {
  452. protected:
  453.   typedef map<unsigned,string> MapUnsignedToString;
  454.   MapUnsignedToString mapItemNames;
  455. public:
  456.   CGW_Result(int remoteObj_arg)
  457.   {
  458.     remoteObj = remoteObj_arg;
  459.   }
  460.   // ~CGW_Result() { mapItemNames.clear(); }
  461.   virtual EDB_ResType ResultType() const
  462.   {
  463.     return (EDB_ResType)comprot_int("GWLib:Result:ResultType",remoteObj);
  464.   }
  465.   // Get # of columns in the result
  466.   virtual unsigned int NofItems() const
  467.   {
  468.     return comprot_int("GWLib:Result:NofItems",remoteObj);
  469.   }
  470.   // Get name of a result item; returnr NULL if "item_num" >= NofItems().
  471.   virtual const char* ItemName(unsigned int item_num) const;
  472.   // Get size (in bytes) of a result item.
  473.   // Return zero if "item_num" >= NofItems().
  474.   virtual size_t ItemMaxSize(unsigned int item_num) const
  475.   {
  476.     return comprot_int1("GWLib:Result:ItemMaxSize",remoteObj,(int*)&item_num);
  477.   }
  478.   // Get datatype of a result item.
  479.   // Return 'eDB_UnsupportedType' if "item_num" >= NofItems().
  480.   virtual EDB_Type ItemDataType(unsigned int item_num) const
  481.   {
  482.     return (EDB_Type) comprot_int1("GWLib:Result:ItemDataType",remoteObj,(int*)&item_num);
  483.   }
  484.   // Fetch next row.
  485.   // Return FALSE if no more rows to fetch. Throw exception on any error.
  486.   virtual bool Fetch()
  487.   {
  488.     return comprot_bool( "GWLib:Result:Fetch", remoteObj );
  489.   }
  490.   // Return current item number we can retrieve (0,1,...)
  491.   // Return "-1" if no more items left (or available) to read.
  492.   virtual int CurrentItemNo() const
  493.   {
  494.     return comprot_int( "GWLib:Result:CurrentItemNo", remoteObj );
  495.   }
  496.   // Get a result item (you can use either GetItem or ReadItem).
  497.   // If "item_buf" is not NULL, then use "*item_buf" (its type should be
  498.   // compatible with the type of retrieved item!) to retrieve the item to;
  499.   // otherwise allocate new "CDB_Object".
  500.   virtual CDB_Object* GetItem(CDB_Object* item_buf = 0);
  501.   // Read a result item body (for text/image mostly).
  502.   // Return number of successfully read bytes.
  503.   // Set "*is_null" to TRUE if the item is <NULL>.
  504.   // Throw an exception on any error.
  505.   virtual size_t ReadItem(void* buffer, size_t buffer_size,
  506.                           bool* is_null = 0);
  507.   // Get a descriptor for text/image column (for SendData).
  508.   // Return NULL if this result does not (or cannot) have img/text descriptor.
  509.   // NOTE: you need to call ReadItem (maybe even with buffer_size == 0)
  510.   //       before calling this method!
  511.   virtual I_ITDescriptor* GetImageOrTextDescriptor()
  512.   {
  513.     int res = comprot_int( "GWLib:Result:GetImageOrTextDescriptor", remoteObj );
  514.     if(res) {
  515.       return new CGW_ITDescriptor(res);
  516.     }
  517.     else{
  518.       return NULL;
  519.     }
  520.   }
  521.   // Skip result item
  522.   virtual bool SkipItem()
  523.   {
  524.     return comprot_bool( "GWLib:Result:SkipItem", remoteObj );
  525.   }
  526. };
  527. END_NCBI_SCOPE
  528. #endif  /* DBAPI_DRIVER_GATEWAY___INTERFACES__HPP */
  529. /*
  530.  * ===========================================================================
  531.  * $Log: interfaces.hpp,v $
  532.  * Revision 1000.1  2004/04/21 14:47:22  gouriano
  533.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.7
  534.  *
  535.  * Revision 1.7  2003/07/16 17:33:11  sapojnik
  536.  * SetResultProcessor(), DumpResults() - almost empty implementations
  537.  *
  538.  * Revision 1.6  2003/05/19 21:51:51  sapojnik
  539.  * Client portion of gateway driver back in C++ tree - now assembles as dll, and runs on Sparc Solaris
  540.  *
  541.  * Revision 1.9  2003/05/12 20:53:31  sapojnik
  542.  * class C_GWLib_MsgCallback,  CGW_Connection::Push/PopMsgHandler()
  543.  *
  544.  * Revision 1.8  2003/05/05 21:53:33  sapojnik
  545.  * CGWBase::xSend() returns int
  546.  *
  547.  * Revision 1.7  2003/05/05 14:36:06  sapojnik
  548.  * CGW_Base::xBind(),xSend() and boundObjects member in classes with Send/Bind()
  549.  *
  550.  * Revision 1.6  2003/02/21 20:12:22  sapojnik
  551.  * many changes, mostly implementing and debugging BCP Bind/SendRow()
  552.  *
  553.  * Revision 1.5  2003/01/08 22:52:27  sapojnik
  554.  * *** empty log message ***
  555.  *
  556.  * Revision 1.4  2003/01/08 22:11:07  sapojnik
  557.  * RPCCmd:SetRecompile - do send flag vlue
  558.  *
  559.  * Revision 1.3  2002/12/03 16:43:25  sapojnik
  560.  * *** empty log message ***
  561.  *
  562.  * Revision 1.2  2002/11/27 21:11:22  sapojnik
  563.  * Bind/SetParam(), SendData(), sending CDB_Float/DoubleO. etc.
  564.  * implemented for various classes, not tested yet;
  565.  * it seems that only CGW_Connection::Push/PopMsgHandler() still remain.
  566.  *
  567.  * ===========================================================================
  568.  */