coldata1.hh
上传用户:clovervx
上传日期:2010-03-30
资源大小:787k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #ifndef __coldata1_hh__
  2. #define __coldata1_hh__
  3. #include <typeinfo>
  4. #include <string>
  5. using namespace std ;
  6. #include "defs.h"
  7. #include "type_info1.hh"
  8. #include "const_string1.hh"
  9. #include "null1.hh"
  10. // prevention of VC++ INTERNAL COMPILER ERROR
  11. #include "convert3.hh"
  12. #include "string_util.hh"
  13. //!  with_class = mysql_ColData
  14. //: Exception structure thrown when a bad conversion takes place
  15. struct BadConversion {
  16.   const char*  type_name;  //:
  17.   const string data;       //:
  18.   size_t       retrieved;  //:
  19.   size_t       actual_size;//:
  20.   BadConversion(const char* tn, const char* d, size_t r, size_t a) : type_name(tn), data(d), retrieved(r), actual_size(a) {};
  21. };
  22. //: Base class for auto-converting column data.  Do not use directly.
  23. //
  24. // A smart string. It will automatically convert it self to any of the
  25. // basic C types.
  26. //
  27. // When used with binary operators it will
  28. // automatically convert it self to the type used on the other side of
  29. // the operator if it is a basic type.
  30. //
  31. // However, be careful when using it with binary operators as.
  32. //
  33. // MysqlStr("12.86") + 2
  34. //
  35. // will return 14 because 2 is an integer. What you wanted to say was
  36. //
  37. // MysqlStr("12.86") + 2.0
  38. //
  39. // If this type of thing scares you define the micro NO_BINARY_OPERS
  40. // to turn of this behavior.
  41. //
  42. // This class also has some basic information about the type of data
  43. // stored in it.
  44. //
  45. // <bf>Do not use this class directly.</bf>
  46. //  Use the typedef ColData or MutableColData instead.
  47. template <class Str>
  48. class mysql_ColData : public Str {
  49. private:
  50.   mysql_type_info _type;
  51. string buf;
  52. bool _null;
  53. public:
  54.   mysql_ColData (bool n, mysql_type_info t = mysql_type_info::string_type)
  55.     : _type(t), _null(n) {}
  56.   mysql_ColData (const char *str,
  57.  mysql_type_info t = mysql_type_info::string_type, bool n = false)
  58.     : Str(str), _type(t), _null(n) {buf=(string)str;}
  59.   mysql_ColData () {}
  60.   mysql_type_info type() {return _type;}
  61.   //: Returns the current mysql type of current item
  62.   bool quote_q() const {return _type.quote_q();}
  63.   //: Returns true or false depending on if the data is of a type that
  64.   //: should be quoted
  65.   bool escape_q() const {return _type.escape_q();}
  66.   //: Returns true of false depending on if the data is of a type that
  67.   //: should be escaped
  68.   
  69.   //template<class Type> Type conv (Type dummy) const;
  70.   // FIX: function conv implemented here VC++ INTERNAL COMPILER ERROR
  71.   template<class Type> Type conv (Type dummy) const {
  72.    string strbuf(buf);
  73.    strip_all_blanks(strbuf);
  74.     size_t len = strbuf.size();
  75.     const char *str = strbuf.c_str();
  76.     const char *end = str;
  77.     Type num = mysql_convert<Type>(str, end);
  78.     if (*end == '.') {
  79.       end++;
  80.       for (;*end == '0'; end++);
  81.     }
  82.     if (*end != '' && end != NULL ) {
  83.       throw BadConversion (typeid(Type).name(), c_str(), end - str, len);
  84.     }
  85.     return num;
  86.   }
  87.   //!dummy: operator TYPE() const;
  88.   //: Converts the column data to TYPE.
  89.   // If all the charters are not read during the conversion to TYPE it
  90.   // will through BadConversion.
  91.   //
  92.   // TYPE is defined for all the build in types.
  93.   //
  94.   // (Note, This is not an actual template)
  95.   void it_is_null (void) {_null=true;}
  96. inline const bool is_null(void) const {return _null;}
  97. inline const string&  get_string(void) const {return buf;}
  98.   operator cchar*() const {return buf.c_str();}
  99.   operator  signed char() const {return conv((signed char)0);}
  100.   operator  unsigned char() const {return conv((unsigned char)0);}
  101.   operator  int() const {return conv((int)0);}
  102.   operator  unsigned int() const {return conv((unsigned int)0);}
  103.   operator  short int() const {return conv((short int)0);}
  104.   operator  unsigned short int() const {return conv((unsigned short int)0);}
  105.   operator  long int() const {return conv((long int)0);}
  106.   operator  unsigned long int() const {return conv((unsigned long int)0);}
  107. #ifndef NO_LONG_LONGS
  108.   operator  longlong() const {return conv((longlong)0);}
  109.   operator  ulonglong() const {return conv((ulonglong)0);}
  110. #endif
  111.   operator  float() const {return conv((float)0);}
  112.   operator  double() const {return conv((double)0);}
  113.   template <class T, class B> operator Null<T,B> () const;
  114. };
  115. //: The Type that is returned by constant rows
  116. typedef mysql_ColData<const_string> ColData;
  117. //: The Type that is returned by mutable rows
  118. typedef mysql_ColData<string>       MutableColData;
  119. //: For backwards compatibility. Do not use.
  120. typedef ColData MysqlString;
  121. //: For backwards compatibility. Do not use.
  122. typedef ColData MysqlStr;
  123. #endif