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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dbapi.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:17:52  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.30
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI___DBAPI__HPP
  10. #define DBAPI___DBAPI__HPP
  11. /* $Id: dbapi.hpp,v 1000.3 2004/06/01 19:17:52 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:  Michael Kholodov
  37.  *   
  38.  * File Description:  Database API interface
  39.  *
  40.  */
  41. #include <corelib/ncbiobj.hpp>
  42. #include <dbapi/driver_mgr.hpp>
  43. #include <dbapi/variant.hpp>
  44. /** @addtogroup DbAPI
  45.  *
  46.  * @{
  47.  */
  48. BEGIN_NCBI_SCOPE
  49. /////////////////////////////////////////////////////////////////////////////
  50. //
  51. //  EDataSource::
  52. //
  53. //  Data source platform
  54. //
  55. // enum EDataSource {
  56. //   eSybase,
  57. //   eMsSql
  58. // };
  59. /////////////////////////////////////////////////////////////////////////////
  60. //
  61. //  EAllowLog::
  62. //
  63. //  Allow transaction log (general, to avoid using bools)
  64. //
  65. enum EAllowLog {
  66.    eDisableLog,
  67.    eEnableLog
  68. };  
  69. /////////////////////////////////////////////////////////////////////////////
  70. //
  71. //  IResultSetMetaData::
  72. //
  73. //  Used for retrieving column information from a resultset, such as 
  74. //  total number of columns, type, name, etc.
  75. //
  76. class NCBI_DBAPI_EXPORT IResultSetMetaData 
  77. {
  78. public:
  79.     virtual ~IResultSetMetaData();
  80.     virtual unsigned int GetTotalColumns() const = 0;
  81.     virtual EDB_Type     GetType    (unsigned int col) const = 0;
  82.     virtual int          GetMaxSize (unsigned int col) const = 0;
  83.     virtual string       GetName    (unsigned int col) const = 0;
  84. };
  85. /////////////////////////////////////////////////////////////////////////////
  86. //
  87. //  IResultSet::
  88. //
  89. //  Used to retrieve a resultset from a query or cursor
  90. //
  91. class NCBI_DBAPI_EXPORT IResultSet
  92. {
  93. public:
  94.     virtual ~IResultSet();
  95.     // See in <dbapi/driver/interfaces.hpp> for the list of result types
  96.     virtual EDB_ResType GetResultType() = 0;
  97.     // Get next row.
  98.     // NOTE:  no results are fetched before first call to this function.
  99.     virtual bool Next() = 0;
  100.     // All data (for BLOB data see below) is returned as CVariant.
  101.     virtual const CVariant& GetVariant(unsigned int col) = 0;
  102.     virtual const CVariant& GetVariant(const string& colName) = 0;
  103.     // Disables column binding.
  104.     // False by default
  105.     virtual void DisableBind(bool b) = 0;
  106.     // If this mode is true, BLOB data is returned as CVariant
  107.     // False by default
  108.     virtual void BindBlobToVariant(bool b) = 0;
  109.   
  110.     // Reads unformatted data, returns bytes actually read.
  111.     // Advances to next column as soon as data is read from the previous one.
  112.     // Returns 0 when the column data is fully read
  113.     // Valid only when the column binding is off (see DisableBind())
  114.     virtual size_t Read(void* buf, size_t size) = 0;
  115.     // Return true if the last column read was NULL.
  116.     // Valid only when the column binding is off (see DisableBind())
  117.     virtual bool WasNull() = 0;
  118.     // Returns current column number (while using Read())
  119.     virtual int GetColumnNo() = 0;
  120.     // Returns total number of columns in the resultset
  121.     virtual unsigned int GetTotalColumns() = 0;
  122.   
  123.     // Streams for handling BLOBs.
  124.     // NOTE: buf_size is the size of internal buffer, default 1024
  125.     virtual istream& GetBlobIStream(size_t buf_size = 1024) = 0;
  126.     // blob_size is the size of the BLOB to be written
  127.     // log_it enables transaction log for BLOB insert by default.
  128.     // Make sure you have enough log segment space, or disable it
  129.     virtual ostream& GetBlobOStream(size_t blob_size, 
  130.                                     EAllowLog log_it = eEnableLog,
  131.                                     size_t buf_size = 1024) = 0;
  132.     // Close resultset
  133.     virtual void Close() = 0;
  134.     // Get column description.
  135.     virtual const IResultSetMetaData* GetMetaData() = 0;
  136. };
  137. /////////////////////////////////////////////////////////////////////////////
  138. //
  139. //  IStatement::
  140. //
  141. //  Interface for a SQL statement
  142. //
  143. class NCBI_DBAPI_EXPORT IStatement
  144. {
  145. public:
  146.     virtual ~IStatement();
  147.   
  148.     // Get resulset. For statements with no resultset returns 0
  149.     virtual IResultSet* GetResultSet() = 0;
  150.     // Check if there is more results available
  151.     virtual bool HasMoreResults() = 0;
  152.     // Check if the statement failed
  153.     virtual bool Failed() = 0;
  154.   
  155.     // Check if resultset is not empty
  156.     virtual bool HasRows() = 0;
  157.     // Purge results
  158.     // NOTE: Calls fetch for every resultset received until
  159.     // finished. 
  160.     virtual void PurgeResults() = 0;
  161.     // Cancel statement
  162.     // NOTE: Rolls back current transaction
  163.     virtual void Cancel() = 0;
  164.     // Close statement
  165.     virtual void Close() = 0;
  166.   
  167.     // Executes one or more SQL statements
  168.     virtual void Execute(const string& sql) = 0;
  169.     // Executes SQL statement with no results returned
  170.     // NOTE: All resultsets are discarded.
  171.     virtual void ExecuteUpdate(const string& sql) = 0;
  172.     // Exectues SQL statement and returns the first resultset.
  173.     // NOTE: If there is more than one resultset, the rest remain
  174.     // pending unless either PurgeResults() is called or next statement
  175.     // is run or the statement is closed.
  176.     virtual IResultSet* ExecuteQuery(const string& sql) = 0;
  177.     // Executes the last command (with changed parameters, if any)
  178.     virtual void ExecuteLast() = 0;
  179.     // Set input/output parameter
  180.     virtual void SetParam(const CVariant& v, 
  181.      const string& name) = 0;
  182.     // Clear parameter list
  183.     virtual void ClearParamList() = 0;
  184.     // Get total of rows returned. 
  185.     // NOTE: Valid only after all rows are retrieved from a resultset
  186.     virtual int GetRowCount() = 0;
  187.     // Get the parent connection
  188.     // NOTE: if the original connections was cloned, returns cloned
  189.     // connection
  190.     virtual class IConnection* GetParentConn() = 0;
  191. };
  192. /////////////////////////////////////////////////////////////////////////////
  193. //
  194. //  ICallableStatement::
  195. //
  196. //  Used for calling a stored procedure thru RPC call
  197. //
  198. class NCBI_DBAPI_EXPORT ICallableStatement : public virtual IStatement
  199. {
  200. public:
  201.     virtual ~ICallableStatement();
  202.   
  203.     // Execute stored procedure
  204.     virtual void Execute() = 0;
  205.     // Executes stored procedure no results returned
  206.     // NOTE: All resultsets are discarded.
  207.     virtual void ExecuteUpdate() = 0;
  208.     // Get return status from the stored procedure
  209.     virtual int GetReturnStatus() = 0;
  210.     // Set input parameters
  211.     virtual void SetParam(const CVariant& v, 
  212.                           const string& name) = 0;
  213.     // Set output parameter, which will be returned as resultset
  214.     // NOTE: use CVariant(EDB_Type type) constructor or 
  215.     // factory method CVariant::<type>(0) to create empty object
  216.     // of a particular type
  217.     virtual void SetOutputParam(const CVariant& v, const string& name) = 0;
  218. protected:
  219.     // Mask unused methods
  220.     virtual void Execute(const string& /*sql*/);
  221.     virtual void ExecuteUpdate(const string& /*sql*/);
  222.     virtual IResultSet* ExecuteQuery(const string& /*sql*/);
  223. };
  224. /////////////////////////////////////////////////////////////////////////////
  225. //
  226. //  ICursor::
  227. //
  228. //  Interface for a cursor
  229. //
  230. class NCBI_DBAPI_EXPORT ICursor
  231. {
  232. public:
  233.     virtual ~ICursor();
  234.   
  235.     // Set input parameter
  236.     virtual void SetParam(const CVariant& v, 
  237. const string& name) = 0;
  238.     // Open cursor and get corresponding resultset
  239.     virtual IResultSet* Open() = 0;
  240.     // Get output stream for BLOB updates, requires BLOB column number
  241.     // NOTE: blob_size is the size of the BLOB to be written
  242.     // log_it enables transaction log for BLOB insert by default.
  243.     // Make sure you have enough log segment space, or disable it
  244.     virtual ostream& GetBlobOStream(unsigned int col,
  245.                                     size_t blob_size, 
  246.                                     EAllowLog log_it = eEnableLog,
  247.                                     size_t buf_size = 1024) = 0;
  248.     // Update statement for cursor
  249.     virtual void Update(const string& table, const string& updateSql) = 0;
  250.     // Delete statement for cursor
  251.     virtual void Delete(const string& table) = 0;
  252.     // Cancel cursor
  253.     virtual void Cancel() = 0;
  254.     
  255.     // Close cursor
  256.     virtual void Close() = 0;
  257.   
  258.     // Get the parent connection
  259.     // NOTE: if the original connections was cloned, returns cloned
  260.     // connection
  261.     virtual class IConnection* GetParentConn() = 0;
  262. };
  263. /////////////////////////////////////////////////////////////////////////////
  264. //
  265. //  IBulkInsert::
  266. //
  267. //  Interface for bulk insert
  268. //
  269. class NCBI_DBAPI_EXPORT IBulkInsert
  270. {
  271. public:
  272.     virtual ~IBulkInsert();
  273.   
  274.     // Bind columns
  275.     virtual void Bind(unsigned int col, CVariant* v) = 0;
  276.     // Add row to the batch
  277.     virtual void AddRow() = 0;
  278.     // Store batch of rows
  279.     virtual void StoreBatch() = 0;
  280.     // Cancel bulk insert
  281.     virtual void Cancel() = 0;
  282.     // Complete batch
  283.     virtual void Complete() = 0;
  284.     // Close
  285.     virtual void Close() = 0;
  286. };
  287. /////////////////////////////////////////////////////////////////////////////
  288. //
  289. //  IConnection::
  290. //
  291. //  Interface for a database connection
  292. //
  293. class NCBI_DBAPI_EXPORT IConnection 
  294. {
  295. public:
  296.     enum EConnMode {
  297.         eBulkInsert = I_DriverContext::fBcpIn,
  298.         ePasswordEncrypted = I_DriverContext::fPasswordEncrypted 
  299.     };
  300.     // Destructor
  301.     virtual ~IConnection();
  302.     // Connection modes
  303.     virtual void SetMode(EConnMode mode) = 0;
  304.     virtual void ResetMode(EConnMode mode) = 0;
  305.     virtual unsigned int GetModeMask() = 0;
  306.     // Force single connection mode, default false
  307.     // NOTE: disable this mode before using BLOB output streams
  308.     // from IResultSet, because extra connection is needed 
  309.     // in this case
  310.     virtual void ForceSingle(bool enable) = 0;
  311.     // Get parent datasource object
  312.     virtual IDataSource* GetDataSource() = 0;
  313.     // Connect to the database
  314.     virtual void Connect(const string& user,
  315.  const string& password,
  316.  const string& server,
  317.  const string& database = kEmptyStr) = 0;
  318.     // Clone existing connection. All settings are copied except
  319.     // message handlers
  320.     virtual IConnection* CloneConnection() = 0;
  321.     // Set current database
  322.     virtual void SetDatabase(const string& name) = 0;
  323.     // Get current database
  324.     virtual string GetDatabase() = 0;
  325.     // Check if the connection is alive
  326.     virtual bool IsAlive() = 0;
  327.     // NEW INTERFACE: no additional connections created
  328.     // while using the next four methods.
  329.     // Objects obtained with these methods can't be used
  330.     // simultaneously (like opening cursor while a stored
  331.     // procedure is running on the same connection)
  332.     // Get statement object for regular SQL queries
  333.     virtual IStatement* GetStatement() = 0;
  334.   
  335.     // Get callable statement object for stored procedures
  336.     virtual ICallableStatement* GetCallableStatement(const string& proc, 
  337.                                                      int nofArgs = 0) = 0;
  338.     // Get cursor object
  339.     virtual ICursor* GetCursor(const string& name, 
  340.                                const string& sql,
  341.                                int nofArgs = 0,
  342.                                int batchSize = 1) = 0;
  343.     // Create bulk insert object
  344.     virtual IBulkInsert* GetBulkInsert(const string& table_name,
  345.                                        unsigned int nof_cols) = 0;
  346.     // END OF NEW INTERFACE
  347.     // Get statement object for regular SQL queries
  348.     virtual IStatement* CreateStatement() = 0;
  349.   
  350.     // Get callable statement object for stored procedures
  351.     virtual ICallableStatement* PrepareCall(const string& proc, 
  352.                                             int nofArgs = 0) = 0;
  353.     // Get cursor object
  354.     virtual ICursor* CreateCursor(const string& name, 
  355.                                   const string& sql,
  356.                                   int nofArgs = 0,
  357.                                   int batchSize = 1) = 0;
  358.     // Create bulk insert object
  359.     virtual IBulkInsert* CreateBulkInsert(const string& table_name,
  360.                                           unsigned int nof_cols) = 0;
  361.     // Close connection
  362.     virtual void Close() = 0;
  363.     // If enabled, redirects all error messages 
  364.     // to CDB_MultiEx object (see below)
  365.     virtual void MsgToEx(bool v) = 0;
  366.     // Returns all error messages as a CDB_MultiEx object
  367.     virtual CDB_MultiEx* GetErrorAsEx() = 0;
  368.     // Returns all error messages as a single string
  369.     virtual string GetErrorInfo() = 0;
  370.     // Returns the internal driver connection object
  371.     virtual CDB_Connection* GetCDB_Connection() = 0;
  372. };
  373. /////////////////////////////////////////////////////////////////////////////
  374. //
  375. //  IDataSource::
  376. //
  377. //  Interface for a datasource
  378. //
  379. class NCBI_DBAPI_EXPORT IDataSource
  380. {
  381.     friend class CDriverManager;
  382. protected:
  383.     // Prohibit explicit deletion. Use CDriverManager::DestroyDs() call
  384.     virtual ~IDataSource();
  385. public:
  386.     // Get connection
  387.     virtual IConnection* CreateConnection() = 0;
  388.     virtual void SetLoginTimeout(unsigned int i) = 0;
  389.     // Set the output stream for server messages.
  390.     // Set it to zero to disable any output and collect
  391.     // messages in CDB_MultiEx (see below)
  392.     virtual void SetLogStream(ostream* out) = 0;
  393.     // Returns all server messages as a CDB_MultiEx object
  394.     virtual CDB_MultiEx* GetErrorAsEx() = 0;
  395.     // Returns all server messages as a single string
  396.     virtual string GetErrorInfo() = 0;
  397.     // Returns the pointer to the general driver interface
  398.     virtual I_DriverContext* GetDriverContext() = 0;
  399. };
  400. END_NCBI_SCOPE
  401. /* @} */
  402. /*
  403.  * ===========================================================================
  404.  * $Log: dbapi.hpp,v $
  405.  * Revision 1000.3  2004/06/01 19:17:52  gouriano
  406.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.30
  407.  *
  408.  * Revision 1.30  2004/04/26 14:17:40  kholodov
  409.  * Added: ExecuteQuery() method
  410.  *
  411.  * Revision 1.29  2004/04/22 15:15:09  kholodov
  412.  * Added: PurgeResults()
  413.  *
  414.  * Revision 1.28  2004/04/22 14:22:51  kholodov
  415.  * Added: Cancel()
  416.  *
  417.  * Revision 1.27  2004/03/09 20:37:37  kholodov
  418.  * Added: four new public methods
  419.  *
  420.  * Revision 1.26  2003/12/15 20:05:40  ivanov
  421.  * Added export specifier for building DLLs in MS Windows.
  422.  *
  423.  * Revision 1.25  2003/11/18 17:32:26  ucko
  424.  * Make IConnection::CloneConnection pure virtual.
  425.  *
  426.  * Revision 1.24  2003/11/18 17:00:36  kholodov
  427.  * Added: CloneConnection() method to IConnection interface
  428.  *
  429.  * Revision 1.23  2003/09/10 18:28:04  kholodov
  430.  * Added: GetCDB_Connection() method
  431.  *
  432.  * Revision 1.22  2003/05/16 20:17:01  kholodov
  433.  * Modified: default 0 arguments in PrepareCall()
  434.  *
  435.  * Revision 1.21  2003/04/11 17:45:55  siyan
  436.  * Added doxygen support
  437.  *
  438.  * Revision 1.20  2003/03/07 21:22:31  kholodov
  439.  * Added: IsAlive() method
  440.  *
  441.  * Revision 1.19  2003/02/12 15:53:23  kholodov
  442.  * Added: WasNull() method
  443.  *
  444.  * Revision 1.18  2003/02/10 17:17:15  kholodov
  445.  * Modified: made IDataSource::dtor() non-public
  446.  *
  447.  * Revision 1.17  2002/11/27 17:21:30  kholodov
  448.  * Added: Error output redirection to CToMultiExHandler object
  449.  * in IConnection interface.
  450.  *
  451.  * Revision 1.16  2002/10/31 22:37:12  kholodov
  452.  * Added: DisableBind(), GetColumnNo(), GetTotalColumns() methods
  453.  *
  454.  * Revision 1.15  2002/10/21 20:38:17  kholodov
  455.  * Added: GetParentConn() method to get the parent connection from IStatement,
  456.  * ICallableStatement and ICursor objects.
  457.  *
  458.  * Revision 1.14  2002/10/04 12:53:20  kholodov
  459.  * Fixed: IStatement::SetParam() accepts both imput and output parameters
  460.  *
  461.  * Revision 1.13  2002/10/03 18:51:03  kholodov
  462.  * Added: IStatement::ExecuteLast() method
  463.  * Added: IBulkInsert::Close() method
  464.  *
  465.  * Revision 1.12  2002/09/30 20:45:38  kholodov
  466.  * Added: ForceSingle() method to enforce single connection used
  467.  *
  468.  * Revision 1.11  2002/09/23 18:24:12  kholodov
  469.  * Added: IDataSource: GetErrorInfo() and GetErrorAsEx() methods.
  470.  * Added: IConnection: GetDataSource() method.
  471.  *
  472.  * Revision 1.10  2002/09/16 19:34:41  kholodov
  473.  * Added: bulk insert support
  474.  *
  475.  * Revision 1.9  2002/09/09 20:49:49  kholodov
  476.  * Added: IStatement::Failed() method
  477.  *
  478.  * Revision 1.8  2002/08/26 15:37:58  kholodov
  479.  * Added EAllowLog general purpose enum.
  480.  * Modified GetBlobOStream() methods to allow disabling transaction log while updating BLOBs
  481.  *
  482.  * Revision 1.7  2002/07/08 15:57:53  kholodov
  483.  * Added: GetBlobOStream() for BLOB updates to ICursor interface
  484.  *
  485.  * Revision 1.6  2002/04/25 13:35:05  kholodov
  486.  * Added GetDriverContext() returning pointer to underlying I_DriverContext interface
  487.  *
  488.  * Revision 1.5  2002/04/05 19:36:16  kholodov
  489.  * Added: IResultset::GetVariant(const string& colName) to retrieve
  490.  * column values by column name
  491.  * Added: ICallableStatement::ExecuteUpdate() to skip all resultsets returned
  492.  * if any
  493.  *
  494.  * Revision 1.4  2002/02/08 22:43:12  kholodov
  495.  * Set/GetDataBase() renamed to Set/GetDatabase() respectively
  496.  *
  497.  * Revision 1.3  2002/02/08 21:29:55  kholodov
  498.  * SetDataBase() restored, connection cloning algorithm changed
  499.  *
  500.  * Revision 1.2  2002/02/08 17:47:35  kholodov
  501.  * Removed SetDataBase() method
  502.  *
  503.  * Revision 1.1  2002/01/30 14:51:24  kholodov
  504.  * User DBAPI implementation, first commit
  505.  *
  506.  * ===========================================================================
  507.  */
  508. #endif  /* DBAPI___DBAPI__HPP */