![]() |
QxOrm
1.2.3
C++ Object Relational Mapping library
|
00001 /**************************************************************************** 00002 ** 00003 ** http://www.qxorm.com/ 00004 ** http://sourceforge.net/projects/qxorm/ 00005 ** Original file by Lionel Marty 00006 ** 00007 ** This file is part of the QxOrm library 00008 ** 00009 ** This software is provided 'as-is', without any express or implied 00010 ** warranty. In no event will the authors be held liable for any 00011 ** damages arising from the use of this software. 00012 ** 00013 ** GNU Lesser General Public License Usage 00014 ** This file must be used under the terms of the GNU Lesser 00015 ** General Public License version 2.1 as published by the Free Software 00016 ** Foundation and appearing in the file 'license.lgpl.txt' included in the 00017 ** packaging of this file. Please review the following information to 00018 ** ensure the GNU Lesser General Public License version 2.1 requirements 00019 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 00020 ** 00021 ** If you have questions regarding the use of this file, please contact : 00022 ** contact@qxorm.com 00023 ** 00024 ****************************************************************************/ 00025 00026 #ifndef _QX_GET_SQL_TYPE_H_ 00027 #define _QX_GET_SQL_TYPE_H_ 00028 00029 #ifdef _MSC_VER 00030 #pragma once 00031 #endif 00032 00040 #include <boost/mpl/if.hpp> 00041 #include <boost/mpl/logical.hpp> 00042 #include <boost/scoped_ptr.hpp> 00043 #include <boost/shared_ptr.hpp> 00044 #include <boost/intrusive_ptr.hpp> 00045 #include <boost/type_traits/is_enum.hpp> 00046 #include <boost/type_traits/is_same.hpp> 00047 00048 #include <QtCore/qsharedpointer.h> 00049 00050 #if (QT_VERSION >= 0x040600) 00051 #include <QtCore/qscopedpointer.h> 00052 #endif // (QT_VERSION >= 0x040600) 00053 00054 #include <QxTraits/is_qx_registered.h> 00055 #include <QxTraits/get_primary_key.h> 00056 #include <QxTraits/remove_attr.h> 00057 #include <QxTraits/get_class_name_primitive.h> 00058 00059 #include <QxDao/QxDaoPointer.h> 00060 #include <QxDao/QxDateNeutral.h> 00061 #include <QxDao/QxTimeNeutral.h> 00062 #include <QxDao/QxDateTimeNeutral.h> 00063 00064 #include <QxCommon/QxBool.h> 00065 00066 namespace qx { 00067 namespace trait { 00068 namespace detail { 00069 00070 template <typename T> 00071 struct get_sql_type_helper 00072 { 00073 00074 private: 00075 00076 typedef typename qx::trait::remove_attr<T>::type type_1; 00077 typedef typename boost::mpl::if_c< qx::trait::is_qx_registered<type_1>::value, typename qx::trait::get_primary_key<type_1>::type, type_1 >::type type_2; 00078 typedef typename boost::mpl::if_c< boost::is_enum<type_2>::value, long, type_2 >::type type_3; 00079 00080 public: 00081 00082 typedef typename qx::trait::detail::get_sql_type_helper<T>::type_3 type; 00083 00084 }; 00085 00086 template <typename T> 00087 struct get_sql_type 00088 { static inline const char * get() { return ""; } }; 00089 00090 /* Implemented into './src/QxRegister/QxClassX.cpp' file */ 00091 QX_DLL_EXPORT const char * get_sql_type_by_class_name(const char * sClassName, const char * sDefaultValue); 00092 00093 } // namespace detail 00094 00099 template <typename T> 00100 struct get_sql_type 00101 { 00102 typedef typename qx::trait::detail::get_sql_type_helper<T>::type type_sql; 00103 static inline const char * get() { return (boost::is_same<T, type_sql>::value ? qx::trait::detail::get_sql_type<type_sql>::get() : qx::trait::get_sql_type<type_sql>::get()); } 00104 }; 00105 00106 template <typename T> 00107 struct get_sql_type< boost::scoped_ptr<T> > 00108 { static inline const char * get() { return qx::trait::get_sql_type<T>::get(); } }; 00109 00110 template <typename T> 00111 struct get_sql_type< boost::shared_ptr<T> > 00112 { static inline const char * get() { return qx::trait::get_sql_type<T>::get(); } }; 00113 00114 template <typename T> 00115 struct get_sql_type< boost::intrusive_ptr<T> > 00116 { static inline const char * get() { return qx::trait::get_sql_type<T>::get(); } }; 00117 00118 template <typename T> 00119 struct get_sql_type< QSharedPointer<T> > 00120 { static inline const char * get() { return qx::trait::get_sql_type<T>::get(); } }; 00121 00122 #if (QT_VERSION >= 0x040600) 00123 template <typename T> 00124 struct get_sql_type< QScopedPointer<T> > 00125 { static inline const char * get() { return qx::trait::get_sql_type<T>::get(); } }; 00126 #endif // (QT_VERSION >= 0x040600) 00127 00128 template <typename T> 00129 struct get_sql_type< qx::dao::ptr<T> > 00130 { static inline const char * get() { return qx::trait::get_sql_type<T>::get(); } }; 00131 00132 template <typename T1, typename T2> 00133 struct get_sql_type< std::pair<T1, T2> > 00134 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get())); return s.c_str(); } }; 00135 00136 template <typename T1, typename T2> 00137 struct get_sql_type< QPair<T1, T2> > 00138 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get())); return s.c_str(); } }; 00139 00140 template <typename T1, typename T2> 00141 struct get_sql_type< boost::tuple<T1, T2> > 00142 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get())); return s.c_str(); } }; 00143 00144 template <typename T1, typename T2, typename T3> 00145 struct get_sql_type< boost::tuple<T1, T2, T3> > 00146 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get()) + "|" + std::string(qx::trait::get_sql_type<T3>::get())); return s.c_str(); } }; 00147 00148 template <typename T1, typename T2, typename T3, typename T4> 00149 struct get_sql_type< boost::tuple<T1, T2, T3, T4> > 00150 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get()) + "|" + std::string(qx::trait::get_sql_type<T3>::get()) + "|" + std::string(qx::trait::get_sql_type<T4>::get())); return s.c_str(); } }; 00151 00152 template <typename T1, typename T2, typename T3, typename T4, typename T5> 00153 struct get_sql_type< boost::tuple<T1, T2, T3, T4, T5> > 00154 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get()) + "|" + std::string(qx::trait::get_sql_type<T3>::get()) + "|" + std::string(qx::trait::get_sql_type<T4>::get()) + "|" + std::string(qx::trait::get_sql_type<T5>::get())); return s.c_str(); } }; 00155 00156 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> 00157 struct get_sql_type< boost::tuple<T1, T2, T3, T4, T5, T6> > 00158 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get()) + "|" + std::string(qx::trait::get_sql_type<T3>::get()) + "|" + std::string(qx::trait::get_sql_type<T4>::get()) + "|" + std::string(qx::trait::get_sql_type<T5>::get()) + "|" + std::string(qx::trait::get_sql_type<T6>::get())); return s.c_str(); } }; 00159 00160 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> 00161 struct get_sql_type< boost::tuple<T1, T2, T3, T4, T5, T6, T7> > 00162 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get()) + "|" + std::string(qx::trait::get_sql_type<T3>::get()) + "|" + std::string(qx::trait::get_sql_type<T4>::get()) + "|" + std::string(qx::trait::get_sql_type<T5>::get()) + "|" + std::string(qx::trait::get_sql_type<T6>::get()) + "|" + std::string(qx::trait::get_sql_type<T7>::get())); return s.c_str(); } }; 00163 00164 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> 00165 struct get_sql_type< boost::tuple<T1, T2, T3, T4, T5, T6, T7, T8> > 00166 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get()) + "|" + std::string(qx::trait::get_sql_type<T3>::get()) + "|" + std::string(qx::trait::get_sql_type<T4>::get()) + "|" + std::string(qx::trait::get_sql_type<T5>::get()) + "|" + std::string(qx::trait::get_sql_type<T6>::get()) + "|" + std::string(qx::trait::get_sql_type<T7>::get()) + "|" + std::string(qx::trait::get_sql_type<T8>::get())); return s.c_str(); } }; 00167 00168 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> 00169 struct get_sql_type< boost::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> > 00170 { static inline const char * get() { static std::string s; s = (std::string(qx::trait::get_sql_type<T1>::get()) + "|" + std::string(qx::trait::get_sql_type<T2>::get()) + "|" + std::string(qx::trait::get_sql_type<T3>::get()) + "|" + std::string(qx::trait::get_sql_type<T4>::get()) + "|" + std::string(qx::trait::get_sql_type<T5>::get()) + "|" + std::string(qx::trait::get_sql_type<T6>::get()) + "|" + std::string(qx::trait::get_sql_type<T7>::get()) + "|" + std::string(qx::trait::get_sql_type<T8>::get()) + "|" + std::string(qx::trait::get_sql_type<T9>::get())); return s.c_str(); } }; 00171 00172 } // namespace trait 00173 } // namespace qx 00174 00175 #define QX_REGISTER_TRAIT_GET_SQL_TYPE(className, sqlType) \ 00176 namespace qx { namespace trait { namespace detail { \ 00177 template <> \ 00178 struct get_sql_type< className > \ 00179 { static inline const char * get() { return get_sql_type_by_class_name(#className, sqlType); } }; }}} 00180 00181 QX_REGISTER_TRAIT_GET_SQL_TYPE(bool, "SMALLINT") 00182 QX_REGISTER_TRAIT_GET_SQL_TYPE(qx_bool, "SMALLINT") 00183 QX_REGISTER_TRAIT_GET_SQL_TYPE(short, "SMALLINT") 00184 QX_REGISTER_TRAIT_GET_SQL_TYPE(int, "INTEGER") 00185 QX_REGISTER_TRAIT_GET_SQL_TYPE(long, "INTEGER") 00186 QX_REGISTER_TRAIT_GET_SQL_TYPE(long long, "INTEGER") 00187 QX_REGISTER_TRAIT_GET_SQL_TYPE(float, "FLOAT") 00188 QX_REGISTER_TRAIT_GET_SQL_TYPE(double, "FLOAT") 00189 QX_REGISTER_TRAIT_GET_SQL_TYPE(long double, "FLOAT") 00190 QX_REGISTER_TRAIT_GET_SQL_TYPE(unsigned short, "SMALLINT") 00191 QX_REGISTER_TRAIT_GET_SQL_TYPE(unsigned int, "INTEGER") 00192 QX_REGISTER_TRAIT_GET_SQL_TYPE(unsigned long, "INTEGER") 00193 QX_REGISTER_TRAIT_GET_SQL_TYPE(unsigned long long, "INTEGER") 00194 QX_REGISTER_TRAIT_GET_SQL_TYPE(std::string, "TEXT") 00195 QX_REGISTER_TRAIT_GET_SQL_TYPE(std::wstring, "TEXT") 00196 QX_REGISTER_TRAIT_GET_SQL_TYPE(QString, "TEXT") 00197 QX_REGISTER_TRAIT_GET_SQL_TYPE(QVariant, "TEXT") 00198 QX_REGISTER_TRAIT_GET_SQL_TYPE(QUuid, "TEXT") 00199 QX_REGISTER_TRAIT_GET_SQL_TYPE(QDate, "DATE") 00200 QX_REGISTER_TRAIT_GET_SQL_TYPE(QTime, "TIME") 00201 QX_REGISTER_TRAIT_GET_SQL_TYPE(QDateTime, "TIMESTAMP") 00202 QX_REGISTER_TRAIT_GET_SQL_TYPE(QByteArray, "BLOB") 00203 QX_REGISTER_TRAIT_GET_SQL_TYPE(qx::QxDateNeutral, "TEXT") 00204 QX_REGISTER_TRAIT_GET_SQL_TYPE(qx::QxTimeNeutral, "TEXT") 00205 QX_REGISTER_TRAIT_GET_SQL_TYPE(qx::QxDateTimeNeutral, "TEXT") 00206 00207 #endif // _QX_GET_SQL_TYPE_H_