QxOrm  1.2.3
C++ Object Relational Mapping library
IxPersistable.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 _IX_PERSISTABLE_H_
00027 #define _IX_PERSISTABLE_H_
00028 
00029 #ifdef _MSC_VER
00030 #pragma once
00031 #endif
00032 
00040 #include <QxDao/QxSqlQuery.h>
00041 #include <QxDao/QxDao.h>
00042 
00043 #include <QxRegister/QxClass.h>
00044 
00045 #include <QxCollection/QxCollection.h>
00046 
00047 #include <QxTraits/get_primary_key.h>
00048 
00049 #include <QxValidator/QxInvalidValueX.h>
00050 #include <QxValidator/QxValidatorFct.h>
00051 
00052 namespace qx {
00053 
00072 class QX_DLL_EXPORT IxPersistable
00073 {
00074 
00075 public:
00076 
00077    IxPersistable();
00078    virtual ~IxPersistable();
00079 
00089    virtual long qxCount(const qx::QxSqlQuery & query = qx::QxSqlQuery(), QSqlDatabase * pDatabase = NULL) = 0;
00090 
00103    virtual QSqlError qxFetchById(const QVariant & id = QVariant(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00104 
00118    virtual QSqlError qxFetchAll(qx::IxCollection & list, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00119 
00134    virtual QSqlError qxFetchByQuery(const qx::QxSqlQuery & query, qx::IxCollection & list, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00135 
00146    virtual QSqlError qxInsert(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00147 
00160    virtual QSqlError qxUpdate(const qx::QxSqlQuery & query = qx::QxSqlQuery(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00161 
00174    virtual QSqlError qxSave(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00175 
00189    virtual QSqlError qxDeleteById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL) = 0;
00190 
00203    virtual QSqlError qxDeleteAll(QSqlDatabase * pDatabase = NULL) = 0;
00204 
00218    virtual QSqlError qxDeleteByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL) = 0;
00219 
00230    virtual QSqlError qxDestroyById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL) = 0;
00231 
00241    virtual QSqlError qxDestroyAll(QSqlDatabase * pDatabase = NULL) = 0;
00242 
00253    virtual QSqlError qxDestroyByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL) = 0;
00254 
00265    virtual qx_bool qxExist(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL) = 0;
00266 
00274    virtual qx::QxInvalidValueX qxValidate(const QStringList & groups = QStringList()) = 0;
00275 
00280    virtual qx::IxCollection_ptr qxNewPersistableCollection() const = 0;
00281 
00286    virtual qx::IxClass * qxClass() const = 0;
00287 
00288 public:
00289 
00290    static qx::IxCollection_ptr qxFetchAll(const QString & className, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL);
00291    static qx::IxCollection_ptr qxFetchByQuery(const QString & className, const qx::QxSqlQuery & query, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL);
00292 
00293 };
00294 
00295 typedef boost::shared_ptr<qx::IxPersistable> IxPersistable_ptr;
00296 
00301 template <typename T>
00302 class IxPersistableCollection
00303 {
00304 
00305 private:
00306 
00307    typedef typename qx::trait::get_primary_key<T>::type qx_type_primary_key;
00308    typedef boost::shared_ptr<T> qx_type_ptr;
00309 
00310 public:
00311 
00312    typedef qx::QxCollection<qx_type_primary_key, qx_type_ptr> type;
00313 
00314 };
00315 
00316 } // namespace qx
00317 
00318 #define QX_PERSISTABLE_HPP(className) \
00319 public: \
00320 virtual long qxCount(const qx::QxSqlQuery & query = qx::QxSqlQuery(), QSqlDatabase * pDatabase = NULL); \
00321 virtual QSqlError qxFetchById(const QVariant & id = QVariant(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00322 virtual QSqlError qxFetchAll(qx::IxCollection & list, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00323 virtual QSqlError qxFetchByQuery(const qx::QxSqlQuery & query, qx::IxCollection & list, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00324 virtual QSqlError qxInsert(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00325 virtual QSqlError qxUpdate(const qx::QxSqlQuery & query = qx::QxSqlQuery(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00326 virtual QSqlError qxSave(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00327 virtual QSqlError qxDeleteById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL); \
00328 virtual QSqlError qxDeleteAll(QSqlDatabase * pDatabase = NULL); \
00329 virtual QSqlError qxDeleteByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL); \
00330 virtual QSqlError qxDestroyById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL); \
00331 virtual QSqlError qxDestroyAll(QSqlDatabase * pDatabase = NULL); \
00332 virtual QSqlError qxDestroyByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL); \
00333 virtual qx_bool qxExist(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL); \
00334 virtual qx::QxInvalidValueX qxValidate(const QStringList & groups = QStringList()); \
00335 virtual qx::IxCollection_ptr qxNewPersistableCollection() const; \
00336 virtual qx::IxClass * qxClass() const;
00337 
00338 #define QX_PERSISTABLE_CPP(className) \
00339 \
00340 long className::qxCount(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase) \
00341 { \
00342    return qx::dao::count< className >(query, pDatabase); \
00343 } \
00344 \
00345 QSqlError className::qxFetchById(const QVariant & id, const QStringList & columns, const QStringList & relation, QSqlDatabase * pDatabase) \
00346 { \
00347    if (id.isValid()) \
00348    { \
00349       qx::IxDataMemberX * pDataMemberX = qx::QxClass< className >::getSingleton()->getDataMemberX(); \
00350       qx::IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); \
00351       if (! pDataMemberId) { qDebug("[QxOrm] problem with 'qxFetchById()' method : '%s'", "data member id not registered"); qAssert(false); } \
00352       if (! pDataMemberId) { return QSqlError("[QxOrm] problem with 'qxFetchById()' method : 'data member id not registered'", "", QSqlError::UnknownError); } \
00353       pDataMemberId->fromVariant(this, id); \
00354    } \
00355    QSqlError err; \
00356    if (relation.count() == 0) { err = qx::dao::fetch_by_id((* this), pDatabase, columns); } \
00357    else { err = qx::dao::fetch_by_id_with_relation(relation, (* this), pDatabase); } \
00358    return err; \
00359 } \
00360 \
00361 QSqlError className::qxFetchAll(qx::IxCollection & list, const QStringList & columns, const QStringList & relation, QSqlDatabase * pDatabase) \
00362 { \
00363    qx::IxPersistableCollection< className >::type * list_typed = dynamic_cast< qx::IxPersistableCollection< className >::type * >(& list); \
00364    if (! list_typed) { qDebug("[QxOrm] problem with 'qxFetchAll()' method : '%s'", "dynamic_cast failed using collection qx::QxCollection< type_primary_key, boost::shared_ptr<type> >"); qAssert(false); } \
00365    if (! list_typed) { return QSqlError("[QxOrm] problem with 'qxFetchAll()' method : 'dynamic_cast failed using collection qx::QxCollection< type_primary_key, boost::shared_ptr<type> >'", "", QSqlError::UnknownError); } \
00366    QSqlError err; \
00367    if (relation.count() == 0) { err = qx::dao::fetch_all((* list_typed), pDatabase, columns); } \
00368    else { err = qx::dao::fetch_all_with_relation(relation, (* list_typed), pDatabase); } \
00369    return err; \
00370 } \
00371 \
00372 QSqlError className::qxFetchByQuery(const qx::QxSqlQuery & query, qx::IxCollection & list, const QStringList & columns, const QStringList & relation, QSqlDatabase * pDatabase) \
00373 { \
00374    qx::IxPersistableCollection< className >::type * list_typed = dynamic_cast< qx::IxPersistableCollection< className >::type * >(& list); \
00375    if (! list_typed) { qDebug("[QxOrm] problem with 'qxFetchByQuery()' method : '%s'", "dynamic_cast failed using collection qx::QxCollection< type_primary_key, boost::shared_ptr<type> >"); qAssert(false); } \
00376    if (! list_typed) { return QSqlError("[QxOrm] problem with 'qxFetchByQuery()' method : 'dynamic_cast failed using collection qx::QxCollection< type_primary_key, boost::shared_ptr<type> >'", "", QSqlError::UnknownError); } \
00377    QSqlError err; \
00378    if (relation.count() == 0) { err = qx::dao::fetch_by_query(query, (* list_typed), pDatabase, columns); } \
00379    else { err = qx::dao::fetch_by_query_with_relation(relation, query, (* list_typed), pDatabase); } \
00380    return err; \
00381 } \
00382 \
00383 QSqlError className::qxInsert(const QStringList & relation, QSqlDatabase * pDatabase) \
00384 { \
00385    QSqlError err; \
00386    if (relation.count() == 0) { err = qx::dao::insert((* this), pDatabase); } \
00387    else { err = qx::dao::insert_with_relation(relation, (* this), pDatabase); } \
00388    return err; \
00389 } \
00390 \
00391 QSqlError className::qxUpdate(const qx::QxSqlQuery & query, const QStringList & columns, const QStringList & relation, QSqlDatabase * pDatabase) \
00392 { \
00393    QSqlError err; \
00394    if (relation.count() == 0) { err = qx::dao::update_by_query(query, (* this), pDatabase, columns); } \
00395    else { err = qx::dao::update_by_query_with_relation(relation, query, (* this), pDatabase); } \
00396    return err; \
00397 } \
00398 \
00399 QSqlError className::qxSave(const QStringList & relation, QSqlDatabase * pDatabase) \
00400 { \
00401    QSqlError err; \
00402    if (relation.count() == 0) { err = qx::dao::save((* this), pDatabase); } \
00403    else { err = qx::dao::save_with_relation(relation, (* this), pDatabase); } \
00404    return err; \
00405 } \
00406 \
00407 QSqlError className::qxDeleteById(const QVariant & id, QSqlDatabase * pDatabase) \
00408 { \
00409    if (id.isValid()) \
00410    { \
00411       qx::IxDataMemberX * pDataMemberX = qx::QxClass< className >::getSingleton()->getDataMemberX(); \
00412       qx::IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); \
00413       if (! pDataMemberId) { qDebug("[QxOrm] problem with 'qxDeleteById()' method : '%s'", "data member id not registered"); qAssert(false); } \
00414       if (! pDataMemberId) { return QSqlError("[QxOrm] problem with 'qxDeleteById()' method : 'data member id not registered'", "", QSqlError::UnknownError); } \
00415       pDataMemberId->fromVariant(this, id); \
00416    } \
00417    return qx::dao::delete_by_id((* this), pDatabase); \
00418 } \
00419 \
00420 QSqlError className::qxDeleteAll(QSqlDatabase * pDatabase) \
00421 { \
00422    return qx::dao::delete_all< className >(pDatabase); \
00423 } \
00424 \
00425 QSqlError className::qxDeleteByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase) \
00426 { \
00427    return qx::dao::delete_by_query< className >(query, pDatabase); \
00428 } \
00429 \
00430 QSqlError className::qxDestroyById(const QVariant & id, QSqlDatabase * pDatabase) \
00431 { \
00432    if (id.isValid()) \
00433    { \
00434       qx::IxDataMemberX * pDataMemberX = qx::QxClass< className >::getSingleton()->getDataMemberX(); \
00435       qx::IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); \
00436       if (! pDataMemberId) { qDebug("[QxOrm] problem with 'qxDestroyById()' method : '%s'", "data member id not registered"); qAssert(false); } \
00437       if (! pDataMemberId) { return QSqlError("[QxOrm] problem with 'qxDestroyById()' method : 'data member id not registered'", "", QSqlError::UnknownError); } \
00438       pDataMemberId->fromVariant(this, id); \
00439    } \
00440    return qx::dao::destroy_by_id((* this), pDatabase); \
00441 } \
00442 \
00443 QSqlError className::qxDestroyAll(QSqlDatabase * pDatabase) \
00444 { \
00445    return qx::dao::destroy_all< className >(pDatabase); \
00446 } \
00447 \
00448 QSqlError className::qxDestroyByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase) \
00449 { \
00450    return qx::dao::destroy_by_query< className >(query, pDatabase); \
00451 } \
00452 \
00453 qx_bool className::qxExist(const QVariant & id, QSqlDatabase * pDatabase) \
00454 { \
00455    if (id.isValid()) \
00456    { \
00457       qx::IxDataMemberX * pDataMemberX = qx::QxClass< className >::getSingleton()->getDataMemberX(); \
00458       qx::IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); \
00459       if (! pDataMemberId) { qDebug("[QxOrm] problem with 'qxExist()' method : '%s'", "data member id not registered"); qAssert(false); } \
00460       if (! pDataMemberId) { return qx_bool(false); } \
00461       pDataMemberId->fromVariant(this, id); \
00462    } \
00463    return qx::dao::exist((* this), pDatabase); \
00464 } \
00465 \
00466 qx::QxInvalidValueX className::qxValidate(const QStringList & groups) \
00467 { \
00468    return qx::validate((* this), groups); \
00469 } \
00470 \
00471 qx::IxCollection_ptr className::qxNewPersistableCollection() const \
00472 { \
00473    qx::IxCollection_ptr coll; \
00474    coll.reset(new qx::IxPersistableCollection< className >::type()); \
00475    return coll; \
00476 } \
00477 \
00478 qx::IxClass * className::qxClass() const \
00479 { \
00480    return qx::QxClass< className >::getSingleton(); \
00481 } \
00482 
00483 #endif // _IX_PERSISTABLE_H_