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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: variant.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:18:55  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.29
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: variant.cpp,v 1000.4 2004/06/01 19:18:55 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE                          
  13. *               National Center for Biotechnology Information
  14. *                                                                          
  15. *  This software/database is a "United States Government Work" under the   
  16. *  terms of the United States Copyright Act.  It was written as part of    
  17. *  the author's official duties as a United States Government employee and 
  18. *  thus cannot be copyrighted.  This software/database is freely available 
  19. *  to the public for use. The National Library of Medicine and the U.S.    
  20. *  Government have not placed any restriction on its use or reproduction.  
  21. *                                                                          
  22. *  Although all reasonable efforts have been taken to ensure the accuracy  
  23. *  and reliability of the software and data, the NLM and the U.S.          
  24. *  Government do not and cannot warrant the performance or results that    
  25. *  may be obtained by using this software or data. The NLM and the U.S.    
  26. *  Government disclaim all warranties, express or implied, including       
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.                                                                
  29. *                                                                          
  30. *  Please cite the author in any work or product based on this material.   
  31. *
  32. * ===========================================================================
  33. *
  34. * File Name:  $Id: variant.cpp,v 1000.4 2004/06/01 19:18:55 gouriano Exp $
  35. *
  36. * Author:  Michael Kholodov
  37. *   
  38. * File Description:   CVariant class implementation
  39. *
  40. *
  41. * $Log: variant.cpp,v $
  42. * Revision 1000.4  2004/06/01 19:18:55  gouriano
  43. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.29
  44. *
  45. * Revision 1.29  2004/05/17 21:10:28  gorelenk
  46. * Added include of PCH ncbi_pch.hpp
  47. *
  48. * Revision 1.28  2004/04/08 15:56:58  kholodov
  49. * Multiple bug fixes and optimizations
  50. *
  51. * Revision 1.27  2004/02/10 18:50:44  kholodov
  52. * Modified: made Move() method const
  53. *
  54. * Revision 1.26  2003/12/10 22:34:14  kholodov
  55. * Added: MoveTo() method
  56. *
  57. * Revision 1.25  2003/12/10 21:08:48  kholodov
  58. * Fixed: size of the fixed size columns is now correct for NULL value
  59. *
  60. * Revision 1.24  2003/12/05 15:05:06  kholodov
  61. * Added: float->double implicit conversion
  62. *
  63. * Revision 1.23  2003/11/18 16:59:18  kholodov
  64. * Added: operator=(const char*)
  65. *
  66. * Revision 1.22  2003/08/15 19:48:43  kholodov
  67. * Fixed: const method GetBlobSize()
  68. *
  69. * Revision 1.21  2003/08/12 21:08:39  kholodov
  70. * Added: AsNotNullString() method
  71. *
  72. * Revision 1.20  2003/07/17 18:34:11  kholodov
  73. * Modified: operator=(CVariant& ) uses now CDB_Object::AssignValue() method
  74. *
  75. * Revision 1.19  2003/06/25 22:24:21  kholodov
  76. * Added: GetBlobSize() method
  77. *
  78. * Revision 1.18  2003/05/05 18:32:50  kholodov
  79. * Added: LONGCHAR and LONGBINARY support
  80. *
  81. * Revision 1.17  2003/01/10 14:23:33  kholodov
  82. * Modified: GetString() uses NStr::<...> type conversion
  83. *
  84. * Revision 1.16  2003/01/09 19:59:29  kholodov
  85. * Fixed: operator=(CVariant&) rewritten using copy ctor
  86. *
  87. * Revision 1.15  2002/10/31 22:37:05  kholodov
  88. * Added: DisableBind(), GetColumnNo(), GetTotalColumns() methods
  89. * Fixed: minor errors, diagnostic messages
  90. *
  91. * Revision 1.14  2002/10/21 20:38:08  kholodov
  92. * Added: GetParentConn() method to get the parent connection from IStatement,
  93. * ICallableStatement and ICursor objects.
  94. * Fixed: Minor fixes
  95. *
  96. * Revision 1.13  2002/10/11 16:42:50  kholodov
  97. * Added: return Binary and Varbinary columns as CVariant::GetString()
  98. *
  99. * Revision 1.12  2002/09/16 21:04:02  kholodov
  100. * Modified: CVariant::Assign<> template removed
  101. *
  102. * Revision 1.11  2002/09/16 20:22:44  kholodov
  103. * Fixed: return statement for the void function
  104. *
  105. * Revision 1.10  2002/09/16 19:30:58  kholodov
  106. * Added: Numeric datatype support
  107. * Added: CVariant::operator=() methods for working with bulk insert
  108. * Added: Methods for writing BLOBs during bulk insert
  109. *
  110. * Revision 1.9  2002/09/10 16:54:15  kholodov
  111. * Modified: using CDB_Object::operator=() for CVariant assignments
  112. *
  113. * Revision 1.8  2002/04/15 19:12:11  kholodov
  114. * Added simple type conversions
  115. *
  116. * Revision 1.7  2002/03/13 16:52:10  kholodov
  117. * Added: Full destructor definition in CVariantException with throw()
  118. * to conform with the parent's virtual destructor.
  119. * Modified: Moved CVariantException methods' definitions to variant.cpp file
  120. *
  121. * Revision 1.6  2002/02/15 23:24:42  vakatov
  122. * CVariant::CVariant() -- fixed a bug introduced during the cleanup
  123. *
  124. * Revision 1.5  2002/02/14 00:59:40  vakatov
  125. * Clean-up: warning elimination, fool-proofing, fine-tuning, identation, etc.
  126. *
  127. * Revision 1.4  2002/02/08 15:50:32  kholodov
  128. * Modified: integer types used are Int8, Int4, Int2, Uint1
  129. * Added: factories for CVariants of a particular type
  130. *
  131. * Revision 1.3  2002/02/06 22:50:48  kholodov
  132. * Conditionalized the usage of long long
  133. *
  134. * Revision 1.2  2002/02/06 22:21:00  kholodov
  135. * Added constructor from long long to BigInt type
  136. *
  137. * Revision 1.1  2002/01/30 14:51:22  kholodov
  138. * User DBAPI implementation, first commit
  139. *
  140. *
  141. *
  142. */ 
  143. #include <ncbi_pch.hpp>
  144. #include <dbapi/variant.hpp>
  145. #include <algorithm>
  146. //#include "basetmpl.hpp"
  147. //#include <corelib/ncbistr.hpp>
  148. BEGIN_NCBI_SCOPE
  149. CVariantException::CVariantException(const string& msg)
  150.     : m_msg(msg) 
  151. {
  152. }
  153.     
  154. CVariantException::~CVariantException() throw() 
  155. {
  156. }
  157. const char* CVariantException::what() const throw() 
  158. {
  159.     return m_msg.c_str();
  160. }
  161. //==================================================================
  162. CVariant CVariant::BigInt(Int8 *p)
  163. {
  164.     return CVariant(p ? new CDB_BigInt(*p) : new CDB_BigInt());
  165. }
  166. CVariant CVariant::Int(Int4 *p)
  167. {
  168.     return CVariant(p ? new CDB_Int(*p) : new CDB_Int());
  169. }
  170. CVariant CVariant::SmallInt(Int2 *p)
  171. {
  172.     return CVariant(p ? new CDB_SmallInt(*p) : new CDB_SmallInt());
  173. }
  174. CVariant CVariant::TinyInt(Uint1 *p)
  175. {
  176.     return CVariant(p ? new CDB_TinyInt(*p) : new CDB_TinyInt());
  177. }
  178. CVariant CVariant::Float(float *p)
  179. {
  180.     return CVariant(p ? new CDB_Float(*p) : new CDB_Float());
  181. }
  182. CVariant CVariant::Double(double *p)
  183. {
  184.     return CVariant(p ? new CDB_Double(*p) : new CDB_Double());
  185. }
  186. CVariant CVariant::Bit(bool *p)
  187. {
  188.     return CVariant(p ? new CDB_Bit(*p) : new CDB_Bit());
  189. }
  190. CVariant CVariant::LongChar(const char *p, size_t len)
  191. {
  192.     return CVariant(p ? new CDB_LongChar(len, p) : new CDB_LongChar(len));
  193. }
  194. CVariant CVariant::VarChar(const char *p, size_t len)
  195. {
  196.     return CVariant(p ? (len ? new CDB_VarChar(p, len) : new CDB_VarChar(p))
  197.                     : new CDB_VarChar());
  198. }
  199. CVariant CVariant::Char(size_t size, const char *p)
  200. {
  201.     return CVariant(p ? new CDB_Char(size, p) : new CDB_Char(size));
  202. }
  203. CVariant CVariant::LongBinary(size_t maxSize, const void *p, size_t len)
  204. {
  205.     return CVariant(p ? new CDB_LongBinary(maxSize, p, len) : new CDB_LongBinary(maxSize));
  206. }
  207. CVariant CVariant::VarBinary(const void *p, size_t len)
  208. {
  209.     return CVariant(p ? new CDB_VarBinary(p, len) : new CDB_VarBinary());
  210. }
  211. CVariant CVariant::Binary(size_t size, const void *p, size_t len)
  212. {
  213.     return CVariant(p ? new CDB_Binary(size, p, len) : new CDB_Binary(size));
  214. }
  215. CVariant CVariant::SmallDateTime(CTime *p)
  216. {
  217.     return CVariant(p ? new CDB_SmallDateTime(*p) : new CDB_SmallDateTime());
  218. }
  219. CVariant CVariant::DateTime(CTime *p)
  220. {
  221.     return CVariant(p ? new CDB_DateTime(*p) : new CDB_DateTime());
  222. }
  223. CVariant CVariant::Numeric(unsigned int precision,
  224.                            unsigned int scale,
  225.                            const char* p)
  226. {
  227.     return CVariant(p ? new CDB_Numeric(precision, scale, p) 
  228.                     : new CDB_Numeric());
  229. }
  230. CVariant::CVariant(EDB_Type type, size_t size)
  231.     : m_data(0)
  232. {
  233.     switch ( type ) {
  234.     case eDB_Int:
  235.         m_data = new CDB_Int();
  236.         return;  
  237.     case eDB_SmallInt:
  238.         m_data = new CDB_SmallInt();
  239.         return;  
  240.     case eDB_TinyInt:
  241.         m_data = new CDB_TinyInt();
  242.         return;  
  243.     case eDB_BigInt:
  244.         m_data = new CDB_BigInt();
  245.         return;  
  246.     case eDB_LongChar:
  247.         m_data = new CDB_LongChar(size);
  248.         return;  
  249.     case eDB_VarChar:
  250.         m_data = new CDB_VarChar();
  251.         return;  
  252.     case eDB_Char:
  253.         m_data = new CDB_Char(size);
  254.         return;  
  255.     case eDB_LongBinary:
  256.         m_data = new CDB_LongBinary(size);
  257.         return;  
  258.     case eDB_VarBinary:
  259.         m_data = new CDB_VarBinary();
  260.         return;  
  261.     case eDB_Binary:
  262.         m_data = new CDB_Binary(size);
  263.         return;  
  264.     case eDB_Float:
  265.         m_data = new CDB_Float();
  266.         return;  
  267.     case eDB_Double:
  268.         m_data = new CDB_Double();
  269.         return;  
  270.     case eDB_DateTime:
  271.         m_data = new CDB_DateTime();
  272.         return;
  273.     case eDB_SmallDateTime:
  274.         m_data = new CDB_SmallDateTime();
  275.         return;
  276.     case eDB_Text:
  277.         m_data = new CDB_Text();
  278.         return;
  279.     case eDB_Image:
  280.         m_data = new CDB_Image();
  281.         return;
  282.     case eDB_Bit:
  283.         m_data = new CDB_Bit();
  284.         return;
  285.     case eDB_Numeric:
  286.         m_data = new CDB_Numeric();
  287.         return;
  288.     case eDB_UnsupportedType:
  289.         break;
  290.     }
  291.     throw CVariantException("CVariant::ctor():  unsupported type");
  292. }
  293. CVariant::CVariant(CDB_Object* o) 
  294.     : m_data(o) 
  295. {
  296.     return;
  297. }
  298. CVariant::CVariant(Int8 v) 
  299.     : m_data(new CDB_BigInt(v)) {}
  300. CVariant::CVariant(Int4 v) 
  301.     : m_data(new CDB_Int(v)) {}
  302. //CVariant::CVariant(int v) 
  303. //: m_data(new CDB_Int(v)) {}
  304. CVariant::CVariant(Int2 v) 
  305.     : m_data(new CDB_SmallInt(v)) {}
  306. CVariant::CVariant(Uint1 v) 
  307.     : m_data(new CDB_TinyInt(v)) {}
  308. CVariant::CVariant(float v)
  309.     : m_data(new CDB_Float(v)) {}
  310. CVariant::CVariant(double v) 
  311.     : m_data(new CDB_Double(v)) {}
  312. CVariant::CVariant(bool v) 
  313.     : m_data(new CDB_Bit(v)) {}
  314. CVariant::CVariant(const string& v) 
  315.     : m_data(new CDB_VarChar(v)) {}
  316. CVariant::CVariant(const char* s) 
  317.     : m_data(new CDB_VarChar(s)) {}
  318. CVariant::CVariant(const CTime& v, EDateTimeFormat fmt)
  319.     : m_data(0)
  320. {
  321.     switch(fmt) {
  322.     case eShort:
  323.         m_data = new CDB_SmallDateTime(v);
  324.         break;
  325.     case eLong:
  326.         m_data = new CDB_DateTime(v);
  327.         break;
  328.     default:
  329.         throw CVariantException("CVariant::ctor(): unsupported datetime type");
  330.     }
  331. }
  332. CVariant::CVariant(const CVariant& v)
  333.     : m_data(0)
  334. {
  335.     if( v.GetData() != 0 ) {
  336.         m_data = v.GetData()->Clone();
  337.     }
  338. }
  339.       
  340. CVariant::~CVariant(void) 
  341. {
  342.     delete m_data;
  343. }
  344. CDB_Object* CVariant::GetNonNullData() const {
  345.     if( m_data == 0 )
  346.         throw CVariantException("CVariant::GetNonNullData(): null data");
  347.   
  348.     return m_data;
  349. }
  350. void CVariant::SetData(CDB_Object* o) {
  351.     delete m_data;
  352.     m_data = o;
  353. }
  354. string CVariant::GetString(void) const 
  355. {
  356.     if( IsNull() )
  357.         return "null";
  358.     switch( GetType() ) {
  359.     case eDB_Char:
  360.         return ((CDB_Char*)GetData())->Value();
  361.     case eDB_VarChar:
  362.         return ((CDB_VarChar*)GetData())->Value();
  363.     case eDB_LongChar:
  364.         return ((CDB_LongChar*)GetData())->Value();
  365.     case eDB_Binary:
  366.         {
  367.             CDB_Binary *b = (CDB_Binary*)GetData();
  368.             return string((char*)b->Value(), b->Size());
  369.         }
  370.     case eDB_LongBinary:
  371.         {
  372.             CDB_LongBinary *vb = (CDB_LongBinary*)GetData();
  373.             return string((char*)vb->Value(), vb->Size());
  374.         }
  375.     case eDB_VarBinary:
  376.         {
  377.             CDB_VarBinary *vb = (CDB_VarBinary*)GetData();
  378.             return string((char*)vb->Value(), vb->Size());
  379.         }
  380.     case eDB_TinyInt:
  381.         return NStr::IntToString((long)GetByte()); 
  382.     case eDB_SmallInt:      
  383.         return NStr::IntToString(GetInt2()); 
  384.     case eDB_Int:
  385.         return NStr::IntToString(GetInt4()); 
  386.     case eDB_BigInt:
  387.         return NStr::Int8ToString(GetInt8()); 
  388.     case eDB_Float:
  389.         return NStr::DoubleToString(GetFloat()); 
  390.     case eDB_Double:
  391.         return NStr::DoubleToString(GetDouble()); 
  392.     case eDB_Bit:
  393.         return NStr::BoolToString(GetBit()); 
  394.     case eDB_Numeric:
  395.         return ((CDB_Numeric*)GetData())->Value(); 
  396.     case eDB_DateTime:
  397.     case eDB_SmallDateTime:
  398.         return GetCTime().AsString();
  399.     default:
  400.         break;
  401.     }
  402.   
  403.     throw CVariantException("CVariant::GetString(): type not supported");
  404. }
  405. Int8 CVariant::GetInt8() const
  406. {
  407.     switch( GetType() ) {
  408.     case eDB_BigInt:
  409.         return ((CDB_BigInt*)GetData())->Value();
  410.     case eDB_Int:
  411.         return ((CDB_Int*)GetData())->Value();
  412.     case eDB_SmallInt:
  413.         return ((CDB_SmallInt*)GetData())->Value();
  414.     case eDB_TinyInt:
  415.         return ((CDB_TinyInt*)GetData())->Value();
  416.     default:
  417.         VerifyType(false);
  418.     }
  419.     return 0;
  420. }
  421. Int4 CVariant::GetInt4() const
  422. {
  423.     switch( GetType() ) {
  424.     case eDB_Int:
  425.         return ((CDB_Int*)GetData())->Value();
  426.     case eDB_SmallInt:
  427.         return ((CDB_SmallInt*)GetData())->Value();
  428.     case eDB_TinyInt:
  429.         return ((CDB_TinyInt*)GetData())->Value();
  430.     default:
  431.         VerifyType(false);
  432.     }
  433.     return 0;
  434. }
  435. Int2 CVariant::GetInt2() const
  436. {
  437.     switch( GetType() ) {
  438.     case eDB_SmallInt:
  439.         return ((CDB_SmallInt*)GetData())->Value();
  440.     case eDB_TinyInt:
  441.         return ((CDB_TinyInt*)GetData())->Value();
  442.     default:
  443.         VerifyType(false);
  444.     }
  445.     return 0;
  446. }
  447. Uint1 CVariant::GetByte() const
  448. {
  449.     switch( GetType() ) {
  450.     case eDB_TinyInt:
  451.         return ((CDB_TinyInt*)GetData())->Value();
  452.     default:
  453.         VerifyType(false);
  454.     }
  455.     return 0;
  456. }
  457. float CVariant::GetFloat() const
  458. {
  459.     switch( GetType() ) {
  460.     case eDB_Float:
  461.         return ((CDB_Float*)GetData())->Value();
  462.     case eDB_Int:
  463.         return ((CDB_Int*)GetData())->Value();
  464.     case eDB_SmallInt:
  465.         return ((CDB_SmallInt*)GetData())->Value();
  466.     case eDB_TinyInt:
  467.         return ((CDB_TinyInt*)GetData())->Value();
  468.     default:
  469.         VerifyType(false);
  470.     }
  471.     return 0;
  472. }
  473. double CVariant::GetDouble() const
  474. {
  475.     switch( GetType() ) {
  476.     case eDB_Float:
  477.         return ((CDB_Float*)GetData())->Value();
  478.     case eDB_Double:
  479.         return ((CDB_Double*)GetData())->Value();
  480.     case eDB_Int:
  481.         return ((CDB_Int*)GetData())->Value();
  482.     case eDB_SmallInt:
  483.         return ((CDB_SmallInt*)GetData())->Value();
  484.     case eDB_TinyInt:
  485.         return ((CDB_TinyInt*)GetData())->Value();
  486.     default:
  487.         VerifyType(false);
  488.     }
  489.     return 0;
  490. }
  491. bool CVariant::GetBit() const
  492. {
  493.     VerifyType( GetType() == eDB_Bit );
  494.     return ((CDB_Bit*)GetData())->Value() != 0;
  495. }
  496. string CVariant::GetNumeric() const
  497. {
  498.     VerifyType( GetType() == eDB_Numeric );
  499.     return ((CDB_Numeric*)GetData())->Value();
  500. }
  501. const CTime& CVariant::GetCTime() const
  502. {
  503.     switch(GetType()) {
  504.     case eDB_DateTime:
  505.         return ((CDB_DateTime*)GetData())->Value();
  506.     case eDB_SmallDateTime:
  507.         return ((CDB_SmallDateTime*)GetData())->Value();
  508.     default:
  509.         throw CVariantException("CVariant::GetCTime(): invalid type");
  510.     }
  511. }
  512. string CVariant::AsNotNullString(const string& v) const 
  513. {
  514.     if( IsNull() )
  515.         return v;
  516.     else
  517.         return GetString();
  518. }
  519. bool CVariant::IsNull() const
  520. {
  521.     return GetData() == 0 ? true : GetData()->IsNULL();
  522. }
  523. size_t CVariant::Read(void* buf, size_t len) const
  524. {
  525.     switch(GetType()) {
  526.     case eDB_Image:
  527.     case eDB_Text:
  528.         return ((CDB_Stream*)GetData())->Read(buf, len);
  529.     default:
  530.         throw CVariantException("CVariant::Read(): invalid type");
  531.     }
  532. }
  533. size_t CVariant::Append(const void* buf, size_t len)
  534. {
  535.     switch(GetType()) {
  536.     case eDB_Image:
  537.     case eDB_Text:
  538.         return ((CDB_Stream*)GetData())->Append(buf, len);
  539.     default:
  540.         throw CVariantException("CVariant::Append(): invalid type");
  541.     }
  542. }
  543. size_t CVariant::GetBlobSize() const
  544. {
  545.     switch(GetType()) {
  546.     case eDB_Image:
  547.     case eDB_Text:
  548.         return ((CDB_Stream*)GetData())->Size();
  549.     default:
  550.         throw CVariantException("CVariant::GetBlobSize(): invalid type");
  551.     }
  552. }
  553. void CVariant::Truncate(size_t len)
  554. {
  555.     switch(GetType()) {
  556.     case eDB_Image:
  557.         ((CDB_Image*)GetData())->Truncate(len);
  558.         break;
  559.     case eDB_Text:
  560.         ((CDB_Text*)GetData())->Truncate(len);
  561.         break;
  562.     default:
  563.         throw CVariantException("CVariant::Truncate(): invalid type");
  564.     }
  565.     return;
  566. }
  567. bool CVariant::MoveTo(size_t pos) const
  568. {
  569.     switch(GetType()) {
  570.     case eDB_Image:
  571.         return ((CDB_Image*)GetData())->MoveTo(pos);
  572.         break;
  573.     case eDB_Text:
  574.         return ((CDB_Text*)GetData())->MoveTo(pos);
  575.         break;
  576.     default:
  577.         throw CVariantException("CVariant::MoveTo(): invalid type");
  578.     }
  579.     return false;
  580. }
  581. CVariant& CVariant::operator=(const Int8& v)
  582. {
  583.     VerifyType(GetType() == eDB_BigInt);
  584.     *((CDB_BigInt*)GetData()) = v;
  585.     return *this;
  586. }
  587. CVariant& CVariant::operator=(const Int4& v)
  588. {
  589.     VerifyType(GetType() == eDB_Int);
  590.     *((CDB_Int*)GetData()) = v;
  591.     return *this;
  592. }
  593. CVariant& CVariant::operator=(const Int2& v)
  594. {
  595.     VerifyType(GetType() == eDB_SmallInt);
  596.     *((CDB_SmallInt*)GetData()) = v;
  597.     return *this;
  598. }
  599. CVariant& CVariant::operator=(const Uint1& v)
  600. {
  601.     VerifyType(GetType() == eDB_TinyInt);
  602.     *((CDB_TinyInt*)GetData()) = v;
  603.     return *this;
  604. }
  605. CVariant& CVariant::operator=(const float& v)
  606. {
  607.     VerifyType(GetType() == eDB_Float);
  608.     *((CDB_Float*)GetData()) = v;
  609.     return *this;
  610. }
  611. CVariant& CVariant::operator=(const double& v)
  612. {
  613.     VerifyType(GetType() == eDB_Double);
  614.     *((CDB_Double*)GetData()) = v;
  615.     return *this;
  616. }
  617. CVariant& CVariant::operator=(const string& v)
  618. {
  619.     switch( GetType()) {
  620.     case eDB_VarChar:
  621.         *((CDB_VarChar*)GetData()) = v;
  622.         break;
  623.     case eDB_LongChar:
  624.         *((CDB_LongChar*)GetData()) = v;
  625.         break;
  626.     case eDB_Char:
  627.         *((CDB_Char*)GetData()) = v;
  628.         break;
  629.     default:
  630.         VerifyType(false);
  631.     }
  632.     return *this;
  633. }
  634. CVariant& CVariant::operator=(const char* v)
  635. {
  636.     switch( GetType()) {
  637.     case eDB_VarChar:
  638.         *((CDB_VarChar*)GetData()) = v;
  639.         break;
  640.     case eDB_LongChar:
  641.         *((CDB_LongChar*)GetData()) = v;
  642.         break;
  643.     case eDB_Char:
  644.         *((CDB_Char*)GetData()) = v;
  645.         break;
  646.     default:
  647.         VerifyType(false);
  648.     }
  649.     return *this;
  650. }
  651. CVariant& CVariant::operator=(const bool& v)
  652. {
  653.     VerifyType(GetType() == eDB_Bit);
  654.     *((CDB_Bit*)GetData()) = v;
  655.     return *this;
  656. }
  657. CVariant& CVariant::operator=(const CTime& v)
  658. {
  659.     switch(GetType()) {
  660.     case eDB_DateTime:
  661.         *((CDB_DateTime*)GetData()) = v;
  662.         break;
  663.     case eDB_SmallDateTime:
  664.         *((CDB_SmallDateTime*)GetData()) = v;
  665.         break;
  666.     default:
  667.         VerifyType(false);
  668.     }
  669.     return *this;
  670. }
  671. CVariant& CVariant::operator=(const CVariant& v)
  672. {
  673.     this->m_data->AssignValue(*(v.m_data));
  674.     return *this;
  675. }
  676. bool CVariant::operator< (const CVariant& v) const 
  677. {
  678.     bool less = false;
  679.     if( IsNull() || v.IsNull() ) {
  680.         less = IsNull() && !v.IsNull();
  681.     }
  682.     else {
  683.         if( GetType() != v.GetType() ) {
  684.             throw CVariantException
  685.                 ("CVariant::operator<(): cannot compare different types");
  686.         }
  687.         switch( GetType() ) {
  688.         case eDB_Char:
  689.         case eDB_VarChar:
  690.         case eDB_LongChar:
  691.             less = GetString() < v.GetString();
  692.             break;
  693.         case eDB_TinyInt:
  694.             less = GetByte() < v.GetByte();
  695.             break;
  696.         case eDB_SmallInt:      
  697.             less = GetInt2() < v.GetInt2();
  698.             break;
  699.         case eDB_Int:
  700.             less = GetInt4() < v.GetInt4();
  701.             break;
  702.         case eDB_Float:
  703.             less = GetFloat() < v.GetFloat();
  704.             break;
  705.         case eDB_Double:
  706.             less = GetDouble() < v.GetDouble();
  707.             break;
  708.         case eDB_DateTime:
  709.         case eDB_SmallDateTime:
  710.             less = GetCTime() < v.GetCTime();
  711.             break;
  712.         default:
  713.             throw CVariantException
  714.                 ("CVariant::operator<(): type not supported");
  715.         }
  716.     }
  717.     return less;
  718. }
  719. END_NCBI_SCOPE