type_info1.hh
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:6k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #ifndef __type_info1_hh__
  2. #define __type_info1_hh__
  3. #include <mysql.h>
  4. #include <typeinfo>
  5. #include <map>
  6. using namespace std;
  7. class mysql_type_info;
  8. class mysql_ti_sql_type_info_lookup;
  9. class mysql_ti_sql_type_info {
  10.   friend mysql_type_info;
  11.   friend mysql_ti_sql_type_info_lookup;
  12. private:
  13.   const char          *_sql_name;
  14.   const type_info     *_c_type;
  15.   const unsigned char  _base_type;
  16.   const bool           _default;
  17.   
  18.   // VISUAL C++ fix: default and copy constructor may not be made private
  19.   // otherwise, linker errors will occur
  20.   
  21.   //mysql_ti_sql_type_info (const mysql_ti_sql_type_info &b);           // can't do
  22.   mysql_ti_sql_type_info& operator=(const mysql_ti_sql_type_info &b); //  "    "
  23.   //mysql_ti_sql_type_info () {} 
  24.   // OEP - didn't init _base_type and _default mysql_ti_sql_type_info () {} 
  25.   // all private, only mysql_type_info can
  26.   // create because there *must* be only one copy
  27.   // of each.
  28.   mysql_ti_sql_type_info (const char *s, const type_info &t, 
  29.   const unsigned char bt = 0,  const bool d = false )
  30.     : _sql_name(s), _c_type(&t), _base_type(bt), _default(d) {}
  31. };
  32. struct type_info_cmp {
  33.   bool operator() (const type_info *lhs, const type_info *rhs) const {
  34.     return lhs->before(*rhs);
  35.   }
  36. };
  37. class mysql_ti_sql_type_info_lookup {
  38.   friend mysql_type_info;
  39. private:
  40.   typedef mysql_ti_sql_type_info sql_type_info;
  41.   map<const type_info *, unsigned char, type_info_cmp> _map;
  42.   
  43.   mysql_ti_sql_type_info_lookup(const sql_type_info types[], const int size);
  44.   const unsigned char& operator [] (const type_info &ti) const {
  45.     return _map.find(&ti)->second;
  46.   }
  47. };
  48. //: Class that holds basic type information for ColData.
  49. class mysql_type_info {
  50. private:
  51.   typedef mysql_ti_sql_type_info sql_type_info;
  52.   typedef mysql_ti_sql_type_info_lookup sql_type_info_lookup;
  53. private:
  54.   static const sql_type_info types[62];
  55.   
  56.   static const unsigned char offset;
  57.   static const unsigned char unsigned_offset; 
  58.   static const unsigned char null_offset;
  59.   static const unsigned char unsigned_null_offset;
  60.   static const sql_type_info_lookup lookups;
  61.   
  62.   static unsigned char type(enum_field_types t,
  63.       bool _unsigned, bool _null = false);
  64. public:
  65.   static const unsigned char string_type;
  66. unsigned int _length;
  67. unsigned int _max_length;
  68. private:
  69.   unsigned char num;
  70.   inline const sql_type_info& deref() const;
  71. public:
  72.   //!dummy: static const unsigned char string_type;
  73.   //: The id of the string type.
  74.   mysql_type_info() {} //:
  75.   mysql_type_info(unsigned char n) : num(n) {} //:
  76.   inline mysql_type_info(enum_field_types t,
  77.  bool _unsigned, bool _null);
  78.   //:
  79.   inline mysql_type_info(const MYSQL_FIELD &f);
  80.   //:
  81.   mysql_type_info(const mysql_type_info &t) : num(t.num) {}
  82.   //:
  83.   mysql_type_info(const type_info &t) {num = lookups[t]; }
  84.   //: 
  85.   mysql_type_info& operator = (unsigned char n) {num=n; return *this;}
  86.   //:
  87.   mysql_type_info& operator = (const mysql_type_info &t) 
  88.     {num = t.num; return *this;}
  89.   //:
  90.   mysql_type_info& operator = (const type_info &t)
  91.     {num = lookups[t]; return *this;}
  92.   //:
  93.   inline const char*           name()      const;
  94.   //: Returns a implication defined name of the c++ type.
  95.   // Returns the name that would be returned by typeid().name() for the C++ type
  96.   // associated with the sql type.
  97.   inline const char*           sql_name()  const;
  98.   //: Returns the name for the sql type.
  99.   inline const type_info&      c_type()    const;
  100. inline const unsigned int length() const;
  101. inline const unsigned int max_length() const;
  102.   //: Returns the type_info for the C++ type associated with the sql type.
  103.   inline const mysql_type_info base_type() const;
  104.   //: Returns the type_info for the C++ type inside of the Null type.
  105.   // If the type is not null then this is the same as c_type() 
  106.          int                   id()        const {return num;}
  107.   //: Returns the id of the sql_type.
  108.   // Note: Do not ever use this id directly as it may change between versions.
  109.   bool quote_q()  const;
  110.   //: Returns true if the sql type is of a type that needs to be quoted.
  111.   bool escape_q() const;
  112.   //: Returns true if the sql type is of a type that needs to be escaped.
  113.   
  114.   bool before(mysql_type_info &b) { return num < b.num; }
  115.   //: Provides ordering
  116.   // You can also use id() for the same purpose.
  117. };
  118. inline const mysql_type_info::sql_type_info& mysql_type_info::deref() const {
  119.   return types[num];
  120. }
  121. inline const char*           mysql_type_info::name()      const {
  122.   return deref()._c_type->name();
  123. }
  124. inline const char*           mysql_type_info::sql_name()  const {
  125.   return deref()._sql_name;
  126. }
  127. inline const unsigned int    mysql_type_info::length()  const {
  128.   return _length;
  129. }
  130. inline const unsigned int    mysql_type_info::max_length()  const {
  131.   return _max_length;
  132. }
  133. inline const type_info&      mysql_type_info::c_type()    const {
  134.   return *deref()._c_type;
  135. }
  136. inline const mysql_type_info mysql_type_info::base_type() const 
  137. {
  138.   return mysql_type_info(deref()._base_type);
  139. }
  140. inline mysql_type_info::mysql_type_info(enum_field_types t,
  141. bool _unsigned, bool _null) {
  142.   num = type(t,_unsigned,_null);
  143. }
  144. inline mysql_type_info::mysql_type_info(const MYSQL_FIELD &f) {
  145.   num = type(f.type, (f.flags & UNSIGNED_FLAG), !(f.flags & NOT_NULL_FLAG));
  146. _length = f.length; _max_length = f.max_length;
  147. }
  148. inline bool operator == (const mysql_type_info& a, const mysql_type_info& b) {
  149.   return a.id() == b.id();
  150. }
  151. inline bool operator != (const mysql_type_info& a, const mysql_type_info& b) {
  152.   return a.id() != b.id();
  153. }
  154. inline bool operator == (const type_info &a, const mysql_type_info &b) {
  155.   return a == b.c_type();
  156. }
  157. inline bool operator != (const type_info &a, const mysql_type_info &b) {
  158.   return a != b.c_type();
  159. }
  160. inline bool operator == (const mysql_type_info &a, const type_info &b) {
  161.   return a.c_type() == b;
  162. }
  163. inline bool operator != (const mysql_type_info &a, const type_info &b) {
  164.   return a.c_type() != b;
  165. }
  166. #endif