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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: interfaces.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2003/11/17 22:11:27  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.25
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_DRIVER___INTERFACES__HPP
  10. #define DBAPI_DRIVER___INTERFACES__HPP
  11. /* $Id: interfaces.hpp,v 1000.1 2003/11/17 22:11:27 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:  Data Server interfaces
  39.  *
  40.  */
  41. #include <corelib/ncbimtx.hpp>
  42. #include <dbapi/driver/types.hpp>
  43. #include <dbapi/driver/exception.hpp>
  44. #include <dbapi/driver/util/handle_stack.hpp>
  45. #include <dbapi/driver/util/pointer_pot.hpp>
  46. #include <map>
  47. /** @addtogroup DbInterfaces
  48.  *
  49.  * @{
  50.  */
  51. BEGIN_NCBI_SCOPE
  52. class I_BaseCmd;
  53. class I_DriverContext;
  54. class I_Connection;
  55. class I_Result;
  56. class I_LangCmd;
  57. class I_RPCCmd;
  58. class I_BCPInCmd;
  59. class I_CursorCmd;
  60. class I_SendDataCmd;
  61. class CDB_Connection;
  62. class CDB_Result;
  63. class CDB_LangCmd;
  64. class CDB_RPCCmd;
  65. class CDB_BCPInCmd;
  66. class CDB_CursorCmd;
  67. class CDB_SendDataCmd;
  68. class CDB_ResultProcessor;
  69. /////////////////////////////////////////////////////////////////////////////
  70. //
  71. //  I_ITDescriptor::
  72. //
  73. // Image or Text descriptor.
  74. //
  75. class NCBI_DBAPIDRIVER_EXPORT I_ITDescriptor
  76. {
  77. public:
  78.     virtual int DescriptorType() const = 0;
  79.     virtual ~I_ITDescriptor();
  80. };
  81. class NCBI_DBAPIDRIVER_EXPORT C_ITDescriptorGuard
  82. {
  83. public:
  84.     C_ITDescriptorGuard(I_ITDescriptor* d) {
  85.         m_D = d;
  86.     }
  87.     ~C_ITDescriptorGuard() {
  88.         if ( m_D )
  89.             delete m_D;
  90.     }
  91. private:
  92.     I_ITDescriptor* m_D;
  93. };
  94. /////////////////////////////////////////////////////////////////////////////
  95. //
  96. //  EDB_ResType::
  97. //
  98. // Type of result set
  99. //
  100. enum EDB_ResType {
  101.     eDB_RowResult,
  102.     eDB_ParamResult,
  103.     eDB_ComputeResult,
  104.     eDB_StatusResult,
  105.     eDB_CursorResult
  106. };
  107. /////////////////////////////////////////////////////////////////////////////
  108. //
  109. //  CDB_BaseEnt::
  110. //
  111. // Base class for most interface classes.
  112. // It keeps a double-reference to itself, and resets this reference
  113. // (used by others to access this object) on the object destruction.
  114. //
  115. class NCBI_DBAPIDRIVER_EXPORT CDB_BaseEnt
  116. {
  117. public:
  118.     CDB_BaseEnt() {
  119.         m_BR = 0;
  120.     }
  121.     void Acquire(CDB_BaseEnt** br) {
  122.         m_BR = br;
  123.     }
  124.     virtual void Release();
  125.     virtual ~CDB_BaseEnt();
  126. protected:
  127.     CDB_BaseEnt** m_BR;  // double-reference to itself
  128.     // To allow "I_***Cmd" to create CDB_Result
  129.     static CDB_Result* Create_Result(I_Result& result);
  130. };
  131. /////////////////////////////////////////////////////////////////////////////
  132. //
  133. //  I_BaseCmd::
  134. //
  135. // Abstract base class for most "command" interface classes.
  136. //
  137. class NCBI_DBAPIDRIVER_EXPORT I_BaseCmd : public CDB_BaseEnt
  138. {
  139. public:
  140.     // Send command to the server
  141.     virtual bool Send() = 0;
  142.     virtual bool WasSent() const = 0;
  143.     // Cancel the command execution
  144.     virtual bool Cancel() = 0;
  145.     virtual bool WasCanceled() const = 0;
  146.     // Get result set
  147.     virtual CDB_Result* Result() = 0;
  148.     virtual bool HasMoreResults() const = 0;
  149.     // Check if command has failed
  150.     virtual bool HasFailed() const = 0;
  151.     // Get the number of rows affected by the command
  152.     // Special case:  negative on error or if there is no way that this
  153.     //                command could ever affect any rows (like PRINT).
  154.     virtual int RowCount() const = 0;
  155.     // Dump the results of the command
  156.     // if result processor is installed for this connection, it will be called for
  157.     // each result set
  158.     virtual void DumpResults()= 0;
  159.     // Destructor
  160.     virtual ~I_BaseCmd();
  161. };
  162. /////////////////////////////////////////////////////////////////////////////
  163. //
  164. //  I_LangCmd::
  165. //  I_RPCCmd::
  166. //  I_BCPInCmd::
  167. //  I_CursorCmd::
  168. //  I_SendDataCmd::
  169. //
  170. // "Command" interface classes.
  171. //
  172. class NCBI_DBAPIDRIVER_EXPORT I_LangCmd : public I_BaseCmd
  173. {
  174. protected:
  175.     // Add more text to the language command
  176.     virtual bool More(const string& query_text) = 0;
  177.     // Bind cmd parameter with name "name" to the object pointed by "value"
  178.     virtual bool BindParam(const string& name, CDB_Object* param_ptr) = 0;
  179.     // Set cmd parameter with name "name" to the object pointed by "value"
  180.     virtual bool SetParam(const string& name, CDB_Object* param_ptr) = 0;
  181. public:
  182.     virtual ~I_LangCmd();
  183.     friend class CDB_LangCmd;
  184. };
  185. class NCBI_DBAPIDRIVER_EXPORT I_RPCCmd : public I_BaseCmd
  186. {
  187. protected:
  188.     // Binding
  189.     virtual bool BindParam(const string& name, CDB_Object* param_ptr,
  190.                            bool out_param = false) = 0;
  191.     // Setting
  192.     virtual bool SetParam(const string& name, CDB_Object* param_ptr,
  193.                           bool out_param = false) = 0;
  194.     // Set the "recompile before execute" flag for the stored proc
  195.     virtual void SetRecompile(bool recompile = true) = 0;
  196. public:
  197.     virtual ~I_RPCCmd();
  198.     friend class CDB_RPCCmd;
  199. };
  200. class NCBI_DBAPIDRIVER_EXPORT I_BCPInCmd : public CDB_BaseEnt
  201. {
  202. protected:
  203.     // Binding
  204.     virtual bool Bind(unsigned int column_num, CDB_Object* param_ptr) = 0;
  205.     // Send row to the server
  206.     virtual bool SendRow() = 0;
  207.     // Complete batch -- to store all rows transferred by far in this batch
  208.     // into the table
  209.     virtual bool CompleteBatch() = 0;
  210.     // Cancel the BCP command 
  211.     virtual bool Cancel() = 0;
  212.     // Complete the BCP and store all rows transferred in last batch into
  213.     // the table
  214.     virtual bool CompleteBCP() = 0;
  215. public:
  216.     virtual ~I_BCPInCmd();
  217.     friend class CDB_BCPInCmd;
  218. };
  219. class NCBI_DBAPIDRIVER_EXPORT I_CursorCmd : public CDB_BaseEnt
  220. {
  221. protected:
  222.     // Binding
  223.     virtual bool BindParam(const string& name, CDB_Object* param_ptr) = 0;
  224.     // Open the cursor.
  225.     // Return NULL if cursor resulted in no data.
  226.     // Throw exception on error.
  227.     virtual CDB_Result* Open() = 0;
  228.     // Update the last fetched row.
  229.     // NOTE: the cursor must be declared for update in CDB_Connection::Cursor()
  230.     virtual bool Update(const string& table_name, const string& upd_query) = 0;
  231.     virtual bool UpdateTextImage(unsigned int item_num, CDB_Stream& data, 
  232.                                  bool log_it = true) = 0;
  233.     virtual CDB_SendDataCmd* SendDataCmd(unsigned int item_num, size_t size, 
  234.                                          bool log_it = true) = 0;
  235.     // Delete the last fetched row.
  236.     // NOTE: the cursor must be declared for delete in CDB_Connection::Cursor()
  237.     virtual bool Delete(const string& table_name) = 0;
  238.     // Get the number of fetched rows
  239.     // Special case:  negative on error or if there is no way that this
  240.     //                command could ever affect any rows (like PRINT).
  241.     virtual int RowCount() const = 0;
  242.     // Close the cursor.
  243.     // Return FALSE if the cursor is closed already (or not opened yet)
  244.     virtual bool Close() = 0;
  245. public:
  246.     virtual ~I_CursorCmd();
  247.     friend class CDB_CursorCmd;
  248. };
  249. class NCBI_DBAPIDRIVER_EXPORT I_SendDataCmd : public CDB_BaseEnt
  250. {
  251. protected:
  252.     // Send chunk of data to the server.
  253.     // Return number of bytes actually transferred to server.
  254.     virtual size_t SendChunk(const void* pChunk, size_t nofBytes) = 0;
  255. public:
  256.     virtual ~I_SendDataCmd();
  257.     friend class CDB_SendDataCmd;
  258. };
  259.     
  260. /////////////////////////////////////////////////////////////////////////////
  261. //
  262. //  I_Result::
  263. //
  264. class NCBI_DBAPIDRIVER_EXPORT I_Result : public CDB_BaseEnt
  265. {
  266. public:
  267.     // Get type of the result
  268.     virtual EDB_ResType ResultType() const = 0;
  269.     // Get # of items (columns) in the result
  270.     virtual unsigned int NofItems() const = 0;
  271.     // Get name of a result item.
  272.     // Return NULL if "item_num" >= NofItems().
  273.     virtual const char* ItemName(unsigned int item_num) const = 0;
  274.     // Get size (in bytes) of a result item.
  275.     // Return zero if "item_num" >= NofItems().
  276.     virtual size_t ItemMaxSize(unsigned int item_num) const = 0;
  277.     // Get datatype of a result item.
  278.     // Return 'eDB_UnsupportedType' if "item_num" >= NofItems().
  279.     virtual EDB_Type ItemDataType(unsigned int item_num) const = 0;
  280.     // Fetch next row
  281.     virtual bool Fetch() = 0;
  282.     // Return current item number we can retrieve (0,1,...)
  283.     // Return "-1" if no more items left (or available) to read.
  284.     virtual int CurrentItemNo() const = 0;
  285.     // Get a result item (you can use either GetItem or ReadItem).
  286.     // If "item_buf" is not NULL, then use "*item_buf" (its type should be
  287.     // compatible with the type of retrieved item!) to retrieve the item to;
  288.     // otherwise allocate new "CDB_Object".
  289.     virtual CDB_Object* GetItem(CDB_Object* item_buf = 0) = 0;
  290.     // Read a result item body (for text/image mostly).
  291.     // Return number of successfully read bytes.
  292.     // Set "*is_null" to TRUE if the item is <NULL>.
  293.     // Throw an exception on any error.
  294.     virtual size_t ReadItem(void* buffer, size_t buffer_size,
  295.                             bool* is_null = 0) = 0;
  296.     // Get a descriptor for text/image column (for SendData).
  297.     // Return NULL if this result doesn't (or can't) have img/text descriptor.
  298.     // NOTE: you need to call ReadItem (maybe even with buffer_size == 0)
  299.     //       before calling this method!
  300.     virtual I_ITDescriptor* GetImageOrTextDescriptor() = 0;
  301.     // Skip result item
  302.     virtual bool SkipItem() = 0;
  303. public:
  304.     virtual ~I_Result();
  305.     friend class CDB_Result;
  306. };
  307.     
  308. /////////////////////////////////////////////////////////////////////////////
  309. //
  310. //  I_DriverContext::
  311. //
  312. class NCBI_DBAPIDRIVER_EXPORT I_DriverContext
  313. {
  314. public:
  315.     // Connection mode
  316.     enum EConnectionMode {
  317.         fBcpIn             = 0x1,
  318.         fPasswordEncrypted = 0x2,
  319.         fDoNotConnect      = 0x4   // Use just connections from NotInUse pool
  320.         // all driver-specific mode flags > 0x100
  321.     };
  322.     typedef int TConnectionMode;  // holds a binary OR of "EConnectionMode"
  323.     // Set login and connection timeouts.
  324.     // NOTE:  if "nof_secs" is zero or is "too big" (depends on the underlying
  325.     //        DB API), then set the timeout to infinite.
  326.     // Return FALSE on error.
  327.     virtual bool SetLoginTimeout (unsigned int nof_secs = 0) = 0;
  328.     virtual bool SetTimeout      (unsigned int nof_secs = 0) = 0;
  329.     // Set maximal size for Text and Image objects. Text and Image objects
  330.     // exceeding this size will be truncated.
  331.     // Return FALSE on error (e.g. if "nof_bytes" is too big).
  332.     virtual bool SetMaxTextImageSize(size_t nof_bytes) = 0;
  333.     // Create new connection to specified server (within this context).
  334.     // It is your responsibility to delete the returned connection object.
  335.     virtual CDB_Connection* Connect(const string&   srv_name,
  336.                                     const string&   user_name,
  337.                                     const string&   passwd, 
  338.                                     TConnectionMode mode,
  339.                                     bool            reusable  = false,
  340.                                     const string&   pool_name = kEmptyStr) = 0;
  341.     // Return number of currently open connections in this context.
  342.     // If "srv_name" is not NULL, then return # of conn. open to that server.
  343.     virtual unsigned int NofConnections(const string& srv_name  = kEmptyStr,
  344.                                         const string& pool_name = kEmptyStr)
  345.         const;
  346.     // Add message handler "h" to process 'context-wide' (not bound 
  347.     // to any particular connection) error messages.
  348.     virtual void PushCntxMsgHandler(CDB_UserHandler* h);
  349.     // Remove message handler "h" and all handlers above it in the stack
  350.     virtual void PopCntxMsgHandler(CDB_UserHandler* h);
  351.     // Add `per-connection' err.message handler "h" to the stack of default
  352.     // handlers which are inherited by all newly created connections.
  353.     virtual void PushDefConnMsgHandler(CDB_UserHandler* h);
  354.     // Remove `per-connection' mess. handler "h" and all above it in the stack.
  355.     virtual void PopDefConnMsgHandler(CDB_UserHandler* h);
  356.     // Report if the driver supports this functionality
  357.     enum ECapability {
  358.         eBcp,
  359.         eReturnITDescriptors,
  360.         eReturnComputeResults
  361.     };
  362.     virtual bool IsAbleTo(ECapability cpb) const = 0;
  363.     // close reusable deleted connections for specified server and/or pool
  364.     void CloseUnusedConnections(const string& srv_name  = kEmptyStr,
  365.                                 const string& pool_name = kEmptyStr);
  366.     virtual ~I_DriverContext();
  367. protected:
  368.     I_DriverContext();
  369.     // To allow children of I_DriverContext to create CDB_Connection
  370.     static CDB_Connection* Create_Connection(I_Connection& connection);
  371.     // Used and unused(reserve) connections
  372.     CPointerPot m_NotInUse;
  373.     CPointerPot m_InUse;
  374.     // Stacks of `per-context' and `per-connection' err.message handlers
  375.     CDBHandlerStack m_CntxHandlers;
  376.     CDBHandlerStack m_ConnHandlers;
  377.     mutable CFastMutex m_Mtx;
  378. private:
  379.     // Return unused connection "conn" to the driver context for future
  380.     // reuse (if "conn_reusable" is TRUE) or utilization
  381.     void x_Recycle(I_Connection* conn, bool conn_reusable);
  382.     friend class CDB_Connection;
  383. };
  384. /////////////////////////////////////////////////////////////////////////////
  385. //
  386. //  I_Connection::
  387. //
  388. class NCBI_DBAPIDRIVER_EXPORT I_Connection : public CDB_BaseEnt
  389. {
  390.     friend class I_DriverContext;
  391. protected:
  392.     // Check out if connection is alive (this function doesn't ping the server,
  393.     // it just checks the status of connection which was set by the last
  394.     // i/o operation)
  395.     virtual bool IsAlive() = 0;
  396.     // These methods:  LangCmd(), RPC(), BCPIn(), Cursor() and SendDataCmd()
  397.     // create and return a "command" object, register it for later use with
  398.     // this (and only this!) connection.
  399.     // On error, an exception will be thrown (they never return NULL!).
  400.     // It is the user's responsibility to delete the returned "command" object.
  401.     // Language command
  402.     virtual CDB_LangCmd* LangCmd(const string& lang_query,
  403.                                  unsigned int  nof_params = 0) = 0;
  404.     // Remote procedure call
  405.     virtual CDB_RPCCmd* RPC(const string& rpc_name,
  406.                             unsigned int  nof_args) = 0;
  407.     // "Bulk copy in" command
  408.     virtual CDB_BCPInCmd* BCPIn(const string& table_name,
  409.                                 unsigned int  nof_columns) = 0;
  410.     // Cursor
  411.     virtual CDB_CursorCmd* Cursor(const string& cursor_name,
  412.                                   const string& query,
  413.                                   unsigned int  nof_params,
  414.                                   unsigned int  batch_size = 1) = 0;
  415.     // "Send-data" command
  416.     virtual CDB_SendDataCmd* SendDataCmd(I_ITDescriptor& desc,
  417.                                          size_t          data_size,
  418.                                          bool            log_it = true) = 0;
  419.     // Shortcut to send text and image to the server without using the
  420.     // "Send-data" command (SendDataCmd)
  421.     virtual bool SendData(I_ITDescriptor& desc, CDB_Text& txt,
  422.                           bool log_it = true) = 0;
  423.     virtual bool SendData(I_ITDescriptor& desc, CDB_Image& img,
  424.                           bool log_it = true) = 0;
  425.     // Reset the connection to the "ready" state (cancel all active commands)
  426.     virtual bool Refresh() = 0;
  427.     // Get the server name, user login name, and password
  428.     virtual const string& ServerName() const = 0;
  429.     virtual const string& UserName() const = 0;
  430.     virtual const string& Password() const = 0;
  431.     // Get the bitmask for the connection mode (BCP, secure login, ...)
  432.     virtual I_DriverContext::TConnectionMode ConnectMode() const = 0;
  433.     // Check if this connection is a reusable one
  434.     virtual bool IsReusable() const = 0;
  435.     // Find out which connection pool this connection belongs to
  436.     virtual const string& PoolName() const = 0;
  437.     // Get pointer to the driver context
  438.     virtual I_DriverContext* Context() const = 0;
  439.     // Put the message handler into message handler stack
  440.     virtual void PushMsgHandler(CDB_UserHandler* h) = 0;
  441.     // Remove the message handler (and all above it) from the stack
  442.     virtual void PopMsgHandler(CDB_UserHandler* h) = 0;
  443.     virtual CDB_ResultProcessor* SetResultProcessor(CDB_ResultProcessor* rp)=0;
  444.     // These methods to allow the children of I_Connection to create
  445.     // various command-objects
  446.     static CDB_LangCmd*     Create_LangCmd     (I_LangCmd&     lang_cmd    );
  447.     static CDB_RPCCmd*      Create_RPCCmd      (I_RPCCmd&      rpc_cmd     );
  448.     static CDB_BCPInCmd*    Create_BCPInCmd    (I_BCPInCmd&    bcpin_cmd   );
  449.     static CDB_CursorCmd*   Create_CursorCmd   (I_CursorCmd&   cursor_cmd  );
  450.     static CDB_SendDataCmd* Create_SendDataCmd (I_SendDataCmd& senddata_cmd);
  451. public:
  452.     virtual ~I_Connection();
  453.     friend class CDB_Connection;
  454. };
  455. typedef I_DriverContext* (*FDBAPI_CreateContext)(map<string,string>* attr);
  456. class NCBI_DBAPIDRIVER_EXPORT I_DriverMgr
  457. {
  458. public:
  459.     virtual void RegisterDriver(const string& driver_name,
  460.                                 FDBAPI_CreateContext driver_ctx_func) = 0;
  461.     virtual ~I_DriverMgr(void);
  462. };
  463. END_NCBI_SCOPE
  464. /* @} */
  465. /*
  466.  * ===========================================================================
  467.  * $Log: interfaces.hpp,v $
  468.  * Revision 1000.1  2003/11/17 22:11:27  gouriano
  469.  * PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.25
  470.  *
  471.  * Revision 1.25  2003/11/14 20:45:22  soussov
  472.  * adds DoNotConnect mode
  473.  *
  474.  * Revision 1.24  2003/07/17 22:08:02  soussov
  475.  * I_DriverContext to be friend of I_Connection
  476.  *
  477.  * Revision 1.23  2003/07/17 20:41:37  soussov
  478.  * connections pool improvements
  479.  *
  480.  * Revision 1.22  2003/06/05 20:26:39  soussov
  481.  * makes I_Result interface public
  482.  *
  483.  * Revision 1.21  2003/06/05 15:53:31  soussov
  484.  * adds DumpResults method for LangCmd and RPC, SetResultProcessor method for Connection interface
  485.  *
  486.  * Revision 1.20  2003/04/11 17:46:07  siyan
  487.  * Added doxygen support
  488.  *
  489.  * Revision 1.19  2003/04/01 20:25:16  vakatov
  490.  * Temporarily rollback to R1.16 -- until more backward-incompatible
  491.  * changes (in CException) are ready to commit (to avoid breaking the
  492.  * compatibility twice).
  493.  *
  494.  * Revision 1.17  2003/02/12 22:08:32  coremake
  495.  * Added export specifier NCBI_DBAPIDRIVER_EXPORT to the I_RPCCmd class declaration
  496.  *
  497.  * Revision 1.16  2002/12/26 19:29:12  dicuccio
  498.  * Added Win32 export specifier for base DBAPI library
  499.  *
  500.  * Revision 1.15  2002/12/20 17:52:47  soussov
  501.  * renames the members of ECapability enum
  502.  *
  503.  * Revision 1.14  2002/04/09 22:33:12  vakatov
  504.  * Identation
  505.  *
  506.  * Revision 1.13  2002/03/26 15:25:16  soussov
  507.  * new image/text operations added
  508.  *
  509.  * Revision 1.12  2002/01/20 07:21:00  vakatov
  510.  * I_DriverMgr:: -- added virtual destructor
  511.  *
  512.  * Revision 1.11  2002/01/17 22:33:13  soussov
  513.  * adds driver manager
  514.  *
  515.  * Revision 1.10  2002/01/15 17:12:40  soussov
  516.  * renaming 'tds' driver to 'ftds' driver
  517.  *
  518.  * Revision 1.9  2002/01/11 21:26:16  soussov
  519.  * changes typedef for FDBAPI_CreateContext
  520.  *
  521.  * Revision 1.8  2002/01/11 20:48:58  soussov
  522.  * changes typedef for FDBAPI_CreateContext
  523.  *
  524.  * Revision 1.7  2002/01/11 20:22:41  soussov
  525.  * driver manager support added
  526.  *
  527.  * Revision 1.6  2001/11/06 17:58:03  lavr
  528.  * Formatted uniformly as the rest of the library
  529.  *
  530.  * Revision 1.5  2001/10/01 20:09:27  vakatov
  531.  * Introduced a generic default user error handler and the means to
  532.  * alternate it. Added an auxiliary error handler class
  533.  * "CDB_UserHandler_Stream".
  534.  * Moved "{Push/Pop}{Cntx/Conn}MsgHandler()" to the generic code
  535.  * (in I_DriverContext).
  536.  *
  537.  * Revision 1.4  2001/09/27 20:08:29  vakatov
  538.  * Added "DB_" (or "I_") prefix where it was missing
  539.  *
  540.  * Revision 1.3  2001/09/26 23:23:26  vakatov
  541.  * Moved the err.message handlers' stack functionality (generic storage
  542.  * and methods) to the "abstract interface" level.
  543.  *
  544.  * Revision 1.2  2001/09/24 20:52:18  vakatov
  545.  * Fixed args like "string& s = 0" to "string& s = kEmptyStr"
  546.  *
  547.  * Revision 1.1  2001/09/21 23:39:52  vakatov
  548.  * -----  Initial (draft) revision.  -----
  549.  * This is a major revamp (by Denis Vakatov, with help from Vladimir Soussov)
  550.  * of the DBAPI "driver" libs originally written by Vladimir Soussov.
  551.  * The revamp involved massive code shuffling and grooming, numerous local
  552.  * API redesigns, adding comments and incorporating DBAPI to the C++ Toolkit.
  553.  *
  554.  * ===========================================================================
  555.  */
  556. #endif  /* DBAPI_DRIVER___INTERFACES__HPP */