31 #if !defined(MYSQLPP_TYPE_INFO_H)
32 #define MYSQLPP_TYPE_INFO_H
44 #if !defined(DOXYGEN_IGNORE)
47 class MYSQLPP_EXPORT mysql_type_info;
48 class MYSQLPP_EXPORT mysql_ti_sql_type_info_lookup;
50 class MYSQLPP_EXPORT mysql_ti_sql_type_info
60 friend class mysql_type_info;
61 friend class mysql_ti_sql_type_info_lookup;
63 mysql_ti_sql_type_info& operator=(
64 const mysql_ti_sql_type_info& b);
68 mysql_ti_sql_type_info() :
72 #if MYSQL_VERSION_ID > 40000
82 mysql_ti_sql_type_info(
const char* s,
83 const std::type_info& t,
const enum_field_types bt,
84 const unsigned int flags = 0) :
92 bool is_default()
const {
return flags_ & tf_default; }
93 bool is_null()
const {
return flags_ & tf_null; }
94 bool is_unsigned()
const {
return flags_ & tf_unsigned; }
96 const char* sql_name_;
97 const std::type_info* c_type_;
98 const enum_field_types base_type_;
99 const unsigned int flags_;
105 bool operator() (
const std::type_info* lhs,
106 const std::type_info* rhs)
const
108 return lhs->before(*rhs) != 0;
112 class MYSQLPP_EXPORT mysql_ti_sql_type_info_lookup
115 friend class mysql_type_info;
117 typedef mysql_ti_sql_type_info sql_type_info;
118 typedef std::map<const std::type_info*, unsigned char, type_info_cmp>
121 mysql_ti_sql_type_info_lookup(
const sql_type_info types[],
124 const unsigned char& operator [](
125 const std::type_info& ti)
const
127 map_type::const_iterator it = map_.find(&ti);
128 if (it != map_.end()) {
132 std::ostringstream outs;
133 outs <<
"Failed to find MySQL C API type ID for " << ti.name();
134 throw TypeLookupFailed(outs.str());
141 #endif // !defined(DOXYGEN_IGNORE)
148 class MYSQLPP_EXPORT mysql_type_info
159 num_(static_cast<unsigned char>(-1))
168 mysql_type_info(enum_field_types t,
bool _unsigned =
false,
169 bool _null =
false) :
170 num_(type(t, _unsigned, _null))
184 mysql_type_info(
const std::type_info& t) :
190 mysql_type_info& operator =(
const mysql_type_info& t)
200 mysql_type_info& operator =(
const std::type_info& t)
210 const char* name()
const {
return deref().c_type_->name(); }
215 const char* sql_name()
const {
return deref().sql_name_; }
221 const std::type_info& c_type()
const {
return *deref().c_type_; }
248 bool quote_q()
const;
255 bool escape_q()
const;
261 bool before(mysql_type_info& b)
263 return num_ < b.num_;
270 static const enum_field_types string_type =
271 #if MYSQL_VERSION_ID > 40000
278 typedef mysql_ti_sql_type_info sql_type_info;
279 typedef mysql_ti_sql_type_info_lookup sql_type_info_lookup;
281 static const sql_type_info types[];
282 static const int num_types;
284 static const sql_type_info_lookup lookups;
304 static unsigned char type(enum_field_types t,
305 bool _unsigned,
bool _null =
false);
307 const sql_type_info& deref()
const
318 return a.
id() == b.
id();
324 return a.
id() != b.
id();
329 inline bool operator ==(
const std::type_info& a,
const mysql_type_info& b)
331 return a == b.c_type();
336 inline bool operator !=(
const std::type_info& a,
const mysql_type_info& b)
338 return a != b.c_type();
343 inline bool operator ==(
const mysql_type_info& a,
const std::type_info& b)
345 return a.c_type() == b;
350 inline bool operator !=(
const mysql_type_info& a,
const std::type_info& b)
352 return a.c_type() != b;
357 #endif // !defined(MYSQLPP_TYPE_INFO_H)