QxOrm  1.4.8
C++ Object Relational Mapping library
IxDao_Helper.h
Go to the documentation of this file.
00001 /****************************************************************************
00002 **
00003 ** https://www.qxorm.com/
00004 ** Copyright (C) 2013 Lionel Marty (contact@qxorm.com)
00005 **
00006 ** This file is part of the QxOrm library
00007 **
00008 ** This software is provided 'as-is', without any express or implied
00009 ** warranty. In no event will the authors be held liable for any
00010 ** damages arising from the use of this software
00011 **
00012 ** Commercial Usage
00013 ** Licensees holding valid commercial QxOrm licenses may use this file in
00014 ** accordance with the commercial license agreement provided with the
00015 ** Software or, alternatively, in accordance with the terms contained in
00016 ** a written agreement between you and Lionel Marty
00017 **
00018 ** GNU General Public License Usage
00019 ** Alternatively, this file may be used under the terms of the GNU
00020 ** General Public License version 3.0 as published by the Free Software
00021 ** Foundation and appearing in the file 'license.gpl3.txt' included in the
00022 ** packaging of this file. Please review the following information to
00023 ** ensure the GNU General Public License version 3.0 requirements will be
00024 ** met : http://www.gnu.org/copyleft/gpl.html
00025 **
00026 ** If you are unsure which license is appropriate for your use, or
00027 ** if you have questions regarding the use of this file, please contact :
00028 ** contact@qxorm.com
00029 **
00030 ****************************************************************************/
00031 
00032 #ifndef _IX_DAO_HELPER_H_
00033 #define _IX_DAO_HELPER_H_
00034 
00035 #ifdef _MSC_VER
00036 #pragma once
00037 #endif
00038 
00046 #include <QtSql/qsqldatabase.h>
00047 #include <QtSql/qsqlquery.h>
00048 #include <QtSql/qsqlerror.h>
00049 #include <QtSql/qsqldriver.h>
00050 #include <QtSql/qsqlrecord.h>
00051 
00052 #include <QxTraits/get_primary_key.h>
00053 #include <QxTraits/is_valid_primary_key.h>
00054 
00055 #include <QxDao/QxSqlDatabase.h>
00056 #include <QxDao/IxSqlQueryBuilder.h>
00057 #include <QxDao/QxSqlQuery.h>
00058 #include <QxDao/IxSqlRelation.h>
00059 #include <QxDao/QxSqlRelationLinked.h>
00060 
00061 #include <QxDao/QxSqlGenerator/IxSqlGenerator.h>
00062 
00063 #include <QxCollection/QxCollection.h>
00064 
00065 #include <QxDataMember/IxDataMemberX.h>
00066 
00067 #include <QxValidator/QxInvalidValueX.h>
00068 #include <QxValidator/QxValidatorError.h>
00069 
00070 namespace qx {
00071 template <class T>
00072 QxInvalidValueX validate(T & t, const QString & group);
00073 class QxSession;
00074 } // namespace qx
00075 
00076 namespace qx {
00077 namespace dao {
00078 namespace detail {
00079 
00080 struct IxDao_Timer;
00081 
00086 class QX_DLL_EXPORT IxDao_Helper
00087 {
00088 
00089    friend struct IxDao_Timer;
00090 
00091 public:
00092 
00093    enum timer_type { timer_none, timer_total, timer_db_exec, timer_db_next, timer_db_prepare, timer_cpp_build_hierarchy, 
00094                      timer_cpp_build_instance, timer_cpp_read_instance, timer_build_sql, timer_db_open, timer_db_transaction };
00095 
00096 private:
00097 
00098    struct IxDao_HelperImpl;
00099    std::unique_ptr<IxDao_HelperImpl> m_pImpl; 
00100 
00101 protected:
00102 
00103    IxDao_Helper(qx::IxSqlQueryBuilder * pBuilder, const qx::QxSqlQuery * pQuery = NULL);
00104    virtual ~IxDao_Helper();
00105 
00106 public:
00107 
00108    bool isValid() const;
00109    bool hasFeature(QSqlDriver::DriverFeature ft) const;
00110 
00111    QSqlDatabase & database();
00112    const QSqlDatabase & database() const;
00113    QSqlQuery & query();
00114    const QSqlQuery & query() const;
00115    QSqlError & error();
00116    const QSqlError & error() const;
00117    qx::QxSqlQuery & qxQuery();
00118    const qx::QxSqlQuery & qxQuery() const;
00119    qx::IxSqlQueryBuilder & builder();
00120    const qx::IxSqlQueryBuilder & builder() const;
00121    qx::IxDataMemberX * getDataMemberX() const;
00122    long getDataCount() const;
00123    qx::IxDataMember * getDataId() const;
00124    qx::IxDataMember * nextData(long & l) const;
00125    QString sql() const;
00126    qx::QxSqlRelationLinked * getSqlRelationLinked() const;
00127    qx::QxSession * getSession() const;
00128    QString getIgnoreSoftDeleteHash() const;
00129    bool getCartesianProduct() const;
00130    QStringList getSqlColumns() const;
00131    void setSqlColumns(const QStringList & lst);
00132    IxSqlGenerator * getSqlGenerator() const;
00133    void addInvalidValues(const qx::QxInvalidValueX & lst);
00134    bool getAddAutoIncrementIdToUpdateQuery() const;
00135    QStringList & itemsAsJson();
00136    bool isReadOnly() const;
00137    bool isMongoDB() const;
00138 
00139    QSqlError errFailed(bool bPrepare = false);
00140    QSqlError errEmpty();
00141    QSqlError errNoData();
00142    QSqlError errInvalidId();
00143    QSqlError errInvalidRelation();
00144    QSqlError errReadOnly();
00145 
00146    bool transaction();
00147    bool nextRecord();
00148    void quiet();
00149    bool exec(bool bForceEmptyExec = false);
00150    bool prepare(QString & sql);
00151 
00152    QSqlError updateError(const QSqlError & error);
00153    bool updateSqlRelationX(const QStringList & relation);
00154    void addQuery(bool bResolve);
00155    void dumpRecord() const;
00156 
00157    template <class U>
00158    inline bool isValidPrimaryKey(const U & u)
00159    { return (getDataId() && qx::trait::is_valid_primary_key(getDataId()->toVariant((& u), -1, qx::cvt::context::e_database))); }
00160 
00161    template <class U>
00162    inline void updateLastInsertId(U & u)
00163    {
00164       if (getDataId() && getDataId()->getAutoIncrement() && this->hasFeature(QSqlDriver::LastInsertId))
00165       { getDataId()->fromVariant((& u), query().lastInsertId(), -1, qx::cvt::context::e_database); }
00166    }
00167 
00168    template <class U>
00169    inline bool validateInstance(U & u)
00170    {
00171       qx::QxInvalidValueX invalidValues = qx::validate(u, "");
00172       this->addInvalidValues(invalidValues);
00173       return (invalidValues.count() <= 0);
00174    }
00175 
00176 protected:
00177 
00178    void dumpBoundValues() const;
00179    QSqlError updateError(const QString & sError);
00180    void timerStart(IxDao_Helper::timer_type timer);
00181    qint64 timerElapsed(IxDao_Helper::timer_type timer);
00182    void init(QSqlDatabase * pDatabase, const QString & sContext);
00183    void terminate();
00184 
00185 };
00186 
00191 struct IxDao_Timer
00192 {
00193 
00194    IxDao_Helper * m_pDaoHelper;              
00195    IxDao_Helper::timer_type m_eTimerType;    
00196 
00197    IxDao_Timer(IxDao_Helper * pDaoHelper, IxDao_Helper::timer_type timer) : m_pDaoHelper(pDaoHelper), m_eTimerType(timer) { if (m_pDaoHelper) { m_pDaoHelper->timerStart(m_eTimerType); } }
00198    ~IxDao_Timer() { if (m_pDaoHelper) { m_pDaoHelper->timerElapsed(m_eTimerType); } }
00199 
00200 };
00201 
00202 } // namespace detail
00203 } // namespace dao
00204 } // namespace qx
00205 
00206 #endif // _IX_DAO_HELPER_H_