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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: types.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:19:16  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_DRIVER___TYPES__HPP
  10. #define DBAPI_DRIVER___TYPES__HPP
  11. /* $Id: types.hpp,v 1000.0 2003/10/29 20:19:16 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:  DB types
  39.  *
  40.  */
  41. #include <corelib/ncbitime.hpp>
  42. #include <corelib/ncbi_limits.h>
  43. /** @addtogroup DbTypes
  44.  *
  45.  * @{
  46.  */
  47. BEGIN_NCBI_SCOPE
  48. // Set of supported types
  49. //
  50. enum EDB_Type {
  51.     eDB_Int,
  52.     eDB_SmallInt,
  53.     eDB_TinyInt,
  54.     eDB_BigInt,
  55.     eDB_VarChar,
  56.     eDB_Char,
  57.     eDB_VarBinary,
  58.     eDB_Binary,
  59.     eDB_Float,
  60.     eDB_Double,
  61.     eDB_DateTime,
  62.     eDB_SmallDateTime,
  63.     eDB_Text,
  64.     eDB_Image,
  65.     eDB_Bit,
  66.     eDB_Numeric,
  67.     eDB_UnsupportedType,
  68. eDB_LongChar,
  69. eDB_LongBinary
  70. };
  71. /////////////////////////////////////////////////////////////////////////////
  72. //
  73. //  CDB_Object::
  74. //
  75. // Base class for all "type objects" to support database NULL value
  76. // and provide the means to get the type and to clone the object.
  77. //
  78. class NCBI_DBAPIDRIVER_EXPORT CDB_Object
  79. {
  80. public:
  81.     CDB_Object(bool is_null = true) : m_Null(is_null)  { return; }
  82.     virtual ~CDB_Object();
  83.     bool IsNULL() const  { return m_Null; }
  84.     virtual void AssignNULL();
  85.     virtual EDB_Type    GetType() const = 0;
  86.     virtual CDB_Object* Clone()   const = 0;
  87.     virtual void AssignValue(CDB_Object& v)= 0;
  88.     // Create and return a new object (with internal value NULL) of type "type".
  89.     // NOTE:  "size" matters only for eDB_Char, eDB_Binary, eDB_LongChar, eDB_LongBinary.
  90.     static CDB_Object* Create(EDB_Type type, size_t size = 1);
  91. protected:
  92.     bool m_Null;
  93. };
  94. /////////////////////////////////////////////////////////////////////////////
  95. //
  96. //  CDB_Int::
  97. //  CDB_SmallInt::
  98. //  CDB_TinyInt::
  99. //  CDB_BigInt::
  100. //  CDB_VarChar::
  101. //  CDB_Char::
  102. //  CDB_VarBinary::
  103. //  CDB_Binary::
  104. //  CDB_Float::
  105. //  CDB_Double::
  106. //  CDB_Stream::
  107. //  CDB_Image::
  108. //  CDB_Text::
  109. //  CDB_SmallDateTime::
  110. //  CDB_DateTime::
  111. //  CDB_Bit::
  112. //  CDB_Numeric::
  113. //
  114. // Classes to represent objects of different types (derived from CDB_Object::)
  115. //
  116. class NCBI_DBAPIDRIVER_EXPORT CDB_Int : public CDB_Object
  117. {
  118. public:
  119.     CDB_Int()              : CDB_Object(true)             { return; }
  120.     CDB_Int(const Int4& i) : CDB_Object(false), m_Val(i)  { return; }
  121.     CDB_Int& operator= (const Int4& i) {
  122.         m_Null = false;
  123.         m_Val  = i;
  124.         return *this;
  125.     }
  126.     Int4  Value()   const  { return m_Null ? 0 : m_Val; }
  127.     void* BindVal() const  { return (void*) &m_Val; }
  128.     virtual EDB_Type    GetType() const;
  129.     virtual CDB_Object* Clone() const;
  130.     virtual void AssignValue(CDB_Object& v);
  131. protected:
  132.     Int4 m_Val;
  133. };
  134. class NCBI_DBAPIDRIVER_EXPORT CDB_SmallInt : public CDB_Object
  135. {
  136. public:
  137.     CDB_SmallInt()              : CDB_Object(true)             { return; }
  138.     CDB_SmallInt(const Int2& i) : CDB_Object(false), m_Val(i)  { return; }
  139.     CDB_SmallInt& operator= (const Int2& i) {
  140.         m_Null = false;
  141.         m_Val = i;
  142.         return *this;
  143.     }
  144.     Int2  Value()   const  { return m_Null ? 0 : m_Val; }
  145.     void* BindVal() const  { return (void*) &m_Val; }
  146.     virtual EDB_Type    GetType() const;
  147.     virtual CDB_Object* Clone() const;
  148.     virtual void AssignValue(CDB_Object& v);
  149. protected:
  150.     Int2 m_Val;
  151. };
  152. class NCBI_DBAPIDRIVER_EXPORT CDB_TinyInt : public CDB_Object
  153. {
  154. public:
  155.     CDB_TinyInt()               : CDB_Object(true)             { return; }
  156.     CDB_TinyInt(const Uint1& i) : CDB_Object(false), m_Val(i)  { return; }
  157.     CDB_TinyInt& operator= (const Uint1& i) {
  158.         m_Null = false;
  159.         m_Val = i;
  160.         return *this;
  161.     }
  162.     Uint1 Value()   const  { return m_Null ? 0 : m_Val; }
  163.     void* BindVal() const  { return (void*) &m_Val; }
  164.     virtual EDB_Type    GetType() const;
  165.     virtual CDB_Object* Clone()   const;
  166.     virtual void AssignValue(CDB_Object& v);
  167. protected:
  168.     Uint1 m_Val;
  169. };
  170. class NCBI_DBAPIDRIVER_EXPORT CDB_BigInt : public CDB_Object
  171. {
  172. public:
  173.     CDB_BigInt()              : CDB_Object(true)             { return; }
  174.     CDB_BigInt(const Int8& i) : CDB_Object(false), m_Val(i)  { return; }
  175.     CDB_BigInt& operator= (const Int8& i) {
  176.         m_Null = false;
  177.         m_Val = i;
  178.         return *this;
  179.     }
  180.     Int8 Value() const  { return m_Null ? 0 : m_Val; }
  181.     void* BindVal() const  { return (void*) &m_Val; }
  182.     virtual EDB_Type    GetType() const;
  183.     virtual CDB_Object* Clone()   const;
  184.     virtual void AssignValue(CDB_Object& v);
  185. protected:
  186.     Int8 m_Val;
  187. };
  188. class NCBI_DBAPIDRIVER_EXPORT CDB_VarChar : public CDB_Object
  189. {
  190. public:
  191.     // constructors
  192.     CDB_VarChar()                           : CDB_Object(true)  { return; }
  193.     CDB_VarChar(const string& s)            { SetValue(s); }
  194.     CDB_VarChar(const char*   s)            { SetValue(s); }
  195.     CDB_VarChar(const char*   s, size_t l)  { SetValue(s, l); }
  196.     // assignment operators
  197.     CDB_VarChar& operator= (const string& s)  { return SetValue(s); }
  198.     CDB_VarChar& operator= (const char*   s)  { return SetValue(s); }
  199.     // set-value methods
  200.     CDB_VarChar& SetValue(const string& s) {
  201.         m_Null = false;
  202.         m_Size = s.copy(m_Val, sizeof(m_Val) - 1);
  203.         m_Val[m_Size] = '';
  204.         return *this;
  205.     }
  206.     CDB_VarChar& SetValue(const char* s) {
  207.         if ( s ) {
  208.             for (m_Size = 0;  (m_Size < sizeof(m_Val) - 1)  &&  (*s != '');
  209.                  ++s) {
  210.                 m_Val[m_Size++] = *s;
  211.             }
  212.             m_Val[m_Size] = '';
  213.             m_Null = false;
  214.         }
  215.         else {
  216.             m_Null = true;
  217.         }
  218.         return *this;
  219.     }
  220.     CDB_VarChar& SetValue(const char* s, size_t l) {
  221.         if ( s ) {
  222.             m_Size = l < sizeof(m_Val) ? l : sizeof(m_Val) - 1;
  223.             if ( m_Size ) {
  224.                 memcpy(m_Val, s, m_Size);
  225.             }
  226.             m_Val[m_Size] = '';
  227.             m_Null = false;
  228.         }
  229.         else {
  230.             m_Null = true;
  231.         }
  232.         return *this;
  233.     }
  234.     //
  235.     const char* Value() const  { return m_Null ? 0 : m_Val;  }
  236.     size_t      Size()  const  { return m_Null ? 0 : m_Size; }
  237.     virtual EDB_Type    GetType() const;
  238.     virtual CDB_Object* Clone()   const;
  239.     virtual void AssignValue(CDB_Object& v);
  240. protected:
  241.     size_t m_Size;
  242.     char   m_Val[256];
  243. };
  244. class NCBI_DBAPIDRIVER_EXPORT CDB_Char : public CDB_Object
  245. {
  246. public:
  247.     enum { kMaxCharSize = 255 };
  248.     CDB_Char(size_t s = 1) : CDB_Object(true) {
  249.         m_Size = (s < 1) ? 1 : (s > kMaxCharSize ? kMaxCharSize : s);
  250.         m_Val  = new char[m_Size + 1];
  251.         memset(m_Val, ' ', m_Size);
  252.         m_Val[m_Size] = '';
  253.     }
  254.     CDB_Char(size_t s, const string& v) :  CDB_Object(false) {
  255.         m_Size = (s < 1) ? 1 : (s > kMaxCharSize ? kMaxCharSize : s);
  256.         m_Val = new char[m_Size + 1];
  257.         size_t l = v.copy(m_Val, m_Size);
  258.         if (l < m_Size) {
  259.             memset(m_Val + l, ' ', m_Size - l);
  260.         }
  261.         m_Val[m_Size] = '';
  262.     }
  263.     CDB_Char(size_t len, const char* str) :  CDB_Object(str == 0) {
  264.         m_Size = (len < 1) ? 1 : (len > kMaxCharSize ? kMaxCharSize : len);
  265.         m_Val = new char[m_Size + 1];
  266.         if ( str ) {
  267.             size_t l;
  268.             for (l = 0;  (l < m_Size)  &&  (*str != '');  ++str) {
  269.                 m_Val[l++] = *str;
  270.             }
  271.             if (l < m_Size) {
  272.                 memset(m_Val + l, ' ', m_Size - l);
  273.             }
  274.         } else {
  275.             memset(m_Val, ' ', m_Size);
  276.         }
  277.         m_Val[m_Size] = '';
  278.     }
  279.     CDB_Char(const CDB_Char& v) {
  280.         m_Null = v.m_Null;
  281.         m_Size = v.m_Size;
  282.         m_Val = new char[m_Size + 1];
  283.         memcpy(m_Val, v.m_Val, m_Size + 1);
  284.     }
  285.     CDB_Char& operator= (const CDB_Char& v) {
  286.         m_Null = v.m_Null;
  287.         size_t l = (m_Size > v.m_Size) ? v.m_Size : m_Size;
  288.         memmove(m_Val, v.m_Val, l);
  289.         if (l < m_Size)
  290.             memset(m_Val + l, ' ', m_Size - l);
  291.         return *this;
  292.     }
  293.     CDB_Char& operator= (const string& v) {
  294.         m_Null = false;
  295.         size_t l = v.copy(m_Val, m_Size);
  296.         if (l < m_Size)
  297.             memset(m_Val + l, ' ', m_Size - l);
  298.         return *this;
  299.     }
  300.     CDB_Char& operator= (const char* v) {
  301.         if (v == 0) {
  302.             m_Null = true;
  303.         }
  304.         else {
  305.             m_Null = false;
  306.             size_t l;
  307.             for (l = 0;  (l < m_Size)  &&  (*v != '');  ++v) {
  308.                 m_Val[l++] = *v;
  309.             }
  310.             if (l < m_Size)
  311.                 memset(m_Val + l, ' ', m_Size - l);
  312.         }
  313.         return *this;
  314.     }
  315.     void SetValue(const char* str, size_t len) {
  316.         if ( str ) {
  317.             if (len >= m_Size) {
  318.                 memcpy(m_Val, str, m_Size);
  319.             }
  320.             else {
  321.                 if ( len ) {
  322.                     memcpy(m_Val, str, len);
  323.                 }
  324.                 memset(m_Val + len, ' ', m_Size - len);
  325.             }
  326.             m_Null = false;
  327.         }
  328.         else {
  329.             m_Null = true;
  330.         }
  331.     }
  332.     const char* Value() const  { return m_Null ? 0 : m_Val; }
  333.     size_t      Size()  const  { return m_Size; }
  334.     virtual EDB_Type    GetType() const;
  335.     virtual CDB_Object* Clone()   const;
  336.     virtual void AssignValue(CDB_Object& v);
  337.     virtual ~CDB_Char();
  338. protected:
  339.     size_t m_Size;
  340.     char*  m_Val;
  341. };
  342. #define K8_1 8191
  343. class NCBI_DBAPIDRIVER_EXPORT CDB_LongChar : public CDB_Object
  344. {
  345. public:
  346.     CDB_LongChar(size_t s = K8_1) : CDB_Object(true) {
  347.         m_Size = (s < 1) ? 1 : s;
  348.         m_Val  = new char[m_Size + 1];
  349.     }
  350.     CDB_LongChar(size_t s, const string& v) :  CDB_Object(false) {
  351.         m_Size = (s < 1) ? K8_1 : s;
  352.         m_Val = new char[m_Size + 1];
  353.         size_t l = v.copy(m_Val, m_Size);
  354.         m_Val[l] = '';
  355.     }
  356.     CDB_LongChar(size_t len, const char* str) :  CDB_Object(str == 0) {
  357.         m_Size = (len < 1) ? K8_1 : len;
  358.         m_Val = new char[m_Size + 1];
  359. if(str) strncpy(m_Val, str, m_Size);
  360.         m_Val[m_Size] = '';
  361.     }
  362.     CDB_LongChar(const CDB_LongChar& v) {
  363.         m_Null = v.m_Null;
  364.         m_Size = v.m_Size;
  365.         m_Val = new char[m_Size + 1];
  366.         memcpy(m_Val, v.m_Val, m_Size + 1);
  367.     }
  368.     CDB_LongChar& operator= (const CDB_LongChar& v) {
  369.         m_Null = v.m_Null;
  370.         size_t l = (m_Size > v.m_Size) ? v.m_Size : m_Size;
  371.         memmove(m_Val, v.m_Val, l);
  372. m_Val[l]= '';
  373.         return *this;
  374.     }
  375.     CDB_LongChar& operator= (const string& v) {
  376.         m_Null = false;
  377.         size_t l = v.copy(m_Val, m_Size);
  378. m_Val[l]= '';
  379.         return *this;
  380.     }
  381.     CDB_LongChar& operator= (const char* v) {
  382.         if (v == 0) {
  383.             m_Null = true;
  384.         }
  385.         else {
  386.             m_Null = false;
  387.             size_t l;
  388.             for (l = 0;  (l < m_Size)  &&  (*v != '');  ++v) {
  389.                 m_Val[l++] = *v;
  390.             }
  391. m_Val[l]= '';
  392.         }
  393.         return *this;
  394.     }
  395.     void SetValue(const char* str, size_t len) {
  396.         if ( str ) {
  397.             if (len >= m_Size) {
  398.                 memcpy(m_Val, str, m_Size);
  399. m_Val[m_Size]= '';
  400.             }
  401.             else {
  402.                 if ( len ) {
  403.                     memcpy(m_Val, str, len);
  404.                 }
  405.                 m_Val[len]= '';
  406.             }
  407.             m_Null = false;
  408.         }
  409.         else {
  410.     m_Null = true;
  411.         }
  412.     }
  413.     const char* Value() const  { return m_Null ? 0 : m_Val; }
  414.     size_t      Size()  const  { return m_Size; }
  415.     size_t  DataSize()  const  { return m_Null? 0 : strlen(m_Val); }
  416.     virtual EDB_Type    GetType() const;
  417.     virtual CDB_Object* Clone()   const;
  418.     virtual void AssignValue(CDB_Object& v);
  419.     virtual ~CDB_LongChar();
  420. protected:
  421.     size_t m_Size;
  422.     char*  m_Val;
  423. };
  424. class NCBI_DBAPIDRIVER_EXPORT CDB_VarBinary : public CDB_Object
  425. {
  426. public:
  427.     CDB_VarBinary()                         : CDB_Object(true)  { return; }
  428.     CDB_VarBinary(const void* v, size_t l)  { SetValue(v, l); }
  429.     void SetValue(const void* v, size_t l) {
  430.         if (v  &&  l) {
  431.             m_Size = l > sizeof(m_Val) ? sizeof(m_Val) : l;
  432.             memcpy(m_Val, v, m_Size);
  433.             m_Null = false;
  434.         }
  435.         else {
  436.             m_Null = true;
  437.         }
  438.     }
  439.     //
  440.     const void* Value() const  { return m_Null ? 0 : (void*) m_Val; }
  441.     size_t      Size()  const  { return m_Null ? 0 : m_Size; }
  442.     virtual EDB_Type    GetType() const;
  443.     virtual CDB_Object* Clone()   const;
  444.     virtual void AssignValue(CDB_Object& v);
  445. protected:
  446.     size_t        m_Size;
  447.     unsigned char m_Val[255];
  448. };
  449. class NCBI_DBAPIDRIVER_EXPORT CDB_Binary : public CDB_Object
  450. {
  451. public:
  452.     enum { kMaxBinSize = 255 };
  453.     CDB_Binary(size_t s = 1) : CDB_Object(true) {
  454.         m_Size = (s < 1) ? 1 : (s > kMaxBinSize ? kMaxBinSize : s);
  455.         m_Val = new unsigned char[m_Size];
  456.         memset(m_Val, 0, m_Size);
  457.     }
  458.     CDB_Binary(size_t s, const void* v, size_t v_size) {
  459.         m_Size = (s == 0) ? 1 : (s > kMaxBinSize ? kMaxBinSize : s);
  460.         m_Val  = new unsigned char[m_Size];
  461.         SetValue(v, v_size);
  462.     }
  463.     CDB_Binary(const CDB_Binary& v) {
  464.         m_Null = v.m_Null;
  465.         m_Size = v.m_Size;
  466.         m_Val = new unsigned char[m_Size];
  467.         memcpy(m_Val, v.m_Val, m_Size);
  468.     }
  469.     void SetValue(const void* v, size_t v_size) {
  470.         if (v  &&  v_size) {
  471.             memcpy(m_Val, v, (v_size > m_Size) ? m_Size : v_size);
  472.             if (v_size < m_Size) {
  473.                 memset(m_Val + v_size, 0, m_Size - v_size);
  474.             }
  475.             m_Null = false;
  476.         } else {
  477.             m_Null = true;
  478.         }
  479.     }
  480.     CDB_Binary& operator= (const CDB_Binary& v) {
  481.         m_Null = v.m_Null;
  482.         size_t l = (m_Size > v.m_Size) ? v.m_Size : m_Size;
  483.         memmove(m_Val, v.m_Val, l);
  484.         if (l < m_Size) {
  485.             memset(m_Val+l, 0, m_Size - l);
  486.         }
  487.         return *this;
  488.     }
  489.     //
  490.     const void* Value() const  { return m_Null ? 0 : (void*) m_Val; }
  491.     size_t      Size()  const  { return m_Size; }
  492.     virtual EDB_Type    GetType() const;
  493.     virtual CDB_Object* Clone()   const;
  494.     virtual void AssignValue(CDB_Object& v);
  495.     virtual ~CDB_Binary();
  496. protected:
  497.     size_t         m_Size;
  498.     unsigned char* m_Val;
  499. };
  500. class NCBI_DBAPIDRIVER_EXPORT CDB_LongBinary : public CDB_Object
  501. {
  502. public:
  503.     CDB_LongBinary(size_t s = K8_1) : CDB_Object(true) {
  504.         m_Size = (s < 1) ? 1 : s;
  505.         m_Val = new unsigned char[m_Size];
  506. m_DataSize= 0;
  507.     }
  508.     CDB_LongBinary(size_t s, const void* v, size_t v_size) {
  509.         m_Size = (s == 0) ? K8_1 : s;
  510.         m_Val  = new unsigned char[m_Size];
  511.         SetValue(v, v_size);
  512.     }
  513.     CDB_LongBinary(const CDB_LongBinary& v) {
  514.         m_Null = v.m_Null;
  515.         m_Size = v.m_Size;
  516. m_DataSize= v.m_DataSize;
  517.         m_Val = new unsigned char[m_Size];
  518.         memcpy(m_Val, v.m_Val, m_DataSize);
  519.     }
  520.     void SetValue(const void* v, size_t v_size) {
  521.         if (v  &&  v_size) {
  522.     m_DataSize= (v_size > m_Size) ? m_Size : v_size;
  523.             memcpy(m_Val, v, m_DataSize);
  524.             m_Null = false;
  525.         } else {
  526.             m_Null = true;
  527. m_DataSize= 0;
  528.         }
  529.     }
  530.     CDB_LongBinary& operator= (const CDB_LongBinary& v) {
  531.         m_Null = v.m_Null;
  532.         m_DataSize = (m_Size > v.m_DataSize) ? v.m_DataSize : m_Size;
  533. if(m_DataSize) {
  534.     memmove(m_Val, v.m_Val, m_DataSize);
  535. }
  536.         return *this;
  537.     }
  538.     //
  539.     const void* Value() const  { return m_Null ? 0 : (void*) m_Val; }
  540.     size_t      Size()  const  { return m_Size; }
  541.     size_t  DataSize()  const  { return m_DataSize; }
  542.     virtual EDB_Type    GetType() const;
  543.     virtual CDB_Object* Clone()   const;
  544.     virtual void AssignValue(CDB_Object& v);
  545.     virtual ~CDB_LongBinary();
  546. protected:
  547.     size_t         m_Size;
  548.     size_t         m_DataSize;
  549.     unsigned char* m_Val;
  550. };
  551. class NCBI_DBAPIDRIVER_EXPORT CDB_Float : public CDB_Object
  552. {
  553. public:
  554.     CDB_Float()        : CDB_Object(true)             { return; }
  555.     CDB_Float(float i) : CDB_Object(false), m_Val(i)  { return; }
  556.     CDB_Float& operator= (const float& i) {
  557.         m_Null = false;
  558.         m_Val  = i;
  559.         return *this;
  560.     }
  561.     float Value()   const { return m_Null ? 0 : m_Val; }
  562.     void* BindVal() const { return (void*) &m_Val; }
  563.     virtual EDB_Type    GetType() const;
  564.     virtual CDB_Object* Clone()   const;
  565.     virtual void AssignValue(CDB_Object& v);
  566. protected:
  567.     float m_Val;
  568. };
  569. class NCBI_DBAPIDRIVER_EXPORT CDB_Double : public CDB_Object
  570. {
  571. public:
  572.     CDB_Double()         : CDB_Object(true)             { return; }
  573.     CDB_Double(double i) : CDB_Object(false), m_Val(i)  { return; }
  574.     CDB_Double& operator= (const double& i) {
  575.         m_Null = false;
  576.         m_Val  = i;
  577.         return *this;
  578.     }
  579.     //
  580.     double Value()   const  { return m_Null ? 0 : m_Val; }
  581.     void*  BindVal() const  { return (void*) &m_Val; }
  582.     virtual EDB_Type    GetType() const;
  583.     virtual CDB_Object* Clone()   const;
  584.     virtual void AssignValue(CDB_Object& v);
  585. protected:
  586.     double m_Val;
  587. };
  588. class CMemStore;
  589. class NCBI_DBAPIDRIVER_EXPORT CDB_Stream : public CDB_Object
  590. {
  591. public:
  592.     // assignment
  593.     virtual void AssignNULL();
  594.     CDB_Stream&  Assign(const CDB_Stream& v);
  595.     // data manipulations
  596.     virtual size_t Read     (void* buff, size_t nof_bytes);
  597.     virtual size_t Append   (const void* buff, size_t nof_bytes);
  598.     virtual void   Truncate (size_t nof_bytes = kMax_Int);
  599.     virtual bool   MoveTo   (size_t byte_number);
  600.     // current size of data
  601.     virtual size_t Size() const;
  602.     virtual void AssignValue(CDB_Object& v);
  603. protected:
  604.     // 'ctors
  605.     CDB_Stream();
  606.     virtual ~CDB_Stream();
  607. private:
  608.     // data storage
  609.     CMemStore* m_Store;
  610. };
  611. class NCBI_DBAPIDRIVER_EXPORT CDB_Image : public CDB_Stream
  612. {
  613. public:
  614.     CDB_Image& operator= (const CDB_Image& image);
  615.     virtual EDB_Type    GetType() const;
  616.     virtual CDB_Object* Clone()   const;
  617. };
  618. class NCBI_DBAPIDRIVER_EXPORT CDB_Text : public CDB_Stream
  619. {
  620. public:
  621.     virtual size_t Append(const void* buff, size_t nof_bytes = 0/*strlen*/);
  622.     virtual size_t Append(const string& s);
  623.     CDB_Text& operator= (const CDB_Text& text);
  624.     virtual EDB_Type    GetType() const;
  625.     virtual CDB_Object* Clone()   const;
  626. };
  627. class NCBI_DBAPIDRIVER_EXPORT CDB_SmallDateTime : public CDB_Object
  628. {
  629. public:
  630.     CDB_SmallDateTime(CTime::EInitMode mode= CTime::eEmpty)
  631.   : m_NCBITime(mode) {
  632.         m_Status = 0x1;
  633.     }
  634.     CDB_SmallDateTime(const CTime& t) {
  635.         m_NCBITime = t;
  636.         m_Status   = 0x1;
  637.         m_Null     = false;
  638.     }
  639.     CDB_SmallDateTime(Uint2 days, Uint2 minutes) {
  640.         m_DBTime.days = days;
  641.         m_DBTime.time = minutes;
  642.         m_Status      = 0x2;
  643.         m_Null        = false;
  644.     }
  645.     CDB_SmallDateTime& Assign(Uint2 days, Uint2 minutes) {
  646.         m_DBTime.days = days;
  647.         m_DBTime.time = minutes;
  648.         m_Status      = 0x2;
  649.         m_Null        = false;
  650.         return *this;
  651.     }
  652.     CDB_SmallDateTime& operator= (const CTime& t) {
  653.         m_NCBITime = t;
  654.         m_Status = 0x1;
  655.         m_Null= false;
  656.         return *this;
  657.     }
  658.     const CTime& Value() const {
  659.         if((m_Status & 0x1) == 0) {
  660.             m_NCBITime.SetTimeDBU(m_DBTime);
  661.             m_Status |= 0x1;
  662.         }
  663.         return m_NCBITime;
  664.     }
  665.     Uint2 GetDays() const {
  666.         if((m_Status & 0x2) == 0) {
  667.             m_DBTime = m_NCBITime.GetTimeDBU();
  668.             m_Status |= 0x2;
  669.         }
  670.         return m_DBTime.days;
  671.     }
  672.     Uint2 GetMinutes() const {
  673.         if((m_Status & 0x2) == 0) {
  674.             m_DBTime = m_NCBITime.GetTimeDBU();
  675.             m_Status |= 0x2;
  676.         }
  677.         return m_DBTime.time;
  678.     }
  679.     virtual EDB_Type    GetType() const;
  680.     virtual CDB_Object* Clone()   const;
  681.     virtual void AssignValue(CDB_Object& v);
  682. protected:
  683.     mutable CTime        m_NCBITime;
  684.     mutable TDBTimeU     m_DBTime;
  685.     // which of m_NCBITime(0x1), m_DBTime(0x2) is valid;  they both can be valid
  686.     mutable unsigned int m_Status;
  687. };
  688. class NCBI_DBAPIDRIVER_EXPORT CDB_DateTime : public CDB_Object
  689. {
  690. public:
  691.     CDB_DateTime(CTime::EInitMode mode= CTime::eEmpty)
  692.   : m_NCBITime(mode) {
  693.         m_Status = 0x1;
  694.     }
  695.     CDB_DateTime(const CTime& t) {
  696.         m_NCBITime = t;
  697.         m_Status = 0x1;
  698.         m_Null= false;
  699.     }
  700.     CDB_DateTime(Int4 d, Int4 s300) {
  701.         m_DBTime.days = d;
  702.         m_DBTime.time = s300;
  703.         m_Status = 0x2;
  704.         m_Null= false;
  705.     }
  706.     CDB_DateTime& operator= (const CTime& t) {
  707.         m_NCBITime = t;
  708.         m_Status = 0x1;
  709.         m_Null= false;
  710.         return *this;
  711.     }
  712.     CDB_DateTime& Assign(Int4 d, Int4 s300) {
  713.         m_DBTime.days = d;
  714.         m_DBTime.time = s300;
  715.         m_Status = 0x2;
  716.         m_Null = false;
  717.         return *this;
  718.     }
  719.     const CTime& Value() const {
  720.         if((m_Status & 0x1) == 0) {
  721.             m_NCBITime.SetTimeDBI(m_DBTime);
  722.             m_Status |= 0x1;
  723.         }
  724.         return m_NCBITime;
  725.     }
  726.     Int4 GetDays() const {
  727.         if((m_Status & 0x2) == 0) {
  728.             m_DBTime = m_NCBITime.GetTimeDBI();
  729.             m_Status |= 0x2;
  730.         }
  731.         return m_DBTime.days;
  732.     }
  733.     Int4 Get300Secs() const {
  734.         if((m_Status & 0x2) == 0) {
  735.             m_DBTime = m_NCBITime.GetTimeDBI();
  736.             m_Status |= 0x2;
  737.         }
  738.         return m_DBTime.time;
  739.     }
  740.     virtual EDB_Type    GetType() const;
  741.     virtual CDB_Object* Clone()   const;
  742.     virtual void AssignValue(CDB_Object& v);
  743. protected:
  744.     mutable CTime        m_NCBITime;
  745.     mutable TDBTimeI     m_DBTime;
  746.     // which of m_NCBITime(0x1), m_DBTime(0x2) is valid;  they both can be valid
  747.     mutable unsigned int m_Status;
  748. };
  749. class NCBI_DBAPIDRIVER_EXPORT CDB_Bit : public CDB_Object
  750. {
  751. public:
  752.     CDB_Bit()       : CDB_Object(true)   { return; }
  753.     CDB_Bit(int  i) : CDB_Object(false)  { m_Val = i ? 1 : 0; }
  754.     CDB_Bit(bool i) : CDB_Object(false)  { m_Val = i ? 1 : 0; }
  755.     CDB_Bit& operator= (const int& i) {
  756.         m_Null = false;
  757.         m_Val = i ? 1 : 0;
  758.         return *this;
  759.     }
  760.     CDB_Bit& operator= (const bool& i) {
  761.         m_Null = false;
  762.         m_Val = i ? 1 : 0;
  763.         return *this;
  764.     }
  765.     int   Value()   const  { return m_Null ? 0 : (int) m_Val; }
  766.     void* BindVal() const  { return (void*) &m_Val; }
  767.     virtual EDB_Type    GetType() const;
  768.     virtual CDB_Object* Clone()   const;
  769.     virtual void AssignValue(CDB_Object& v);
  770. protected:
  771.     Uint1 m_Val;
  772. };
  773. class NCBI_DBAPIDRIVER_EXPORT CDB_Numeric : public CDB_Object
  774. {
  775. public:
  776.     CDB_Numeric() : CDB_Object(true)  { m_Precision= m_Scale= 0; return; }
  777.     CDB_Numeric(unsigned int precision, unsigned int scale)
  778.         : CDB_Object(false) {
  779.         m_Precision = precision;
  780.         m_Scale     = scale;
  781.         memset(m_Body, 0, sizeof(m_Body));
  782.     }
  783.     CDB_Numeric(unsigned int precision, unsigned int scale,
  784.                 const unsigned char* arr)
  785.         : CDB_Object(false) {
  786.         m_Precision = precision;
  787.         m_Scale     = scale;
  788.         memcpy(m_Body, arr, sizeof(m_Body));
  789.     }
  790.     CDB_Numeric(unsigned int precision, unsigned int scale, bool is_negative,
  791.                 const unsigned char* arr)
  792.         : CDB_Object(false) {
  793.         m_Precision = precision;
  794.         m_Scale     = scale;
  795.         m_Body[0]= is_negative? 1 : 0;
  796.         memcpy(m_Body+1, arr, sizeof(m_Body)-1);
  797.     }
  798.     CDB_Numeric(unsigned int precision, unsigned int scale, const char* val) {
  799.         x_MakeFromString(precision, scale, val);
  800.     }
  801.     CDB_Numeric(unsigned int precision, unsigned int scale, const string& val) {
  802.         x_MakeFromString(precision, scale, val.c_str());
  803.     }
  804.     CDB_Numeric& Assign(unsigned int precision, unsigned int scale,
  805.                         const unsigned char* arr) {
  806.         m_Precision = precision;
  807.         m_Scale     = scale;
  808.         m_Null      = false;
  809.         memcpy(m_Body, arr, sizeof(m_Body));
  810.         return *this;
  811.     }
  812.     CDB_Numeric& Assign(unsigned int precision, unsigned int scale,
  813.                         bool is_negative, const unsigned char* arr) {
  814.         m_Precision = precision;
  815.         m_Scale     = scale;
  816.         m_Null      = false;
  817.         m_Body[0]= is_negative? 1 : 0;
  818.         memcpy(m_Body + 1, arr, sizeof(m_Body) - 1);
  819.         return *this;
  820.     }
  821.     CDB_Numeric& operator= (const char* val) {
  822.         x_MakeFromString(m_Precision, m_Scale, val);
  823.         return *this;
  824.     }
  825.     CDB_Numeric& operator= (const string& val) {
  826.         x_MakeFromString(m_Precision, m_Scale, val.c_str());
  827.         return *this;
  828.     }
  829.     string Value() const;
  830.     Uint1 Precision() const {
  831.         return m_Precision;
  832.     }
  833.     Uint1 Scale() const {
  834.         return m_Scale;
  835.     }
  836.     virtual EDB_Type    GetType() const;
  837.     virtual CDB_Object* Clone()   const;
  838.     virtual void AssignValue(CDB_Object& v);
  839. protected:
  840.     void x_MakeFromString(unsigned int precision,
  841.                           unsigned int scale,
  842.                           const char*  val);
  843.     Uint1         m_Precision;
  844.     Uint1         m_Scale;
  845.     unsigned char m_Body[34];
  846. };
  847. END_NCBI_SCOPE
  848. #endif  /* DBAPI_DRIVER___TYPES__HPP */
  849. /* @} */
  850. /*
  851.  * ===========================================================================
  852.  * $Log: types.hpp,v $
  853.  * Revision 1000.0  2003/10/29 20:19:16  gouriano
  854.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.17
  855.  *
  856.  * Revision 1.17  2003/05/13 16:54:40  sapojnik
  857.  * CDB_Object::Create() - support for LongChar, LongBinary
  858.  *
  859.  * Revision 1.16  2003/05/05 15:56:15  soussov
  860.  * new default size 8K-1 for CDB_LongChar, CDB_LongBinary
  861.  *
  862.  * Revision 1.15  2003/04/29 21:12:29  soussov
  863.  * new datatypes CDB_LongChar and CDB_LongBinary added
  864.  *
  865.  * Revision 1.14  2003/04/11 17:46:11  siyan
  866.  * Added doxygen support
  867.  *
  868.  * Revision 1.13  2003/01/30 16:06:04  soussov
  869.  * Changes the default from eCurrent to eEmpty for DateTime types
  870.  *
  871.  * Revision 1.12  2002/12/26 19:29:12  dicuccio
  872.  * Added Win32 export specifier for base DBAPI library
  873.  *
  874.  * Revision 1.11  2002/10/07 13:08:32  kans
  875.  * repaired inconsistent newlines caught by Mac compiler
  876.  *
  877.  * Revision 1.10  2002/09/13 18:28:05  soussov
  878.  * fixed bug with long overflow
  879.  *
  880.  * Revision 1.9  2002/05/16 21:27:01  soussov
  881.  * AssignValue methods added
  882.  *
  883.  * Revision 1.8  2002/02/14 00:59:38  vakatov
  884.  * Clean-up: warning elimination, fool-proofing, fine-tuning, identation, etc.
  885.  *
  886.  * Revision 1.7  2002/02/13 22:37:27  sapojnik
  887.  * new_CDB_Object() renamed to CDB_Object::create()
  888.  *
  889.  * Revision 1.6  2002/02/13 22:14:50  sapojnik
  890.  * new_CDB_Object() (needed for rdblib)
  891.  *
  892.  * Revision 1.5  2002/02/06 22:21:58  soussov
  893.  * fixes the numeric default constructor
  894.  *
  895.  * Revision 1.4  2001/12/28 21:22:39  sapojnik
  896.  * Made compatible with MS compiler: long long to Int8, static const within class def to enum
  897.  *
  898.  * Revision 1.3  2001/12/14 17:58:26  soussov
  899.  * fixes bug in datetime related constructors
  900.  *
  901.  * Revision 1.2  2001/11/06 17:58:03  lavr
  902.  * Formatted uniformly as the rest of the library
  903.  *
  904.  * Revision 1.1  2001/09/21 23:39:52  vakatov
  905.  * -----  Initial (draft) revision.  -----
  906.  * This is a major revamp (by Denis Vakatov, with help from Vladimir Soussov)
  907.  * of the DBAPI "driver" libs originally written by Vladimir Soussov.
  908.  * The revamp involved massive code shuffling and grooming, numerous local
  909.  * API redesigns, adding comments and incorporating DBAPI to the C++ Toolkit.
  910.  *
  911.  * ===========================================================================
  912.  */