Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

type_info.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 /***********************************************************************
00008  Copyright (c) 1998 by Kevin Atkinson, (c) 1999, 2000 and 2001 by
00009  MySQL AB, and (c) 2004, 2005 by Educational Technology Resources, Inc.
00010  Others may also hold copyrights on code in this file.  See the CREDITS
00011  file in the top directory of the distribution for details.
00012 
00013  This file is part of MySQL++.
00014 
00015  MySQL++ is free software; you can redistribute it and/or modify it
00016  under the terms of the GNU Lesser General Public License as published
00017  by the Free Software Foundation; either version 2.1 of the License, or
00018  (at your option) any later version.
00019 
00020  MySQL++ is distributed in the hope that it will be useful, but WITHOUT
00021  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00022  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
00023  License for more details.
00024 
00025  You should have received a copy of the GNU Lesser General Public
00026  License along with MySQL++; if not, write to the Free Software
00027  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
00028  USA
00029 ***********************************************************************/
00030 
00031 #ifndef MYSQLPP_TYPE_INFO_H
00032 #define MYSQLPP_TYPE_INFO_H
00033 
00034 #include "defs.h"
00035 
00036 #include <mysql.h>
00037 
00038 #include <typeinfo>
00039 #include <map>
00040 
00041 namespace mysqlpp {
00042 
00043 class mysql_type_info;
00044 class mysql_ti_sql_type_info_lookup;
00045 
00046 #if !defined(DOXYGEN_IGNORE)
00047 // Doxygen will not generate documentation for this section.
00048 
00049 class mysql_ti_sql_type_info
00050 {
00051 private:
00052         friend class mysql_type_info;
00053         friend class mysql_ti_sql_type_info_lookup;
00054 
00055         MYSQLPP_EXPORT mysql_ti_sql_type_info& operator=(
00056                         const mysql_ti_sql_type_info& b);
00057         
00058         // Not initting _base_type and _default because only mysql_type_info
00059         // can create them.  There *must* be only one copy of each.
00060         mysql_ti_sql_type_info() :
00061         sql_name_(0),
00062         c_type_(0),
00063         base_type_(0),
00064         default_(false) 
00065         {
00066         }
00067         
00068         mysql_ti_sql_type_info(const char* s,
00069                         const std::type_info& t, const unsigned char bt = 0,
00070                         const bool d = false) :
00071         sql_name_(s),
00072         c_type_(&t),
00073         base_type_(bt),
00074         default_(d)
00075         {
00076         }
00077 
00078         const char* sql_name_;
00079         const std::type_info* c_type_;
00080         const unsigned char base_type_;
00081         const bool default_;
00082 };
00083 
00084 
00085 struct type_info_cmp
00086 {
00087         bool operator() (const std::type_info* lhs,
00088                         const std::type_info* rhs) const
00089         {
00090                 return lhs->before(*rhs) != 0;
00091         }
00092 };
00093 
00094 class mysql_ti_sql_type_info_lookup
00095 {
00096 private:
00097         friend class mysql_type_info;
00098 
00099         typedef mysql_ti_sql_type_info sql_type_info;
00100 
00101         MYSQLPP_EXPORT mysql_ti_sql_type_info_lookup(
00102                         const sql_type_info types[], const int size);
00103 
00104         const unsigned char& operator [](
00105                         const std::type_info& ti) const
00106         {
00107                 return map_.find(&ti)->second;
00108         }
00109 
00110         std::map<const std::type_info*, unsigned char, type_info_cmp> map_;
00111 };
00112 
00113 #endif // !defined(DOXYGEN_IGNORE)
00114 
00115 
00119 class mysql_type_info
00120 {
00121 public:
00132         mysql_type_info(unsigned char n = static_cast<unsigned char>(-1)) :
00133         num_(n)
00134         {
00135         }
00136 
00142         MYSQLPP_EXPORT inline mysql_type_info(enum_field_types t,
00143                         bool _unsigned, bool _null);
00144 
00148         MYSQLPP_EXPORT inline mysql_type_info(const MYSQL_FIELD& f);
00149 
00151         mysql_type_info(const mysql_type_info& t) :
00152         num_(t.num_)
00153         {
00154         }
00155 
00160         mysql_type_info(const std::type_info& t)
00161         {
00162                 num_ = lookups[t];
00163         }
00164 
00170         mysql_type_info& operator =(unsigned char n)
00171         {
00172                 num_ = n;
00173                 return *this;
00174         }
00175 
00177         mysql_type_info& operator =(const mysql_type_info& t)
00178         {
00179                 num_ = t.num_;
00180                 return *this;
00181         }
00182 
00187         mysql_type_info& operator =(const std::type_info& t)
00188         {
00189                 num_ = lookups[t];
00190                 return *this;
00191         }
00192 
00197         MYSQLPP_EXPORT inline const char* name() const;
00198 
00202         MYSQLPP_EXPORT inline const char* sql_name() const;
00203 
00208         MYSQLPP_EXPORT inline const std::type_info& c_type() const;
00209 
00214         MYSQLPP_EXPORT inline const unsigned int length() const;
00215 
00220         MYSQLPP_EXPORT inline const unsigned int max_length() const;
00221 
00227         MYSQLPP_EXPORT inline const mysql_type_info base_type() const;
00228 
00234         int id() const
00235         {
00236                 return num_;
00237         }
00238         
00244         MYSQLPP_EXPORT bool quote_q() const;
00245 
00251         MYSQLPP_EXPORT bool escape_q() const;
00252 
00257         bool before(mysql_type_info& b)
00258         {
00259                 return num_ < b.num_;
00260         }
00261 
00266         static const unsigned char string_type = 20;
00267 
00268         unsigned int _length;           
00269         unsigned int _max_length;       
00270 
00271 private:
00272         typedef mysql_ti_sql_type_info sql_type_info;
00273         typedef mysql_ti_sql_type_info_lookup sql_type_info_lookup;
00274 
00275         MYSQLPP_EXPORT static const sql_type_info types[62];
00276 
00277         MYSQLPP_EXPORT static const unsigned char offset = 0;
00278         MYSQLPP_EXPORT static const unsigned char unsigned_offset = 21;
00279         MYSQLPP_EXPORT static const unsigned char null_offset = 31;
00280         MYSQLPP_EXPORT static const unsigned char unsigned_null_offset = 52;
00281 
00282         MYSQLPP_EXPORT static const sql_type_info_lookup lookups;
00283 
00299         MYSQLPP_EXPORT static unsigned char type(enum_field_types t,
00300                         bool _unsigned, bool _null = false);
00301 
00302         const sql_type_info& deref() const
00303         {
00304                 return types[num_];
00305         }
00306 
00307         unsigned char num_;
00308 };
00309 
00310 inline const char* mysql_type_info::name() const 
00311 {
00312         return deref().c_type_->name();
00313 }
00314 
00315 inline const char* mysql_type_info::sql_name() const
00316 {
00317         return deref().sql_name_;
00318 }
00319 
00320 inline const unsigned int mysql_type_info::length() const
00321 {
00322         return _length;
00323 }
00324 
00325 inline const unsigned int mysql_type_info::max_length() const
00326 {
00327         return _max_length;
00328 }
00329 
00330 inline const std::type_info& mysql_type_info::c_type() const
00331 {
00332         return *deref().c_type_;
00333 }
00334 
00335 inline const mysql_type_info mysql_type_info::base_type() const
00336 {
00337         return mysql_type_info(deref().base_type_);
00338 }
00339 
00340 inline mysql_type_info::mysql_type_info(enum_field_types t,
00341                 bool _unsigned, bool _null)
00342 {
00343         num_ = type(t, _unsigned, _null);
00344 }
00345 
00346 inline mysql_type_info::mysql_type_info(const MYSQL_FIELD& f)
00347 {
00348         num_ = type(f.type, (f.flags & UNSIGNED_FLAG) != 0,
00349                         (f.flags & NOT_NULL_FLAG) == 0);
00350         _length = f.length;
00351         _max_length = f.max_length;
00352 }
00353 
00355 inline bool operator ==(const mysql_type_info& a, const mysql_type_info& b)
00356 {
00357         return a.id() == b.id();
00358 }
00359 
00361 inline bool operator !=(const mysql_type_info& a, const mysql_type_info& b)
00362 {
00363         return a.id() != b.id();
00364 }
00365 
00368 inline bool operator ==(const std::type_info& a, const mysql_type_info& b)
00369 {
00370         return a == b.c_type();
00371 }
00372 
00375 inline bool operator !=(const std::type_info& a, const mysql_type_info& b)
00376 {
00377         return a != b.c_type();
00378 }
00379 
00382 inline bool operator ==(const mysql_type_info& a, const std::type_info& b)
00383 {
00384         return a.c_type() == b;
00385 }
00386 
00389 inline bool operator !=(const mysql_type_info& a, const std::type_info& b)
00390 {
00391         return a.c_type() != b;
00392 }
00393 
00394 }                                                               // end namespace mysqlpp
00395 
00396 #endif
00397 

Generated on Wed Sep 28 07:44:06 2005 for MySQL++ by doxygen1.2.18