QxOrm  1.2.4
C++ Object Relational Mapping library
QxSession.h
Go to the documentation of this file.
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_