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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: interfaces.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:19:22  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_DRIVER_CTLIB___INTERFACES__HPP
  10. #define DBAPI_DRIVER_CTLIB___INTERFACES__HPP
  11. /* $Id: interfaces.hpp,v 1000.0 2003/10/29 20:19: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:  Vladimir Soussov
  37.  *
  38.  * File Description:  Driver for CTLib server
  39.  *
  40.  */
  41. #include <dbapi/driver/public.hpp>
  42. #include <dbapi/driver/util/parameters.hpp>
  43. #include <ctpublic.h>
  44. #include <bkpublic.h>
  45. BEGIN_NCBI_SCOPE
  46. class CTLibContext;
  47. class CTL_Connection;
  48. class CTL_LangCmd;
  49. class CTL_RPCCmd;
  50. class CTL_CursorCmd;
  51. class CTL_BCPInCmd;
  52. class CTL_SendDataCmd;
  53. class CTL_RowResult;
  54. class CTL_ParamResult;
  55. class CTL_ComputeResult;
  56. class CTL_StatusResult;
  57. class CTL_CursorResult;
  58. /////////////////////////////////////////////////////////////////////////////
  59. //
  60. //  CTLibContext::
  61. //
  62. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTLibContext : public I_DriverContext
  63. {
  64.     friend class CDB_Connection;
  65. public:
  66.     CTLibContext(bool reuse_context = true, CS_INT version = CS_VERSION_110);
  67.     //
  68.     // GENERIC functionality (see in <dbapi/driver/interfaces.hpp>)
  69.     //
  70.     virtual bool SetLoginTimeout (unsigned int nof_secs = 0);
  71.     virtual bool SetTimeout      (unsigned int nof_secs = 0);
  72.     virtual bool SetMaxTextImageSize(size_t nof_bytes);
  73.     virtual CDB_Connection* Connect(const string&   srv_name,
  74.                                     const string&   user_name,
  75.                                     const string&   passwd,
  76.                                     TConnectionMode mode,
  77.                                     bool            reusable  = false,
  78.                                     const string&   pool_name = kEmptyStr);
  79.     virtual ~CTLibContext();
  80.     //
  81.     // CTLIB specific functionality
  82.     //
  83.     // the following methods are optional (driver will use the default values
  84.     // if not called), the values will affect the new connections only
  85.     virtual void CTLIB_SetApplicationName(const string& a_name);
  86.     virtual void CTLIB_SetHostName(const string& host_name);
  87.     virtual void CTLIB_SetPacketSize(CS_INT packet_size);
  88.     virtual void CTLIB_SetLoginRetryCount(CS_INT n);
  89.     virtual void CTLIB_SetLoginLoopDelay(CS_INT nof_sec);
  90.     virtual bool IsAbleTo(ECapability cpb) const;
  91.     virtual CS_CONTEXT* CTLIB_GetContext() const;
  92.     static bool CTLIB_cserr_handler(CS_CONTEXT* context, CS_CLIENTMSG* msg);
  93.     static bool CTLIB_cterr_handler(CS_CONTEXT* context, CS_CONNECTION* con,
  94.                                     CS_CLIENTMSG* msg);
  95.     static bool CTLIB_srverr_handler(CS_CONTEXT* context, CS_CONNECTION* con,
  96.                                      CS_SERVERMSG* msg);
  97. private:
  98.     CS_CONTEXT* m_Context;
  99.     string      m_AppName;
  100.     string      m_HostName;
  101.     CS_INT      m_PacketSize;
  102.     CS_INT      m_LoginRetryCount;
  103.     CS_INT      m_LoginLoopDelay;
  104.     CS_CONNECTION* x_ConnectToServer(const string&   srv_name,
  105.                                      const string&   usr_name,
  106.                                      const string&   passwd,
  107.                                      TConnectionMode mode);
  108. };
  109. /////////////////////////////////////////////////////////////////////////////
  110. //
  111. //  CTL_Connection::
  112. //
  113. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_Connection : public I_Connection
  114. {
  115.     friend class CTLibContext;
  116.     friend class CDB_Connection;
  117.     friend class CTL_LangCmd;
  118.     friend class CTL_RPCCmd;
  119.     friend class CTL_CursorCmd;
  120.     friend class CTL_BCPInCmd;
  121.     friend class CTL_SendDataCmd;
  122. protected:
  123.     CTL_Connection(CTLibContext* cntx, CS_CONNECTION* con,
  124.                    bool reusable, const string& pool_name);
  125.     virtual bool IsAlive();
  126.     virtual CDB_LangCmd*     LangCmd     (const string&   lang_query,
  127.                                           unsigned int    nof_params = 0);
  128.     virtual CDB_RPCCmd*      RPC         (const string&   rpc_name,
  129.                                           unsigned int    nof_args);
  130.     virtual CDB_BCPInCmd*    BCPIn       (const string&   table_name,
  131.                                           unsigned int    nof_columns);
  132.     virtual CDB_CursorCmd*   Cursor      (const string&   cursor_name,
  133.                                           const string&   query,
  134.                                           unsigned int    nof_params,
  135.                                           unsigned int    batch_size = 1);
  136.     virtual CDB_SendDataCmd* SendDataCmd (I_ITDescriptor& desc,
  137.                                           size_t          data_size,
  138.                                           bool            log_it = true);
  139.     virtual bool SendData(I_ITDescriptor& desc, CDB_Image& img,
  140.                           bool log_it = true);
  141.     virtual bool SendData(I_ITDescriptor& desc, CDB_Text&  txt,
  142.                           bool log_it = true);
  143.     virtual bool Refresh();
  144.     virtual const string& ServerName() const;
  145.     virtual const string& UserName()   const;
  146.     virtual const string& Password()   const;
  147.     virtual I_DriverContext::TConnectionMode ConnectMode() const;
  148.     virtual bool IsReusable() const;
  149.     virtual const string& PoolName() const;
  150.     virtual I_DriverContext* Context() const;
  151.     virtual void PushMsgHandler(CDB_UserHandler* h);
  152.     virtual void PopMsgHandler (CDB_UserHandler* h);
  153.     virtual CDB_ResultProcessor* SetResultProcessor(CDB_ResultProcessor* rp);
  154.     virtual void Release();
  155.     virtual ~CTL_Connection();
  156.     void DropCmd(CDB_BaseEnt& cmd);
  157. private:
  158.     bool x_SendData(I_ITDescriptor& desc, CDB_Stream& img, bool log_it = true);
  159.     I_ITDescriptor* x_GetNativeITDescriptor(const CDB_ITDescriptor& descr_in);
  160.     CS_CONNECTION*  m_Link;
  161.     CTLibContext*   m_Context;
  162.     CPointerPot     m_CMDs;
  163.     CDBHandlerStack m_MsgHandlers;
  164.     string          m_Server;
  165.     string          m_User;
  166.     string          m_Passwd;
  167.     string          m_Pool;
  168.     bool            m_Reusable;
  169.     bool            m_BCPable;
  170.     bool            m_SecureLogin;
  171.     CDB_ResultProcessor* m_ResProc;
  172. };
  173. /////////////////////////////////////////////////////////////////////////////
  174. //
  175. //  CTL_LangCmd::
  176. //
  177. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_LangCmd : public I_LangCmd
  178. {
  179.     friend class CTL_Connection;
  180. protected:
  181.     CTL_LangCmd(CTL_Connection* conn, CS_COMMAND* cmd,
  182.                 const string& lang_query, unsigned int nof_params);
  183.     virtual bool More(const string& query_text);
  184.     virtual bool BindParam(const string& param_name, CDB_Object* param_ptr);
  185.     virtual bool SetParam(const string& param_name, CDB_Object* param_ptr);
  186.     virtual bool Send();
  187.     virtual bool WasSent() const;
  188.     virtual bool Cancel();
  189.     virtual bool WasCanceled() const;
  190.     virtual CDB_Result* Result();
  191.     virtual bool HasMoreResults() const;
  192.     virtual bool HasFailed() const;
  193.     virtual int  RowCount() const;
  194.     virtual void DumpResults();
  195.     virtual void Release();
  196.     virtual ~CTL_LangCmd();
  197. private:
  198.     bool x_AssignParams();
  199.     CTL_Connection* m_Connect;
  200.     CS_COMMAND*     m_Cmd;
  201.     string          m_Query;
  202.     CDB_Params      m_Params;
  203.     bool            m_WasSent;
  204.     bool            m_HasFailed;
  205.     I_Result*       m_Res;
  206.     int             m_RowCount;
  207. };
  208. /////////////////////////////////////////////////////////////////////////////
  209. //
  210. //  CTL_RPCCmd::
  211. //
  212. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_RPCCmd : public I_RPCCmd
  213. {
  214.     friend class CTL_Connection;
  215. protected:
  216.     CTL_RPCCmd(CTL_Connection* con, CS_COMMAND* cmd,
  217.                const string& proc_name, unsigned int nof_params);
  218.     virtual bool BindParam(const string& param_name, CDB_Object* param_ptr,
  219.                            bool out_param = false);
  220.     virtual bool SetParam(const string& param_name, CDB_Object* param_ptr,
  221.                           bool out_param = false);
  222.     virtual bool Send();
  223.     virtual bool WasSent() const;
  224.     virtual bool Cancel();
  225.     virtual bool WasCanceled() const;
  226.     virtual CDB_Result* Result();
  227.     virtual bool HasMoreResults() const;
  228.     virtual bool HasFailed() const;
  229.     virtual int  RowCount() const;
  230.     virtual void DumpResults();
  231.     virtual void SetRecompile(bool recompile = true);
  232.     virtual void Release();
  233.     virtual ~CTL_RPCCmd();
  234. private:
  235.     bool x_AssignParams();
  236.     CTL_Connection* m_Connect;
  237.     CS_COMMAND*     m_Cmd;
  238.     string          m_Query;
  239.     CDB_Params      m_Params;
  240.     bool            m_WasSent;
  241.     bool            m_HasFailed;
  242.     bool            m_Recompile;
  243.     I_Result*       m_Res;
  244.     int             m_RowCount;
  245. };
  246. /////////////////////////////////////////////////////////////////////////////
  247. //
  248. //  CTL_CursorCmd::
  249. //
  250. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_CursorCmd : public I_CursorCmd
  251. {
  252.     friend class CTL_Connection;
  253. protected:
  254.     CTL_CursorCmd(CTL_Connection* conn, CS_COMMAND* cmd,
  255.                   const string& cursor_name, const string& query,
  256.                   unsigned int nof_params, unsigned int fetch_size);
  257.     virtual bool BindParam(const string& param_name, CDB_Object* param_ptr);
  258.     virtual CDB_Result* Open();
  259.     virtual bool Update(const string& table_name, const string& upd_query);
  260.     virtual bool UpdateTextImage(unsigned int item_num, CDB_Stream& data, 
  261.  bool log_it = true);
  262.     virtual CDB_SendDataCmd* SendDataCmd(unsigned int item_num, size_t size, 
  263.  bool log_it = true);
  264.     virtual bool Delete(const string& table_name);
  265.     virtual int  RowCount() const;
  266.     virtual bool Close();
  267.     virtual void Release();
  268.     virtual ~CTL_CursorCmd();
  269. private:
  270.     bool x_AssignParams(bool just_declare = false);
  271.     I_ITDescriptor*   x_GetITDescriptor(unsigned int item_num);
  272.     CTL_Connection*   m_Connect;
  273.     CS_COMMAND*       m_Cmd;
  274.     string            m_Name;
  275.     string            m_Query;
  276.     CDB_Params        m_Params;
  277.     unsigned int      m_FetchSize;
  278.     bool              m_IsOpen;
  279.     bool              m_HasFailed;
  280.     bool              m_Used;
  281.     CTL_CursorResult* m_Res;
  282.     int               m_RowCount;
  283. };
  284. /////////////////////////////////////////////////////////////////////////////
  285. //
  286. //  CTL_BCPInCmd::
  287. //
  288. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_BCPInCmd : public I_BCPInCmd
  289. {
  290.     friend class CTL_Connection;
  291. protected:
  292.     CTL_BCPInCmd(CTL_Connection* con, CS_BLKDESC* cmd,
  293.                  const string& table_name, unsigned int nof_columns);
  294.     virtual bool Bind(unsigned int column_num, CDB_Object* param_ptr);
  295.     virtual bool SendRow();
  296.     virtual bool CompleteBatch();
  297.     virtual bool Cancel();
  298.     virtual bool CompleteBCP();
  299.     virtual void Release();
  300.     virtual ~CTL_BCPInCmd();
  301. private:
  302.     bool x_AssignParams();
  303.     CTL_Connection* m_Connect;
  304.     CS_BLKDESC*     m_Cmd;
  305.     string          m_Query;
  306.     CDB_Params      m_Params;
  307.     bool            m_WasSent;
  308.     bool            m_HasFailed;
  309.     struct SBcpBind {
  310.         CS_INT      datalen;
  311.         CS_SMALLINT indicator;
  312.         char        buffer[sizeof(CS_NUMERIC)];
  313.     };
  314.     SBcpBind*       m_Bind;
  315. };
  316. /////////////////////////////////////////////////////////////////////////////
  317. //
  318. //  CTL_SendDataCmd::
  319. //
  320. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_SendDataCmd : public I_SendDataCmd
  321. {
  322.     friend class CTL_Connection;
  323. protected:
  324.     CTL_SendDataCmd(CTL_Connection* con, CS_COMMAND* cmd, size_t nof_bytes);
  325.     virtual size_t SendChunk(const void* chunk_ptr, size_t nof_bytes);
  326.     virtual void   Release();
  327.     virtual ~CTL_SendDataCmd();
  328. private:
  329.     CTL_Connection* m_Connect;
  330.     CS_COMMAND*     m_Cmd;
  331.     size_t          m_Bytes2go;
  332. };
  333. /////////////////////////////////////////////////////////////////////////////
  334. //
  335. //  CTL_RowResult::
  336. //
  337. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_RowResult : public I_Result
  338. {
  339.     friend class CTL_LangCmd;
  340.     friend class CTL_RPCCmd;
  341.     friend class CTL_CursorCmd;
  342.     friend class CTL_Connection;
  343.     friend class CTL_SendDataCmd;
  344. protected:
  345.     CTL_RowResult(CS_COMMAND* cmd);
  346.     virtual EDB_ResType     ResultType() const;
  347.     virtual unsigned int    NofItems() const;
  348.     virtual const char*     ItemName    (unsigned int item_num) const;
  349.     virtual size_t          ItemMaxSize (unsigned int item_num) const;
  350.     virtual EDB_Type        ItemDataType(unsigned int item_num) const;
  351.     virtual bool            Fetch();
  352.     virtual int             CurrentItemNo() const;
  353.     virtual CDB_Object*     GetItem(CDB_Object* item_buf = 0);
  354.     virtual size_t          ReadItem(void* buffer, size_t buffer_size,
  355.                                      bool* is_null = 0);
  356.     virtual I_ITDescriptor* GetImageOrTextDescriptor();
  357.     virtual bool            SkipItem();
  358.     CS_RETCODE my_ct_get_data(CS_COMMAND* cmd, CS_INT item, 
  359.   CS_VOID* buffer, 
  360.   CS_INT buflen, CS_INT *outlen);
  361.     CDB_Object* s_GetItem(CS_COMMAND* cmd, CS_INT item_no, CS_DATAFMT& fmt,
  362.   CDB_Object* item_buf);
  363.     virtual ~CTL_RowResult();
  364.     // data
  365.     CS_COMMAND*  m_Cmd;
  366.     int          m_CurrItem;
  367.     bool         m_EOR;
  368.     unsigned int m_NofCols;
  369.     unsigned int m_CmdNum;
  370.     CS_DATAFMT*  m_ColFmt;
  371.     int          m_BindedCols;
  372.     CS_VOID**    m_BindItem;
  373.     CS_INT*      m_Copied;
  374.     CS_SMALLINT* m_Indicator;
  375.     unsigned char m_BindBuff[2048];
  376. };
  377. /////////////////////////////////////////////////////////////////////////////
  378. //
  379. //  CTL_ParamResult::
  380. //  CTL_ComputeResult::
  381. //  CTL_StatusResult::
  382. //  CTL_CursorResult::
  383. //
  384. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_ParamResult : public CTL_RowResult
  385. {
  386.     friend class CTL_LangCmd;
  387.     friend class CTL_RPCCmd;
  388.     friend class CTL_Connection;
  389.     friend class CTL_SendDataCmd;
  390.     friend class CTL_CursorCmd;
  391. protected:
  392.     CTL_ParamResult(CS_COMMAND* pCmd) : CTL_RowResult(pCmd) {}
  393.     virtual EDB_ResType ResultType() const;
  394. };
  395. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_ComputeResult : public CTL_RowResult
  396. {
  397.     friend class CTL_LangCmd;
  398.     friend class CTL_RPCCmd;
  399.     friend class CTL_Connection;
  400.     friend class CTL_SendDataCmd;
  401.     friend class CTL_CursorCmd;
  402. protected:
  403.     CTL_ComputeResult(CS_COMMAND* pCmd) : CTL_RowResult(pCmd) {}
  404.     virtual EDB_ResType ResultType() const;
  405. };
  406. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_StatusResult :  public CTL_RowResult
  407. {
  408.     friend class CTL_LangCmd;
  409.     friend class CTL_RPCCmd;
  410.     friend class CTL_Connection;
  411.     friend class CTL_SendDataCmd;
  412.     friend class CTL_CursorCmd;
  413. protected:
  414.     CTL_StatusResult(CS_COMMAND* pCmd) : CTL_RowResult(pCmd) {}
  415.     virtual EDB_ResType ResultType() const;
  416. };
  417. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_CursorResult :  public CTL_RowResult
  418. {
  419.     friend class CTL_CursorCmd;
  420. protected:
  421.     CTL_CursorResult(CS_COMMAND* pCmd) : CTL_RowResult(pCmd) {}
  422.     virtual EDB_ResType ResultType() const;
  423.     virtual bool        SkipItem();
  424.     virtual ~CTL_CursorResult();
  425. };
  426. /////////////////////////////////////////////////////////////////////////////
  427. //
  428. //  CTL_ITDescriptor::
  429. //
  430. #define CTL_ITDESCRIPTOR_TYPE_MAGNUM 0xc00
  431. class NCBI_DBAPIDRIVER_CTLIB_EXPORT CTL_ITDescriptor : public I_ITDescriptor
  432. {
  433.     friend class CTL_RowResult;
  434.     friend class CTL_Connection;
  435.     friend class CTL_CursorCmd;
  436. public:
  437.     virtual int DescriptorType() const;
  438.     virtual ~CTL_ITDescriptor();
  439. protected:
  440.     CTL_ITDescriptor();
  441.     CS_IODESC m_Desc;
  442. };
  443. /////////////////////////////////////////////////////////////////////////////
  444. //
  445. //  Miscellaneous
  446. //
  447. extern void g_CTLIB_GetRowCount
  448. (CS_COMMAND* cmd,
  449.  int*        cnt
  450. );
  451. extern bool g_CTLIB_AssignCmdParam
  452. (CS_COMMAND*   cmd,
  453.  CDB_Object&   param,
  454.  const string& param_name,
  455.  CS_DATAFMT&   param_fmt,
  456.  CS_SMALLINT   indicator,
  457.  bool          declare_only = false
  458.  );
  459. END_NCBI_SCOPE
  460. #endif  /* DBAPI_DRIVER_CTLIB___INTERFACES__HPP */
  461. /*
  462.  * ===========================================================================
  463.  * $Log: interfaces.hpp,v $
  464.  * Revision 1000.0  2003/10/29 20:19:22  gouriano
  465.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.16
  466.  *
  467.  * Revision 1.16  2003/07/17 20:41:48  soussov
  468.  * connections pool improvements
  469.  *
  470.  * Revision 1.15  2003/06/05 15:55:26  soussov
  471.  * adds DumpResults method for LangCmd and RPC, SetResultProcessor method for Connection interface
  472.  *
  473.  * Revision 1.14  2003/04/21 20:17:06  soussov
  474.  * Buffering fetched result to avoid ct_get_data performance issue
  475.  *
  476.  * Revision 1.13  2003/04/01 20:26:24  vakatov
  477.  * Temporarily rollback to R1.11 -- until more backward-incompatible
  478.  * changes (in CException) are ready to commit (to avoid breaking the
  479.  * compatibility twice).
  480.  *
  481.  * Revision 1.11  2003/02/13 16:06:36  ivanov
  482.  * Added export specifier NCBI_DBAPIDRIVER_CTLIB_EXPORT for class definitions
  483.  *
  484.  * Revision 1.10  2002/03/28 00:37:01  vakatov
  485.  * CTL_CursorCmd::  use CTL_CursorResult rather than I_Result (fix access)
  486.  *
  487.  * Revision 1.9  2002/03/26 15:26:02  soussov
  488.  * new image/text operations added
  489.  *
  490.  * Revision 1.8  2001/11/06 17:58:56  lavr
  491.  * Get rid of inline methods - all moved into source files
  492.  *
  493.  * Revision 1.7  2001/10/22 15:14:50  lavr
  494.  * Beautifications...
  495.  *
  496.  * Revision 1.6  2001/09/27 23:01:06  vakatov
  497.  * CTL_***Result::  virtual methods' implementation moved away from the header
  498.  *
  499.  * Revision 1.5  2001/09/27 20:08:30  vakatov
  500.  * Added "DB_" (or "I_") prefix where it was missing
  501.  *
  502.  * Revision 1.4  2001/09/27 15:41:28  soussov
  503.  * CTL_Connection::Release() added
  504.  *
  505.  * Revision 1.3  2001/09/26 23:23:28  vakatov
  506.  * Moved the err.message handlers' stack functionality (generic storage
  507.  * and methods) to the "abstract interface" level.
  508.  *
  509.  * Revision 1.2  2001/09/24 20:52:19  vakatov
  510.  * Fixed args like "string& s = 0" to "string& s = kEmptyStr"
  511.  *
  512.  * Revision 1.1  2001/09/21 23:39:53  vakatov
  513.  * -----  Initial (draft) revision.  -----
  514.  * This is a major revamp (by Denis Vakatov, with help from Vladimir Soussov)
  515.  * of the DBAPI "driver" libs originally written by Vladimir Soussov.
  516.  * The revamp involved massive code shuffling and grooming, numerous local
  517.  * API redesigns, adding comments and incorporating DBAPI to the C++ Toolkit.
  518.  *
  519.  * ===========================================================================
  520.  */