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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: variant.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/04/21 14:47:10  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.21
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI___VARIANT__HPP
  10. #define DBAPI___VARIANT__HPP
  11. /* $Id: variant.hpp,v 1000.3 2004/04/21 14:47:10 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:  CVariant class implementation
  39.  *
  40.  */
  41. #include <corelib/ncbiobj.hpp>
  42. #include <corelib/ncbitype.h>
  43. #include <corelib/ncbitime.hpp>
  44. #include <dbapi/driver/types.hpp>
  45. /** @addtogroup DbVariant
  46.  *
  47.  * @{
  48.  */
  49. BEGIN_NCBI_SCOPE
  50. /////////////////////////////////////////////////////////////////////////////
  51. //
  52. //  CVariantException::
  53. //
  54. //  
  55. class NCBI_DBAPI_EXPORT CVariantException : public std::exception 
  56. {
  57. public:
  58.     CVariantException(const string& msg);
  59.     
  60.     virtual ~CVariantException() throw();
  61.   
  62.     virtual const char* what() const throw();
  63. private:
  64.     const string m_msg;
  65. };
  66. /////////////////////////////////////////////////////////////////////////////
  67. //
  68. //  EDateTimeFormat::
  69. //
  70. //  DateTime format
  71. //
  72. enum EDateTimeFormat { 
  73.     eShort, 
  74.     eLong 
  75. };
  76. /////////////////////////////////////////////////////////////////////////////
  77. //
  78. //  CVariant::
  79. //
  80. //  CVariant data type
  81. //
  82. class NCBI_DBAPI_EXPORT CVariant
  83. {
  84. public:
  85.     // Contructors to create CVariant from various primitive types
  86.     explicit CVariant(Int8 v);
  87.     explicit CVariant(Int4 v);
  88.     explicit CVariant(Int2 v);
  89.     explicit CVariant(Uint1 v);
  90.     explicit CVariant(float v);
  91.     explicit CVariant(double v);
  92.     explicit CVariant(bool v);
  93.     explicit CVariant(const string& v);
  94.     explicit CVariant(const char* s);
  95.     // Factories for different types
  96.     // NOTE: pass p = 0 to make NULL value
  97.     static CVariant BigInt       (Int8 *p);
  98.     static CVariant Int          (Int4 *p);
  99.     static CVariant SmallInt     (Int2 *p);
  100.     static CVariant TinyInt      (Uint1 *p);
  101.     static CVariant Float        (float *p);
  102.     static CVariant Double       (double *p);
  103.     static CVariant Bit          (bool *p);
  104.     static CVariant LongChar     (const char *p, size_t len = 0);
  105.     static CVariant VarChar      (const char *p, size_t len = 0);
  106.     static CVariant Char         (size_t size, const char *p);
  107.     static CVariant LongBinary   (size_t maxSize, const void *p, size_t len);
  108.     static CVariant VarBinary    (const void *p, size_t len);
  109.     static CVariant Binary       (size_t size, const void *p, size_t len);
  110.     static CVariant SmallDateTime(CTime *p);
  111.     static CVariant DateTime     (CTime *p);
  112.     static CVariant Numeric      (unsigned int precision,
  113.                                   unsigned int scale,
  114.                                   const char* p);
  115.     // Make "placeholder" CVariant by type, containing NULL value
  116.     CVariant(EDB_Type type, size_t size = 0);
  117.     // Make DATETIME representation in long and short forms
  118.     CVariant(const class CTime& v, EDateTimeFormat fmt);
  119.     // Make CVariant from internal CDB_Object
  120.     explicit CVariant(CDB_Object* obj);
  121.     // Copy constructor
  122.     CVariant(const CVariant& v);
  123.     // Destructor
  124.     ~CVariant();
  125.     // Get methods
  126.     EDB_Type GetType() const;
  127.     Int8          GetInt8(void) const; 
  128.     string        GetString(void) const;
  129.     Int4          GetInt4(void) const;
  130.     Int2          GetInt2(void) const;
  131.     Uint1         GetByte(void) const;
  132.     float         GetFloat(void) const;
  133.     double        GetDouble(void) const;
  134.     bool          GetBit(void) const;
  135.     string        GetNumeric(void) const;
  136.     const CTime&  GetCTime(void) const;
  137.     // Get the argument, if the column is NULL
  138.     string AsNotNullString(const string& v) const;
  139.     // Status info
  140.     bool IsNull() const;
  141.     // operators
  142.     CVariant& operator=(const CVariant& v);
  143.     CVariant& operator=(const Int8& v);
  144.     CVariant& operator=(const Int4& v);
  145.     CVariant& operator=(const Int2& v);
  146.     CVariant& operator=(const Uint1& v);
  147.     CVariant& operator=(const float& v);
  148.     CVariant& operator=(const double& v);
  149.     CVariant& operator=(const string& v);
  150.     CVariant& operator=(const char* v);
  151.     CVariant& operator=(const bool& v);
  152.     CVariant& operator=(const CTime& v);
  153.     
  154.     bool operator<(const CVariant& v) const;
  155.     // Get pointer to the data buffer
  156.     // NOTE: internal use only!
  157.     CDB_Object* GetData() const;
  158.     // Get pointer to the data buffer, throws CVariantException if buffer is 0
  159.     // NOTE: internal use only!
  160.     CDB_Object* GetNonNullData() const;
  161.     // Methods to work with BLOB data (Text and Image)
  162.     size_t GetBlobSize() const;
  163.     size_t Read(void* buf, size_t len) const;
  164.     size_t Append(const void* buf, size_t len);
  165.     // Truncates from buffer end to buffer start. 
  166.     // Truncates everything if no argument
  167.     void Truncate(size_t len = kMax_UInt);
  168.     // Moves the internal position pointer
  169.     bool MoveTo(size_t pos) const;
  170. protected:
  171.     // Set methods
  172.     void SetData(CDB_Object* o);
  173. private:
  174.     void VerifyType(bool e) const;
  175.     class CDB_Object* m_data;
  176. };
  177. //================================================================
  178. inline
  179. CDB_Object* CVariant::GetData() const { 
  180.     return m_data; 
  181. }
  182. inline
  183. EDB_Type CVariant::GetType() const
  184. {
  185.     return m_data->GetType();
  186. }
  187. inline
  188. bool operator==(const CVariant& v1,
  189. const CVariant& v2) 
  190. {
  191.     return !(v1 < v2) && !(v2 < v1);
  192. }
  193. inline
  194. bool operator!=(const CVariant& v1,
  195. const CVariant& v2) 
  196. {
  197.     return v1 < v2 || v2 < v1;
  198. }
  199. inline
  200. void CVariant::VerifyType(bool e) const
  201. {
  202.     if( !e ) {
  203. #ifdef _DEBUG
  204.         _TRACE("CVariant::VerifyType(): Wrong type");
  205.         _ASSERT(0); 
  206. #else
  207.         throw CVariantException("CVariant::VerifyType(): Wrong type");
  208. #endif
  209.     }
  210. }
  211. END_NCBI_SCOPE
  212. /*
  213.  * ===========================================================================
  214.  * $Log: variant.hpp,v $
  215.  * Revision 1000.3  2004/04/21 14:47:10  gouriano
  216.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.21
  217.  *
  218.  * Revision 1.21  2004/04/08 15:57:21  kholodov
  219.  * Multiple bug fixes and optimizations
  220.  *
  221.  * Revision 1.20  2004/02/10 18:52:35  kholodov
  222.  * Modified: made Move() method const
  223.  *
  224.  * Revision 1.19  2003/12/15 20:05:41  ivanov
  225.  * Added export specifier for building DLLs in MS Windows.
  226.  *
  227.  * Revision 1.18  2003/12/10 22:34:04  kholodov
  228.  * Added: MoveTo() method
  229.  *
  230.  * Revision 1.17  2003/12/10 21:13:42  kholodov
  231.  * Added: size argument in CVariant(EDB_Type) constructor
  232.  *
  233.  * Revision 1.16  2003/11/18 16:58:52  kholodov
  234.  * Added: operator=(const char*)
  235.  *
  236.  * Revision 1.15  2003/08/15 19:48:26  kholodov
  237.  * Fixed: const method GetBlobSize()
  238.  *
  239.  * Revision 1.14  2003/08/12 21:11:22  kholodov
  240.  * Added: AsNotNullString() method
  241.  *
  242.  * Revision 1.13  2003/08/01 20:33:02  vakatov
  243.  * Explicitly qualify "exception" with "std::" to avoid a silly name conflict
  244.  * with <math.h> for SUN Forte6u2 compiler
  245.  *
  246.  * Revision 1.12  2003/06/25 22:24:46  kholodov
  247.  * Added: GetBlobSize() method
  248.  *
  249.  * Revision 1.11  2003/05/05 18:33:15  kholodov
  250.  * Added: LONGCHAR and LONGBINARY support
  251.  *
  252.  * Revision 1.10  2003/04/11 17:45:58  siyan
  253.  * Added doxygen support
  254.  *
  255.  * Revision 1.9  2002/09/16 21:04:03  kholodov
  256.  * Modified: CVariant::Assign<> template removed
  257.  *
  258.  * Revision 1.8  2002/09/16 19:31:08  kholodov
  259.  * Added: Numeric datatype support
  260.  * Added: CVariant::operator=() methods for working with bulk insert
  261.  * Added: Methods for writing BLOBs during bulk insert
  262.  *
  263.  * Revision 1.7  2002/05/16 21:59:55  kholodov
  264.  * Added: _TRACE() message to VerifyType()
  265.  *
  266.  * Revision 1.6  2002/04/15 19:12:57  kholodov
  267.  * Added VerifyType() method
  268.  *
  269.  * Revision 1.5  2002/03/13 16:52:21  kholodov
  270.  * Added: Full destructor definition in CVariantException with throw()
  271.  * to conform with the parent's virtual destructor.
  272.  * Modified: Moved CVariantException methods' definitions to variant.cpp file
  273.  *
  274.  * Revision 1.4  2002/02/08 15:50:38  kholodov
  275.  * Modified: integer types used are Int8, Int4, Int2, Uint1
  276.  * Added: factories for CVariants of a particular type
  277.  *
  278.  * Revision 1.3  2002/02/06 22:50:49  kholodov
  279.  * Conditionalized the usage of long long
  280.  *
  281.  * Revision 1.2  2002/02/06 22:21:00  kholodov
  282.  * Added constructor from long long to BigInt type
  283.  *
  284.  * Revision 1.1  2002/01/30 14:51:24  kholodov
  285.  * User DBAPI implementation, first commit
  286.  *
  287.  * ===========================================================================
  288.  */
  289. #endif // DBAPI___VARIANT__HPP