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:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_DRIVER_ODBC___INTERFACES__HPP
  10. #define DBAPI_DRIVER_ODBC___INTERFACES__HPP
  11. /* $Id: interfaces.hpp,v 1000.1 2004/04/21 14:47:31 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:  Vladimir Soussov
  37.  *
  38.  * File Description:  Driver for MS-SQL server (odbc version)
  39.  *
  40.  */
  41. #include <dbapi/driver/public.hpp>
  42. #include <dbapi/driver/util/parameters.hpp>
  43. #ifdef NCBI_OS_MSWIN
  44. #include <windows.h>
  45. #endif
  46. #include <sql.h>
  47. #include <sqlext.h>
  48. #include <sqltypes.h>
  49. BEGIN_NCBI_SCOPE
  50. class CODBCContext;
  51. class CODBC_Connection;
  52. class CODBC_LangCmd;
  53. class CODBC_RPCCmd;
  54. class CODBC_CursorCmd;
  55. class CODBC_BCPInCmd;
  56. class CODBC_SendDataCmd;
  57. class CODBC_RowResult;
  58. class CODBC_ParamResult;
  59. class CODBC_ComputeResult;
  60. class CODBC_StatusResult;
  61. /////////////////////////////////////////////////////////////////////////////
  62. //
  63. //  CODBC_Reporter::
  64. //
  65. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_Reporter
  66. {
  67. public:
  68.     CODBC_Reporter(CDBHandlerStack* hs, SQLSMALLINT ht, SQLHANDLE h) :
  69.         m_HStack(hs), m_HType(ht), m_Handle(h) {}
  70.     void ReportErrors();
  71.     void SetHandlerStack(CDBHandlerStack* hs) {
  72.         m_HStack= hs;
  73.     }
  74.     void SetHandle(SQLHANDLE h) {
  75.         m_Handle= h;
  76.     }
  77. void SetHandleType(SQLSMALLINT ht) {
  78. m_HType= ht;
  79. }
  80. private:
  81.     CODBC_Reporter();
  82.     CDBHandlerStack* m_HStack;
  83.     SQLHANDLE m_Handle;
  84.     SQLSMALLINT m_HType;
  85. };
  86. /////////////////////////////////////////////////////////////////////////////
  87. //
  88. //  CODBCContext::
  89. //
  90. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBCContext : public I_DriverContext
  91. {
  92.     friend class CDB_Connection;
  93. public:
  94.     CODBCContext(SQLINTEGER version = SQL_OV_ODBC3, bool use_dsn= false);
  95.     //
  96.     // GENERIC functionality (see in <dbapi/driver/interfaces.hpp>)
  97.     //
  98.     virtual bool SetLoginTimeout (unsigned int nof_secs = 0);
  99.     virtual bool SetTimeout      (unsigned int nof_secs = 0);
  100.     virtual bool SetMaxTextImageSize(size_t nof_bytes);
  101.     virtual CDB_Connection* Connect(const string&   srv_name,
  102.                                     const string&   user_name,
  103.                                     const string&   passwd,
  104.                                     TConnectionMode mode,
  105.                                     bool            reusable  = false,
  106.                                     const string&   pool_name = kEmptyStr);
  107.     virtual bool IsAbleTo(ECapability cpb) const {return false;}
  108.     virtual ~CODBCContext();
  109.     //
  110.     // ODBC specific functionality
  111.     //
  112.     // the following methods are optional (driver will use the default values
  113.     // if not called), the values will affect the new connections only
  114.     virtual void ODBC_SetPacketSize(SQLUINTEGER packet_size);
  115.     virtual SQLHENV ODBC_GetContext() const;
  116. private:
  117.     SQLHENV     m_Context;
  118.     SQLUINTEGER m_PacketSize;
  119.     SQLUINTEGER m_LoginTimeout;
  120.     SQLUINTEGER m_Timeout;
  121.     SQLUINTEGER m_TextImageSize;
  122.     CODBC_Reporter m_Reporter;
  123.     bool m_UseDSN;
  124.     SQLHDBC x_ConnectToServer(const string&   srv_name,
  125.        const string&   usr_name,
  126.        const string&   passwd,
  127.        TConnectionMode mode);
  128.     void xReportConError(SQLHDBC con);
  129. };
  130. /////////////////////////////////////////////////////////////////////////////
  131. //
  132. //  CODBC_Connection::
  133. //
  134. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_Connection : public I_Connection
  135. {
  136.     friend class CODBCContext;
  137.     friend class CDB_Connection;
  138.     friend class CODBC_LangCmd;
  139.     friend class CODBC_RPCCmd;
  140.     friend class CODBC_CursorCmd;
  141.     friend class CODBC_BCPInCmd;
  142.     friend class CODBC_SendDataCmd;
  143. protected:
  144.     CODBC_Connection(CODBCContext* cntx, SQLHDBC con,
  145.      bool reusable, const string& pool_name);
  146.     virtual bool IsAlive();
  147.     virtual CDB_LangCmd*     LangCmd     (const string&   lang_query,
  148.                                           unsigned int    nof_params = 0);
  149.     virtual CDB_RPCCmd*      RPC         (const string&   rpc_name,
  150.                                           unsigned int    nof_args);
  151.     virtual CDB_BCPInCmd*    BCPIn       (const string&   table_name,
  152.                                           unsigned int    nof_columns);
  153.     virtual CDB_CursorCmd*   Cursor      (const string&   cursor_name,
  154.                                           const string&   query,
  155.                                           unsigned int    nof_params,
  156.                                           unsigned int    batch_size = 1);
  157.     virtual CDB_SendDataCmd* SendDataCmd (I_ITDescriptor& desc,
  158.                                           size_t          data_size,
  159.                                           bool            log_it = true);
  160.     virtual bool SendData(I_ITDescriptor& desc, CDB_Image& img,
  161.                           bool log_it = true);
  162.     virtual bool SendData(I_ITDescriptor& desc, CDB_Text&  txt,
  163.                           bool log_it = true);
  164.     virtual bool Refresh();
  165.     virtual const string& ServerName() const;
  166.     virtual const string& UserName()   const;
  167.     virtual const string& Password()   const;
  168.     virtual I_DriverContext::TConnectionMode ConnectMode() const;
  169.     virtual bool IsReusable() const;
  170.     virtual const string& PoolName() const;
  171.     virtual I_DriverContext* Context() const;
  172.     virtual void PushMsgHandler(CDB_UserHandler* h);
  173.     virtual void PopMsgHandler (CDB_UserHandler* h);
  174.     virtual CDB_ResultProcessor* SetResultProcessor(CDB_ResultProcessor* rp);
  175.     virtual void Release();
  176.     virtual ~CODBC_Connection();
  177.     void ODBC_SetTimeout(SQLUINTEGER nof_secs);
  178.     void ODBC_SetTextImageSize(SQLUINTEGER nof_bytes);
  179.     void DropCmd(CDB_BaseEnt& cmd);
  180.     CODBC_LangCmd* xLangCmd(const string&   lang_query,
  181.                             unsigned int    nof_params = 0);
  182. private:
  183.     bool x_SendData(SQLHSTMT cmd, CDB_Stream& stream, CODBC_Reporter& rep);
  184.     SQLHDBC         m_Link;
  185.     
  186.     CODBCContext*   m_Context;
  187.     CPointerPot     m_CMDs;
  188.     CDBHandlerStack m_MsgHandlers;
  189.     string          m_Server;
  190.     string          m_User;
  191.     string          m_Passwd;
  192.     string          m_Pool;
  193.     CODBC_Reporter  m_Reporter;
  194.     bool            m_Reusable;
  195.     bool            m_BCPable;
  196.     bool            m_SecureLogin;
  197.     CDB_ResultProcessor* m_ResProc;
  198. };
  199. /////////////////////////////////////////////////////////////////////////////
  200. //
  201. //  CODBC_LangCmd::
  202. //
  203. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_LangCmd : public I_LangCmd
  204. {
  205.     friend class CODBC_Connection;
  206.     friend class CODBC_CursorCmd;
  207. friend class CODBC_CursorResult;
  208. protected:
  209.     CODBC_LangCmd(CODBC_Connection* conn, SQLHSTMT cmd,
  210.   const string& lang_query, unsigned int nof_params);
  211.     virtual bool More(const string& query_text);
  212.     virtual bool BindParam(const string& param_name, CDB_Object* param_ptr);
  213.     virtual bool SetParam(const string& param_name, CDB_Object* param_ptr);
  214.     virtual bool Send();
  215.     virtual bool WasSent() const;
  216.     virtual bool Cancel();
  217.     virtual bool WasCanceled() const;
  218.     virtual CDB_Result* Result();
  219.     virtual bool HasMoreResults() const;
  220.     virtual bool HasFailed() const;
  221.     virtual int  RowCount() const;
  222.     virtual void DumpResults();
  223.     virtual void Release();
  224.     virtual ~CODBC_LangCmd();
  225. private:
  226.     bool x_AssignParams(string& cmd, CMemPot& bind_guard, SQLINTEGER* indicator);
  227.     bool xCheck4MoreResults();
  228.     CODBC_Connection* m_Connect;
  229.     SQLHSTMT          m_Cmd;
  230.     string            m_Query;
  231.     CDB_Params        m_Params;
  232.     CODBC_RowResult*  m_Res;
  233.     CODBC_Reporter    m_Reporter;
  234.     int               m_RowCount;
  235.     bool              m_hasResults;
  236.     bool              m_WasSent;
  237.     bool              m_HasFailed;
  238. };
  239. /////////////////////////////////////////////////////////////////////////////
  240. //
  241. //  CODBC_RPCCmd::
  242. //
  243. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_RPCCmd : public I_RPCCmd
  244. {
  245.     friend class CODBC_Connection;
  246. protected:
  247.     CODBC_RPCCmd(CODBC_Connection* con, SQLHSTMT cmd,
  248.                const string& proc_name, unsigned int nof_params);
  249.     virtual bool BindParam(const string& param_name, CDB_Object* param_ptr,
  250.                            bool out_param = false);
  251.     virtual bool SetParam(const string& param_name, CDB_Object* param_ptr,
  252.                           bool out_param = false);
  253.     virtual bool Send();
  254.     virtual bool WasSent() const;
  255.     virtual bool Cancel();
  256.     virtual bool WasCanceled() const;
  257.     virtual CDB_Result* Result();
  258.     virtual bool HasMoreResults() const;
  259.     virtual bool HasFailed() const;
  260.     virtual int  RowCount() const;
  261.     virtual void DumpResults();
  262.     virtual void SetRecompile(bool recompile = true);
  263.     virtual void Release();
  264.     virtual ~CODBC_RPCCmd();
  265. private:
  266.     bool x_AssignParams(string& cmd, string& q_exec, string& q_select,
  267. CMemPot& bind_guard, SQLINTEGER* indicator);
  268.     bool xCheck4MoreResults();
  269.     CODBC_Connection* m_Connect;
  270.     SQLHSTMT          m_Cmd;
  271.     string            m_Query;
  272.     CDB_Params        m_Params;
  273.     CODBC_Reporter    m_Reporter;
  274.     bool              m_WasSent;
  275.     bool              m_HasFailed;
  276.     bool              m_Recompile;
  277.     bool              m_HasStatus;
  278. bool              m_hasResults;
  279.     I_Result*         m_Res;
  280.     int               m_RowCount;
  281. };
  282. /////////////////////////////////////////////////////////////////////////////
  283. //
  284. //  CODBC_CursorCmd::
  285. //
  286. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_CursorCmd : public I_CursorCmd
  287. {
  288.     friend class CODBC_Connection;
  289. protected:
  290.     CODBC_CursorCmd(CODBC_Connection* conn, SQLHSTMT cmd,
  291.                   const string& cursor_name, const string& query,
  292.                   unsigned int nof_params);
  293.     virtual bool BindParam(const string& param_name, CDB_Object* param_ptr);
  294.     virtual CDB_Result* Open();
  295.     virtual bool Update(const string& table_name, const string& upd_query);
  296.     virtual bool UpdateTextImage(unsigned int item_num, CDB_Stream& data, 
  297.  bool log_it = true);
  298.     virtual CDB_SendDataCmd* SendDataCmd(unsigned int item_num, size_t size, 
  299.  bool log_it = true);
  300.     virtual bool Delete(const string& table_name);
  301.     virtual int  RowCount() const;
  302.     virtual bool Close();
  303.     virtual void Release();
  304.     virtual ~CODBC_CursorCmd();
  305. private:
  306.     bool x_AssignParams(bool just_declare = false);
  307.     CDB_ITDescriptor* x_GetITDescriptor(unsigned int item_num);
  308.     CODBC_LangCmd m_CursCmd;
  309.     CODBC_LangCmd* m_LCmd;
  310.     CODBC_Connection* m_Connect;
  311.     string          m_Name;
  312.     unsigned int    m_FetchSize;
  313.     bool            m_IsOpen;
  314.     bool            m_IsDeclared;
  315.     bool            m_HasFailed;
  316.     I_Result*       m_Res;
  317.     int             m_RowCount;
  318. };
  319. /////////////////////////////////////////////////////////////////////////////
  320. //
  321. //  CODBC_BCPInCmd::
  322. //
  323. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_BCPInCmd : public I_BCPInCmd
  324. {
  325.     friend class CODBC_Connection;
  326. protected:
  327.     CODBC_BCPInCmd(CODBC_Connection* con, SQLHDBC cmd,
  328.                  const string& table_name, unsigned int nof_columns);
  329.     virtual bool Bind(unsigned int column_num, CDB_Object* param_ptr);
  330.     virtual bool SendRow();
  331.     virtual bool CompleteBatch();
  332.     virtual bool Cancel();
  333.     virtual bool CompleteBCP();
  334.     virtual void Release();
  335.     virtual ~CODBC_BCPInCmd();
  336. private:
  337.     bool x_AssignParams(void* p);
  338.     CODBC_Connection* m_Connect;
  339.     SQLHDBC     m_Cmd;
  340.     string          m_Query;
  341.     CDB_Params      m_Params;
  342.     bool            m_WasSent;
  343.     bool            m_HasFailed;
  344. bool            m_WasBound;
  345. bool            m_HasTextImage;
  346.     CODBC_Reporter  m_Reporter;
  347. };
  348. /////////////////////////////////////////////////////////////////////////////
  349. //
  350. //  CODBC_SendDataCmd::
  351. //
  352. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_SendDataCmd : public I_SendDataCmd
  353. {
  354.     friend class CODBC_Connection;
  355. protected:
  356.     CODBC_SendDataCmd(CODBC_Connection* con, SQLHSTMT cmd, CDB_ITDescriptor& descr, 
  357.                       size_t nof_bytes, bool logit);
  358.     virtual size_t SendChunk(const void* chunk_ptr, size_t nof_bytes);
  359.     virtual void   Release();
  360.     virtual ~CODBC_SendDataCmd();
  361. private:
  362.     void xCancel();
  363.     CODBC_Connection* m_Connect;
  364.     SQLHSTMT          m_Cmd;
  365.     CODBC_Reporter    m_Reporter;
  366.     size_t            m_Bytes2go;
  367. };
  368. /////////////////////////////////////////////////////////////////////////////
  369. //
  370. //  CODBC_RowResult::
  371. //
  372. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_RowResult : public I_Result
  373. {
  374.     friend class CODBC_LangCmd;
  375.     friend class CODBC_RPCCmd;
  376.     friend class CODBC_CursorCmd;
  377.     friend class CODBC_Connection;
  378. protected:
  379.     CODBC_RowResult(SQLSMALLINT nof_cols, SQLHSTMT cmd, CODBC_Reporter& r);
  380.     virtual EDB_ResType     ResultType() const;
  381.     virtual unsigned int    NofItems() const;
  382.     virtual const char*     ItemName    (unsigned int item_num) const;
  383.     virtual size_t          ItemMaxSize (unsigned int item_num) const;
  384.     virtual EDB_Type        ItemDataType(unsigned int item_num) const;
  385.     virtual bool            Fetch();
  386.     virtual int             CurrentItemNo() const;
  387.     virtual CDB_Object*     GetItem(CDB_Object* item_buf = 0);
  388.     virtual size_t          ReadItem(void* buffer, size_t buffer_size,
  389.                                      bool* is_null = 0);
  390.     virtual I_ITDescriptor* GetImageOrTextDescriptor();
  391.     CDB_ITDescriptor* GetImageOrTextDescriptor(int item_no, 
  392.                                                const string& cond);
  393.     virtual bool            SkipItem();
  394.     virtual ~CODBC_RowResult();
  395. int xGetData(SQLSMALLINT target_type, SQLPOINTER buffer, 
  396. SQLINTEGER buffer_size);
  397.     CDB_Object* xLoadItem(CDB_Object* item_buf);
  398.     CDB_Object* xMakeItem();
  399.     // data
  400.     SQLHSTMT          m_Cmd;
  401.     // CODBC_Connection* m_Connect;
  402.     int               m_CurrItem;
  403.     bool              m_EOR;
  404.     unsigned int      m_NofCols;
  405.     unsigned int      m_CmdNum;
  406. #define ODBC_COLUMN_NAME_SIZE 80
  407.     typedef struct t_SODBC_ColDescr {
  408.         SQLCHAR     ColumnName[ODBC_COLUMN_NAME_SIZE];
  409.         SQLUINTEGER ColumnSize;
  410.         SQLSMALLINT DataType;
  411.         SQLSMALLINT DecimalDigits;
  412.     } SODBC_ColDescr;
  413.     
  414.     SODBC_ColDescr* m_ColFmt;
  415.     CODBC_Reporter& m_Reporter;
  416. };
  417. /////////////////////////////////////////////////////////////////////////////
  418. //
  419. //  CODBC_ParamResult::
  420. //  CODBC_ComputeResult::
  421. //  CODBC_StatusResult::
  422. //  CODBC_CursorResult::
  423. //
  424. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_StatusResult :  public CODBC_RowResult
  425. {
  426.     friend class CODBC_RPCCmd;
  427.     friend class CODBC_Connection;
  428. protected:
  429.     CODBC_StatusResult(SQLHSTMT cmd, CODBC_Reporter& r) :
  430.         CODBC_RowResult(1, cmd, r){}
  431.     virtual EDB_ResType ResultType() const;
  432.     virtual ~CODBC_StatusResult();
  433. };
  434. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_ParamResult :  public CODBC_RowResult
  435. {
  436.     friend class CODBC_RPCCmd;
  437.     friend class CODBC_Connection;
  438. protected:
  439.     CODBC_ParamResult(SQLSMALLINT nof_cols, SQLHSTMT cmd, CODBC_Reporter& r) :
  440.         CODBC_RowResult(nof_cols, cmd, r){}
  441.     virtual EDB_ResType ResultType() const;
  442.     virtual ~CODBC_ParamResult();
  443. };
  444. class NCBI_DBAPIDRIVER_ODBC_EXPORT CODBC_CursorResult : public I_Result
  445. {
  446.     friend class CODBC_CursorCmd;
  447. protected:
  448.     CODBC_CursorResult(CODBC_LangCmd* cmd);
  449.     virtual EDB_ResType     ResultType() const;
  450.     virtual unsigned int    NofItems() const;
  451.     virtual const char*     ItemName    (unsigned int item_num) const;
  452.     virtual size_t          ItemMaxSize (unsigned int item_num) const;
  453.     virtual EDB_Type        ItemDataType(unsigned int item_num) const;
  454.     virtual bool            Fetch();
  455.     virtual int             CurrentItemNo() const;
  456.     virtual CDB_Object*     GetItem(CDB_Object* item_buff = 0);
  457.     virtual size_t          ReadItem(void* buffer, size_t buffer_size,
  458.                                      bool* is_null = 0);
  459.     virtual I_ITDescriptor* GetImageOrTextDescriptor();
  460.     virtual bool            SkipItem();
  461.     virtual ~CODBC_CursorResult();
  462.     // data
  463.     CODBC_LangCmd* m_Cmd;
  464.     CDB_Result*  m_Res;
  465. bool m_EOR;
  466. };
  467. END_NCBI_SCOPE
  468. #endif  /* DBAPI_DRIVER_ODBC___INTERFACES__HPP */
  469. /*
  470.  * ===========================================================================
  471.  * $Log: interfaces.hpp,v $
  472.  * Revision 1000.1  2004/04/21 14:47:31  gouriano
  473.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.7
  474.  *
  475.  * Revision 1.7  2003/07/17 20:43:17  soussov
  476.  * connections pool improvements
  477.  *
  478.  * Revision 1.6  2003/06/06 18:43:15  soussov
  479.  * Removes SetPacketSize()
  480.  *
  481.  * Revision 1.5  2003/06/05 15:57:02  soussov
  482.  * adds DumpResults method for LangCmd and RPC, SetResultProcessor method for Connection interface
  483.  *
  484.  * Revision 1.4  2003/05/05 20:45:51  ucko
  485.  * Lowercase header names for compatibility with Unix.
  486.  *
  487.  * Revision 1.3  2003/02/13 15:43:44  ivanov
  488.  * Added export specifier NCBI_DBAPIDRIVER_ODBC_EXPORT for class definitions
  489.  *
  490.  * Revision 1.2  2002/07/03 21:48:08  soussov
  491.  * adds DSN support if needed
  492.  *
  493.  * Revision 1.1  2002/06/18 22:00:53  soussov
  494.  * initial commit
  495.  *
  496.  * ===========================================================================
  497.  */