![]() |
QxOrm
1.2.4
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_DAO_SESSION_H_ 00027 #define _QX_DAO_SESSION_H_ 00028 00029 #ifdef _MSC_VER 00030 #pragma once 00031 #endif 00032 00040 #include <boost/noncopyable.hpp> 00041 #include <boost/shared_ptr.hpp> 00042 00043 #include <QtSql/qsqldatabase.h> 00044 #include <QtSql/qsqlquery.h> 00045 #include <QtSql/qsqlerror.h> 00046 #include <QtSql/qsqldriver.h> 00047 00048 #include <QtCore/qlist.h> 00049 00050 #include <QxCommon/QxBool.h> 00051 00052 #include <QxDao/QxDao.h> 00053 #include <QxDao/QxSqlQuery.h> 00054 #include <QxDao/QxSqlError.h> 00055 00056 #include <QxRegister/QxClass.h> 00057 00058 namespace qx { 00059 00115 class QX_DLL_EXPORT QxSession : private boost::noncopyable 00116 { 00117 00118 private: 00119 00120 QSqlDatabase m_database; 00121 QList<QSqlError> m_lstSqlError; 00122 bool m_bTransaction; 00123 bool m_bThrowable; 00124 bool m_bThrowInEvent; 00125 bool m_bAutoOpenClose; 00126 00127 public: 00128 00129 QxSession(); 00130 QxSession(const QSqlDatabase & database); 00131 QxSession(const QSqlDatabase & database, bool bOpenTransaction); 00132 QxSession(const QSqlDatabase & database, bool bOpenTransaction, bool bThrowable); 00133 virtual ~QxSession() { close(); } 00134 00135 inline bool isThrowable() const { return m_bThrowable; } 00136 inline bool isOpened() const { return m_bTransaction; } 00137 inline bool isValid() const { return (m_lstSqlError.count() <= 0); } 00138 inline QSqlError firstError() const { return ((m_lstSqlError.count() > 0) ? m_lstSqlError.first() : QSqlError()); } 00139 inline QSqlError lastError() const { return ((m_lstSqlError.count() > 0) ? m_lstSqlError.last() : QSqlError()); } 00140 inline QList<QSqlError> allErrors() const { return m_lstSqlError; } 00141 inline const QSqlDatabase * database() const { return (& m_database); } 00142 inline QSqlDatabase * database() { return (& m_database); } 00143 00144 bool open(); 00145 bool close(); 00146 bool commit(); 00147 bool rollback(); 00148 00149 QxSession & operator+= (const QSqlError & err); 00150 00151 private: 00152 00153 void appendSqlError(const QSqlError & err); 00154 void clear(); 00155 00156 public: 00157 00158 template <class T> 00159 long count(const qx::QxSqlQuery & query = qx::QxSqlQuery()) 00160 { return qx::dao::count<T>(query, this->database()); } 00161 00162 template <class T> 00163 QSqlError count(long & lCount, const qx::QxSqlQuery & query = qx::QxSqlQuery()) 00164 { return qx::dao::count<T>(lCount, query, this->database()); } 00165 00166 template <class T> 00167 T * fetchById(const QVariant & id, const QStringList & columns = QStringList(), const QStringList & relation = QStringList()) 00168 { 00169 IxDataMemberX * pDataMemberX = QxClass<T>::getSingleton()->getDataMemberX(); 00170 IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); 00171 if (! pDataMemberId) { qAssert(false); return NULL; } 00172 T * t = new T(); QSqlError err; 00173 pDataMemberId->fromVariant(t, id); 00174 if (relation.count() == 0) { err = qx::dao::fetch_by_id((* t), this->database(), columns); } 00175 else { err = qx::dao::fetch_by_id_with_relation(relation, (* t), this->database()); } 00176 if (err.isValid()) { delete t; t = NULL; (* this) += err; } 00177 return t; 00178 } 00179 00180 template <class T> 00181 QSqlError fetchById(T & t, const QStringList & columns = QStringList(), const QStringList & relation = QStringList()) 00182 { 00183 QSqlError err; 00184 if (relation.count() == 0) { err = qx::dao::fetch_by_id(t, this->database(), columns); } 00185 else { err = qx::dao::fetch_by_id_with_relation(relation, t, this->database()); } 00186 if (err.isValid()) { (* this) += err; } 00187 return err; 00188 } 00189 00190 template <class T> 00191 QSqlError fetchAll(T & t, const QStringList & columns = QStringList(), const QStringList & relation = QStringList()) 00192 { 00193 QSqlError err; 00194 if (relation.count() == 0) { err = qx::dao::fetch_all(t, this->database(), columns); } 00195 else { err = qx::dao::fetch_all_with_relation(relation, t, this->database()); } 00196 if (err.isValid()) { (* this) += err; } 00197 return err; 00198 } 00199 00200 template <class T> 00201 QSqlError fetchByQuery(const qx::QxSqlQuery & query, T & t, const QStringList & columns = QStringList(), const QStringList & relation = QStringList()) 00202 { 00203 QSqlError err; 00204 if (relation.count() == 0) { err = qx::dao::fetch_by_query(query, t, this->database(), columns); } 00205 else { err = qx::dao::fetch_by_query_with_relation(relation, query, t, this->database()); } 00206 if (err.isValid()) { (* this) += err; } 00207 return err; 00208 } 00209 00210 template <class T> 00211 QSqlError insert(T & t, const QStringList & relation = QStringList()) 00212 { 00213 QSqlError err; 00214 if (relation.count() == 0) { err = qx::dao::insert(t, this->database()); } 00215 else { err = qx::dao::insert_with_relation(relation, t, this->database()); } 00216 if (err.isValid()) { (* this) += err; } 00217 return err; 00218 } 00219 00220 template <class T> 00221 QSqlError update(T & t, const qx::QxSqlQuery & query = qx::QxSqlQuery(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList()) 00222 { 00223 QSqlError err; 00224 if (relation.count() == 0) { err = qx::dao::update_by_query(query, t, this->database(), columns); } 00225 else { err = qx::dao::update_by_query_with_relation(relation, query, t, this->database()); } 00226 if (err.isValid()) { (* this) += err; } 00227 return err; 00228 } 00229 00230 template <class T> 00231 QSqlError save(T & t, const QStringList & relation = QStringList()) 00232 { 00233 QSqlError err; 00234 if (relation.count() == 0) { err = qx::dao::save(t, this->database()); } 00235 else { err = qx::dao::save_with_relation(relation, t, this->database()); } 00236 if (err.isValid()) { (* this) += err; } 00237 return err; 00238 } 00239 00240 template <class T> 00241 QSqlError deleteById(const QVariant & id) 00242 { 00243 IxDataMemberX * pDataMemberX = QxClass<T>::getSingleton()->getDataMemberX(); 00244 IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); 00245 if (! pDataMemberId) { qAssert(false); return QSqlError(); } 00246 boost::shared_ptr<T> t; t.reset(new T()); 00247 pDataMemberId->fromVariant(t.get(), id); 00248 QSqlError err = qx::dao::delete_by_id((* t), this->database()); 00249 if (err.isValid()) { (* this) += err; } 00250 return err; 00251 } 00252 00253 template <class T> 00254 QSqlError deleteById(T & t) 00255 { 00256 QSqlError err = qx::dao::delete_by_id(t, this->database()); 00257 if (err.isValid()) { (* this) += err; } 00258 return err; 00259 } 00260 00261 template <class T> 00262 QSqlError deleteAll() 00263 { 00264 QSqlError err = qx::dao::delete_all<T>(this->database()); 00265 if (err.isValid()) { (* this) += err; } 00266 return err; 00267 } 00268 00269 template <class T> 00270 QSqlError deleteByQuery(const qx::QxSqlQuery & query) 00271 { 00272 QSqlError err = qx::dao::delete_by_query<T>(query, this->database()); 00273 if (err.isValid()) { (* this) += err; } 00274 return err; 00275 } 00276 00277 template <class T> 00278 QSqlError destroyById(const QVariant & id) 00279 { 00280 IxDataMemberX * pDataMemberX = QxClass<T>::getSingleton()->getDataMemberX(); 00281 IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); 00282 if (! pDataMemberId) { qAssert(false); return QSqlError(); } 00283 boost::shared_ptr<T> t; t.reset(new T()); 00284 pDataMemberId->fromVariant(t.get(), id); 00285 QSqlError err = qx::dao::destroy_by_id((* t), this->database()); 00286 if (err.isValid()) { (* this) += err; } 00287 return err; 00288 } 00289 00290 template <class T> 00291 QSqlError destroyById(T & t) 00292 { 00293 QSqlError err = qx::dao::destroy_by_id(t, this->database()); 00294 if (err.isValid()) { (* this) += err; } 00295 return err; 00296 } 00297 00298 template <class T> 00299 QSqlError destroyAll() 00300 { 00301 QSqlError err = qx::dao::destroy_all<T>(this->database()); 00302 if (err.isValid()) { (* this) += err; } 00303 return err; 00304 } 00305 00306 template <class T> 00307 QSqlError destroyByQuery(const qx::QxSqlQuery & query) 00308 { 00309 QSqlError err = qx::dao::destroy_by_query<T>(query, this->database()); 00310 if (err.isValid()) { (* this) += err; } 00311 return err; 00312 } 00313 00314 template <class T> 00315 QSqlError executeQuery(qx::QxSqlQuery & query, T & t) 00316 { 00317 QSqlError err = qx::dao::execute_query<T>(query, t, this->database()); 00318 if (err.isValid()) { (* this) += err; } 00319 return err; 00320 } 00321 00322 QSqlError callQuery(qx::QxSqlQuery & query) 00323 { 00324 QSqlError err = qx::dao::call_query(query, this->database()); 00325 if (err.isValid()) { (* this) += err; } 00326 return err; 00327 } 00328 00329 template <class T> 00330 qx_bool exist(T & t) 00331 { return qx::dao::exist(t, this->database()); } 00332 00333 }; 00334 00335 } // namespace qx 00336 00337 #endif // _QX_DAO_SESSION_H_