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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: public.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:19:08  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_DRIVER___PUBLIC__HPP
  10. #define DBAPI_DRIVER___PUBLIC__HPP
  11. /* $Id: public.hpp,v 1000.0 2003/10/29 20:19:08 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 public interfaces
  39.  *
  40.  */
  41. #include <dbapi/driver/interfaces.hpp>
  42. /** @addtogroup DbPubInterfaces
  43.  *
  44.  * @{
  45.  */
  46. BEGIN_NCBI_SCOPE
  47. class NCBI_DBAPIDRIVER_EXPORT CDB_Connection : public I_Connection
  48. {
  49. public:
  50.     // Check out if connection is alive (this function doesn't ping the server,
  51.     // it just checks the status of connection which was set by the last
  52.     // i/o operation)
  53.     virtual bool IsAlive();
  54.     // These methods:  LangCmd(), RPC(), BCPIn(), Cursor() and SendDataCmd()
  55.     // create and return a "command" object, register it for later use with
  56.     // this (and only this!) connection.
  57.     // On error, an exception will be thrown (they never return NULL!).
  58.     // It is the user's responsibility to delete the returned "command" object.
  59.     // Language command
  60.     virtual CDB_LangCmd*     LangCmd(const string& lang_query,
  61.                                      unsigned int  nof_params = 0);
  62.     // Remote procedure call
  63.     virtual CDB_RPCCmd*      RPC(const string& rpc_name,
  64.                                  unsigned int  nof_args);
  65.     // "Bulk copy in" command
  66.     virtual CDB_BCPInCmd*    BCPIn(const string& table_name,
  67.                                    unsigned int  nof_columns);
  68.     // Cursor
  69.     virtual CDB_CursorCmd*   Cursor(const string& cursor_name,
  70.                                     const string& query,
  71.                                     unsigned int  nof_params,
  72.                                     unsigned int  batch_size = 1);
  73.     // "Send-data" command
  74.     virtual CDB_SendDataCmd* SendDataCmd(I_ITDescriptor& desc,
  75.                                          size_t          data_size,
  76.                                          bool            log_it = true);
  77.     // Shortcut to send text and image to the server without using the
  78.     // "Send-data" command (SendDataCmd)
  79.     virtual bool SendData(I_ITDescriptor& desc, CDB_Text& txt,
  80.                           bool log_it = true);
  81.     virtual bool SendData(I_ITDescriptor& desc, CDB_Image& img,
  82.                           bool log_it = true);
  83.     // Reset the connection to the "ready" state (cancel all active commands)
  84.     virtual bool Refresh();
  85.     // Get the server name, user login name, and password
  86.     virtual const string& ServerName() const;
  87.     virtual const string& UserName() const;
  88.     virtual const string& Password() const;
  89.     // Get the bitmask for the connection mode (BCP, secure login, ...)
  90.     virtual I_DriverContext::TConnectionMode ConnectMode() const;
  91.     // Check if this connection is a reusable one
  92.     virtual bool IsReusable() const;
  93.     // Find out which connection pool this connection belongs to
  94.     virtual const string& PoolName() const;
  95.     // Get pointer to the driver context
  96.     virtual I_DriverContext* Context() const;
  97.     // Put the message handler into message handler stack
  98.     virtual void PushMsgHandler(CDB_UserHandler* h);
  99.     // Remove the message handler (and all above it) from the stack
  100.     virtual void PopMsgHandler(CDB_UserHandler* h);
  101.     virtual CDB_ResultProcessor* SetResultProcessor(CDB_ResultProcessor* rp);
  102.     // Destructor
  103.     virtual ~CDB_Connection();
  104. private:
  105.     I_Connection* m_Connect;
  106.     // The constructor should be called by "I_DriverContext" only!
  107.     friend class I_DriverContext;
  108.     CDB_Connection(I_Connection* c);
  109.     // Prohibit default- and copy- constructors, and assignment
  110.     CDB_Connection();
  111.     CDB_Connection& operator= (const CDB_Connection&);
  112.     CDB_Connection(const CDB_Connection&);
  113. };
  114. class NCBI_DBAPIDRIVER_EXPORT CDB_Result : public I_Result
  115. {
  116. public:
  117.     // Get type of the result
  118.     virtual EDB_ResType ResultType() const;
  119.     // Get # of items (columns) in the result
  120.     virtual unsigned int NofItems() const;
  121.     // Get name of a result item.
  122.     // Return NULL if "item_num" >= NofItems().
  123.     virtual const char* ItemName(unsigned int item_num) const;
  124.     // Get size (in bytes) of a result item.
  125.     // Return zero if "item_num" >= NofItems().
  126.     virtual size_t ItemMaxSize(unsigned int item_num) const;
  127.     // Get datatype of a result item.
  128.     // Return 'eDB_UnsupportedType' if "item_num" >= NofItems().
  129.     virtual EDB_Type ItemDataType(unsigned int item_num) const;
  130.     // Fetch next row.
  131.     // Return FALSE if no more rows to fetch. Throw exception on any error.
  132.     virtual bool Fetch();
  133.     // Return current item number we can retrieve (0,1,...)
  134.     // Return "-1" if no more items left (or available) to read.
  135.     virtual int CurrentItemNo() const;
  136.     // Get a result item (you can use either GetItem or ReadItem).
  137.     // If "item_buf" is not NULL, then use "*item_buf" (its type should be
  138.     // compatible with the type of retrieved item!) to retrieve the item to;
  139.     // otherwise allocate new "CDB_Object".
  140.     virtual CDB_Object* GetItem(CDB_Object* item_buf = 0);
  141.     // Read a result item body (for text/image mostly).
  142.     // Return number of successfully read bytes.
  143.     // Set "*is_null" to TRUE if the item is <NULL>.
  144.     // Throw an exception on any error.
  145.     virtual size_t ReadItem(void* buffer, size_t buffer_size,
  146.                             bool* is_null = 0);
  147.     // Get a descriptor for text/image column (for SendData).
  148.     // Return NULL if this result does not (or can't) have img/text descriptor.
  149.     // NOTE: you need to call ReadItem (maybe even with buffer_size == 0)
  150.     //       before calling this method!
  151.     virtual I_ITDescriptor* GetImageOrTextDescriptor();
  152.     // Skip result item
  153.     virtual bool SkipItem();
  154.     // Destructor
  155.     virtual ~CDB_Result();
  156. private:
  157.     I_Result* m_Res;
  158.     // The constructor should be called by "I_***Cmd" only!
  159.     friend class CDB_BaseEnt;
  160.     CDB_Result(I_Result* r);
  161.     // Prohibit default- and copy- constructors, and assignment
  162.     CDB_Result& operator= (const CDB_Result&);
  163.     CDB_Result(const CDB_Result&);
  164.     CDB_Result();
  165. };
  166. class NCBI_DBAPIDRIVER_EXPORT CDB_LangCmd : public I_LangCmd
  167. {
  168. public:
  169.     // Add more text to the language command
  170.     virtual bool More(const string& query_text);
  171.     // Bind cmd parameter with name "name" to the object pointed by "value"
  172.     virtual bool BindParam(const string& name, CDB_Object* value);
  173.     // Set cmd parameter with name "name" to the object pointed by "value"
  174.     virtual bool SetParam(const string& name, CDB_Object* value);
  175.     // Send command to the server
  176.     virtual bool Send();
  177.     virtual bool WasSent() const;
  178.     // Cancel the command execution
  179.     virtual bool Cancel();
  180.     virtual bool WasCanceled() const;
  181.     // Get result set
  182.     virtual CDB_Result* Result();
  183.     virtual bool HasMoreResults() const;
  184.     // Check if command has failed
  185.     virtual bool HasFailed() const;
  186.     // Get the number of rows affected by the command.
  187.     // Special case:  negative on error or if there is no way that this
  188.     //                command could ever affect any rows (like PRINT).
  189.     virtual int RowCount() const;
  190.     // Dump the results of the command
  191.     // If result processor is installed for this connection, then it will be
  192.     // called for each result set
  193.     virtual void DumpResults();
  194.     // Destructor
  195.     virtual ~CDB_LangCmd();
  196. private:
  197.     I_LangCmd* m_Cmd;
  198.     // The constructor should be called by "I_Connection" only!
  199.     friend class I_Connection;
  200.     CDB_LangCmd(I_LangCmd* cmd);
  201.     // Prohibit default- and copy- constructors, and assignment
  202.     CDB_LangCmd& operator= (const CDB_LangCmd&);
  203.     CDB_LangCmd(const CDB_LangCmd&);
  204.     CDB_LangCmd();
  205. };
  206. class NCBI_DBAPIDRIVER_EXPORT CDB_RPCCmd : public I_RPCCmd
  207. {
  208. public:
  209.     // Binding
  210.     virtual bool BindParam(const string& name, CDB_Object* value,
  211.                            bool out_param = false);
  212.     // Setting
  213.     virtual bool SetParam(const string& name, CDB_Object* value,
  214.                           bool out_param = false);
  215.     // Send command to the server
  216.     virtual bool Send();
  217.     virtual bool WasSent() const;
  218.     // Cancel the command execution
  219.     virtual bool Cancel();
  220.     virtual bool WasCanceled() const;
  221.     // Get result set.
  222.     // Return NULL if no more results left to read.
  223.     // Throw exception on error or if attempted to read after NULL was returned
  224.     virtual CDB_Result* Result();
  225.     // Return TRUE if it makes sense (at all) to call Result()
  226.     virtual bool HasMoreResults() const;
  227.     // Check if command has failed
  228.     virtual bool HasFailed() const;
  229.     // Get the number of rows affected by the command
  230.     // Special case:  negative on error or if there is no way that this
  231.     //                command could ever affect any rows (like PRINT).
  232.     virtual int RowCount() const;
  233.     // Dump the results of the command
  234.     // If result processor is installed for this connection, then it will be
  235.     // called for each result set
  236.     virtual void DumpResults();
  237.     // Set the "recompile before execute" flag for the stored proc
  238.     virtual void SetRecompile(bool recompile = true);
  239.     // Destructor
  240.     virtual ~CDB_RPCCmd();
  241.     
  242. private:
  243.     I_RPCCmd* m_Cmd;
  244.     // The constructor should be called by "I_Connection" only!
  245.     friend class I_Connection;
  246.     CDB_RPCCmd(I_RPCCmd* rpc);
  247.     // Prohibit default- and copy- constructors, and assignment
  248.     CDB_RPCCmd& operator= (const CDB_RPCCmd&);
  249.     CDB_RPCCmd(const CDB_RPCCmd&);
  250.     CDB_RPCCmd();
  251. };
  252. class NCBI_DBAPIDRIVER_EXPORT CDB_BCPInCmd : public I_BCPInCmd
  253. {
  254. public:
  255.     // Binding
  256.     virtual bool Bind(unsigned int column_num, CDB_Object* value);
  257.     // Send row to the server
  258.     virtual bool SendRow();
  259.     // Complete batch -- to store all rows transferred by far in this batch
  260.     // into the table
  261.     virtual bool CompleteBatch();
  262.     // Cancel the BCP command
  263.     virtual bool Cancel();
  264.     // Complete the BCP and store all rows transferred in last batch into
  265.     // the table
  266.     virtual bool CompleteBCP();
  267.     // Destructor
  268.     virtual ~CDB_BCPInCmd();
  269. private:
  270.     I_BCPInCmd* m_Cmd;
  271.     // The constructor should be called by "I_Connection" only!
  272.     friend class I_Connection;
  273.     CDB_BCPInCmd(I_BCPInCmd* bcp);
  274.     // Prohibit default- and copy- constructors, and assignment
  275.     CDB_BCPInCmd& operator= (const CDB_BCPInCmd&);
  276.     CDB_BCPInCmd(const CDB_BCPInCmd&);
  277.     CDB_BCPInCmd();
  278. };
  279. class NCBI_DBAPIDRIVER_EXPORT CDB_CursorCmd : public I_CursorCmd
  280. {
  281. public:
  282.     // Binding
  283.     virtual bool BindParam(const string& name, CDB_Object* value);
  284.     // Open the cursor.
  285.     // Return NULL if cursor resulted in no data.
  286.     // Throw exception on error.
  287.     virtual CDB_Result* Open();
  288.     // Update the last fetched row.
  289.     // NOTE: the cursor must be declared for update in CDB_Connection::Cursor()
  290.     virtual bool Update(const string& table_name, const string& upd_query);
  291.     virtual bool UpdateTextImage(unsigned int item_num, CDB_Stream& data, 
  292.                                  bool log_it = true);
  293.     virtual CDB_SendDataCmd* SendDataCmd(unsigned int item_num, size_t size, 
  294.                                          bool log_it = true);
  295.     // Delete the last fetched row.
  296.     // NOTE: the cursor must be declared for delete in CDB_Connection::Cursor()
  297.     virtual bool Delete(const string& table_name);
  298.     // Get the number of fetched rows
  299.     // Special case:  negative on error or if there is no way that this
  300.     //                command could ever affect any rows (like PRINT).
  301.     virtual int RowCount() const;
  302.     // Close the cursor.
  303.     // Return FALSE if the cursor is closed already (or not opened yet)
  304.     virtual bool Close();
  305.     // Destructor
  306.     virtual ~CDB_CursorCmd();
  307. private:
  308.     I_CursorCmd* m_Cmd;
  309.     // The constructor should be called by "I_Connection" only!
  310.     friend class I_Connection;
  311.     CDB_CursorCmd(I_CursorCmd* cur);
  312.     // Prohibit default- and copy- constructors, and assignment
  313.     CDB_CursorCmd& operator= (const CDB_CursorCmd&);
  314.     CDB_CursorCmd(const CDB_CursorCmd&);
  315.     CDB_CursorCmd();
  316. };
  317. class NCBI_DBAPIDRIVER_EXPORT CDB_SendDataCmd : public I_SendDataCmd
  318. {
  319. public:
  320.     // Send chunk of data to the server.
  321.     // Return number of bytes actually transferred to server.
  322.     virtual size_t SendChunk(const void* data, size_t size);
  323.     // Destructor
  324.     virtual ~CDB_SendDataCmd();
  325. private:
  326.     I_SendDataCmd* m_Cmd;
  327.     // The constructor should be called by "I_Connection" only!
  328.     friend class I_Connection;
  329.     CDB_SendDataCmd(I_SendDataCmd* c);
  330.     // Prohibit default- and copy- constructors, and assignment
  331.     CDB_SendDataCmd& operator= (const CDB_SendDataCmd&);
  332.     CDB_SendDataCmd(const CDB_CursorCmd&);
  333.     CDB_SendDataCmd();
  334. };
  335. class NCBI_DBAPIDRIVER_EXPORT CDB_ITDescriptor : public I_ITDescriptor
  336. {
  337. public:
  338.     CDB_ITDescriptor(const string& table_name,
  339.                      const string& column_name, 
  340.                      const string& search_conditions)
  341.         : m_TableName(table_name),
  342.           m_ColumnName(column_name), 
  343.           m_SearchConditions(search_conditions)
  344.     {}
  345.     virtual int DescriptorType() const;
  346.     const string& TableName()        const { return m_TableName;        }
  347.     const string& ColumnName()       const { return m_ColumnName;       }
  348.     const string& SearchConditions() const { return m_SearchConditions; }
  349.     virtual ~CDB_ITDescriptor();
  350. protected:
  351.     string m_TableName;
  352.     string m_ColumnName;
  353.     string m_SearchConditions;
  354. };
  355. class NCBI_DBAPIDRIVER_EXPORT CDB_ResultProcessor
  356. {
  357. public:
  358.     CDB_ResultProcessor(CDB_Connection* c);
  359.     virtual ~CDB_ResultProcessor();
  360.     // The default implementation just dumps all rows.
  361.     // To get the data you will need to override this method.
  362.     virtual void ProcessResult(CDB_Result& res);
  363. private:
  364.     // Prohibit default- and copy- constructors, and assignment
  365.     CDB_ResultProcessor();
  366.     CDB_ResultProcessor& operator= (const CDB_ResultProcessor&);
  367.     CDB_ResultProcessor(const CDB_ResultProcessor&);
  368.     CDB_ResultProcessor* m_Prev;
  369.     CDB_Connection*      m_Con;
  370. };
  371. END_NCBI_SCOPE
  372. /* @} */
  373. /*
  374.  * ===========================================================================
  375.  * $Log: public.hpp,v $
  376.  * Revision 1000.0  2003/10/29 20:19:08  gouriano
  377.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.9
  378.  *
  379.  * Revision 1.9  2003/06/20 19:11:23  vakatov
  380.  * CDB_ResultProcessor::
  381.  *  - added MS-Win DLL export macro
  382.  *  - made the destructor virtual
  383.  *  - moved code from the header to the source file
  384.  *  - formally reformatted the code
  385.  *
  386.  * Revision 1.8  2003/06/05 15:54:43  soussov
  387.  * adds DumpResults method for LangCmd and RPC, SetResultProcessor method
  388.  * for Connection interface, adds CDB_ResultProcessor class
  389.  *
  390.  * Revision 1.7  2003/04/11 17:46:09  siyan
  391.  * Added doxygen support
  392.  *
  393.  * Revision 1.6  2002/12/26 19:29:12  dicuccio
  394.  * Added Win32 export specifier for base DBAPI library
  395.  *
  396.  * Revision 1.5  2002/03/26 15:25:17  soussov
  397.  * new image/text operations added
  398.  *
  399.  * Revision 1.4  2002/02/13 22:11:16  sapojnik
  400.  * several methods changed from private to protected to allow derived
  401.  * classes (needed for rdblib)
  402.  *
  403.  * Revision 1.3  2001/11/06 17:58:03  lavr
  404.  * Formatted uniformly as the rest of the library
  405.  *
  406.  * Revision 1.2  2001/09/27 20:08:29  vakatov
  407.  * Added "DB_" (or "I_") prefix where it was missing
  408.  *
  409.  * Revision 1.1  2001/09/21 23:39:52  vakatov
  410.  * -----  Initial (draft) revision.  -----
  411.  * This is a major revamp (by Denis Vakatov, with help from Vladimir Soussov)
  412.  * of the DBAPI "driver" libs originally written by Vladimir Soussov.
  413.  * The revamp involved massive code shuffling and grooming, numerous local
  414.  * API redesigns, adding comments and incorporating DBAPI to the C++ Toolkit.
  415.  *
  416.  * ===========================================================================
  417.  */
  418. #endif  /* DBAPI_DRIVER___PUBLIC__HPP */