QxOrm  1.4.5
C++ Object Relational Mapping library
IxPersistable.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_PERSISTABLE_H_
00033 #define _IX_PERSISTABLE_H_
00034 
00035 #ifdef _MSC_VER
00036 #pragma once
00037 #endif
00038 
00046 #include <QxDao/QxSqlQuery.h>
00047 #include <QxDao/QxDao.h>
00048 
00049 #include <QxRegister/QxClass.h>
00050 
00051 #include <QxCollection/QxCollection.h>
00052 
00053 #include <QxValidator/QxInvalidValueX.h>
00054 #include <QxValidator/QxValidatorFct.h>
00055 
00056 #include <QxTraits/get_class_name.h>
00057 
00058 namespace qx {
00059 
00060 class IxPersistableCollection;
00061 
00080 class QX_DLL_EXPORT IxPersistable
00081 {
00082 
00083 public:
00084 
00085    IxPersistable();
00086    virtual ~IxPersistable();
00087 
00097    virtual long qxCount(const qx::QxSqlQuery & query = qx::QxSqlQuery(), QSqlDatabase * pDatabase = NULL) = 0;
00098 
00109    virtual QSqlError qxCount(long & lCount, const qx::QxSqlQuery & query = qx::QxSqlQuery(), QSqlDatabase * pDatabase = NULL) = 0;
00110 
00123    virtual QSqlError qxFetchById(const QVariant & id = QVariant(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00124 
00138    virtual QSqlError qxFetchAll(qx::IxPersistableCollection * list = NULL, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00139 
00154    virtual QSqlError qxFetchByQuery(const qx::QxSqlQuery & query, qx::IxPersistableCollection * list = NULL, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00155 
00166    virtual QSqlError qxInsert(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00167 
00180    virtual QSqlError qxUpdate(const qx::QxSqlQuery & query = qx::QxSqlQuery(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00181 
00194    virtual QSqlError qxSave(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
00195 
00209    virtual QSqlError qxDeleteById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL) = 0;
00210 
00223    virtual QSqlError qxDeleteAll(QSqlDatabase * pDatabase = NULL) = 0;
00224 
00238    virtual QSqlError qxDeleteByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL) = 0;
00239 
00250    virtual QSqlError qxDestroyById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL) = 0;
00251 
00261    virtual QSqlError qxDestroyAll(QSqlDatabase * pDatabase = NULL) = 0;
00262 
00273    virtual QSqlError qxDestroyByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL) = 0;
00274 
00281    virtual QSqlError qxExecuteQuery(qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL) = 0;
00282 
00290    virtual QSqlError qxExecuteQuery(qx::QxSqlQuery & query, qx::IxPersistableCollection * list = NULL, QSqlDatabase * pDatabase = NULL) = 0;
00291 
00302    virtual qx_bool qxExist(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL) = 0;
00303 
00311    virtual qx::QxInvalidValueX qxValidate(const QStringList & groups = QStringList()) = 0;
00312 
00317    virtual std::shared_ptr<qx::IxPersistableCollection> qxNewPersistableCollection() const = 0;
00318 
00323    virtual qx::IxClass * qxClass() const = 0;
00324 
00325 #ifndef _QX_NO_JSON
00326    virtual QString toJson(const QString & format = QString()) const = 0;
00327    virtual qx_bool fromJson(const QString & json, const QString & format = QString()) = 0;
00328 #endif // _QX_NO_JSON
00329 
00330 public:
00331 
00332    static std::shared_ptr<qx::IxPersistableCollection> qxFetchAll(const QString & className, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL);
00333    static std::shared_ptr<qx::IxPersistableCollection> qxFetchByQuery(const QString & className, const qx::QxSqlQuery & query, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL);
00334    static std::shared_ptr<qx::IxPersistableCollection> qxExecuteQuery(const QString & className, qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL);
00335 
00336 };
00337 
00338 typedef std::shared_ptr<qx::IxPersistable> IxPersistable_ptr;
00339 
00340 } // namespace qx
00341 
00342 namespace qx {
00343 namespace trait {
00344 
00349 template <typename T>
00350 struct is_ix_persistable
00351 { enum { value = std::is_base_of<qx::IxPersistable, T>::value }; };
00352 
00353 } // namespace trait
00354 } // namespace qx
00355 
00356 #ifndef _QX_NO_JSON
00357 #define QX_PERSISTABLE_JSON_HPP(className) \
00358 virtual QString toJson(const QString & format = QString()) const; \
00359 virtual qx_bool fromJson(const QString & json, const QString & format = QString());
00360 #else // _QX_NO_JSON
00361 #define QX_PERSISTABLE_JSON_HPP(className) /* Nothing */
00362 #endif // _QX_NO_JSON
00363 
00364 #define QX_PERSISTABLE_HPP(className) \
00365 public: \
00366 virtual long qxCount(const qx::QxSqlQuery & query = qx::QxSqlQuery(), QSqlDatabase * pDatabase = NULL); \
00367 virtual QSqlError qxCount(long & lCount, const qx::QxSqlQuery & query = qx::QxSqlQuery(), QSqlDatabase * pDatabase = NULL); \
00368 virtual QSqlError qxFetchById(const QVariant & id = QVariant(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00369 virtual QSqlError qxFetchAll(qx::IxPersistableCollection * list = NULL, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00370 virtual QSqlError qxFetchByQuery(const qx::QxSqlQuery & query, qx::IxPersistableCollection * list = NULL, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00371 virtual QSqlError qxInsert(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00372 virtual QSqlError qxUpdate(const qx::QxSqlQuery & query = qx::QxSqlQuery(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00373 virtual QSqlError qxSave(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL); \
00374 virtual QSqlError qxDeleteById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL); \
00375 virtual QSqlError qxDeleteAll(QSqlDatabase * pDatabase = NULL); \
00376 virtual QSqlError qxDeleteByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL); \
00377 virtual QSqlError qxDestroyById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL); \
00378 virtual QSqlError qxDestroyAll(QSqlDatabase * pDatabase = NULL); \
00379 virtual QSqlError qxDestroyByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL); \
00380 virtual QSqlError qxExecuteQuery(qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL); \
00381 virtual QSqlError qxExecuteQuery(qx::QxSqlQuery & query, qx::IxPersistableCollection * list = NULL, QSqlDatabase * pDatabase = NULL); \
00382 virtual qx_bool qxExist(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL); \
00383 virtual qx::QxInvalidValueX qxValidate(const QStringList & groups = QStringList()); \
00384 virtual std::shared_ptr<qx::IxPersistableCollection> qxNewPersistableCollection() const; \
00385 virtual qx::IxClass * qxClass() const; \
00386 QX_PERSISTABLE_JSON_HPP(className)
00387 
00388 #ifdef _QX_NO_RTTI
00389 #define QX_PERSISTABLE_CAST_COLLECTION(className) \
00390 if (! list) { return QSqlError(); } \
00391 qx::QxPersistableCollectionHelper< className >::type_coll * list_typed = static_cast< qx::QxPersistableCollectionHelper< className >::type * >(list);
00392 #else // _QX_NO_RTTI
00393 #define QX_PERSISTABLE_CAST_COLLECTION(className) \
00394 if (! list) { return QSqlError(); } \
00395 qx::QxPersistableCollectionHelper< className >::type_coll * list_typed = dynamic_cast< qx::QxPersistableCollectionHelper< className >::type * >(list);
00396 #endif // _QX_NO_RTTI
00397 
00398 #ifndef _QX_NO_JSON
00399 #define QX_PERSISTABLE_JSON_CPP(className) \
00400 QString className::toJson(const QString & format) const { return qx::serialization::json::to_string((* this), 1, format); } \
00401 qx_bool className::fromJson(const QString & json, const QString & format) { return qx::serialization::json::from_string((* this), json, 1, format); }
00402 #else // _QX_NO_JSON
00403 #define QX_PERSISTABLE_JSON_CPP(className) /* Nothing */
00404 #endif // _QX_NO_JSON
00405 
00406 #define QX_PERSISTABLE_CPP(className) \
00407 \
00408 long className::qxCount(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase) \
00409 { \
00410    return qx::dao::count< className >(query, pDatabase); \
00411 } \
00412 \
00413 QSqlError className::qxCount(long & lCount, const qx::QxSqlQuery & query, QSqlDatabase * pDatabase) \
00414 { \
00415    return qx::dao::count< className >(lCount, query, pDatabase); \
00416 } \
00417 \
00418 QSqlError className::qxFetchById(const QVariant & id, const QStringList & columns, const QStringList & relation, QSqlDatabase * pDatabase) \
00419 { \
00420    if (id.isValid()) \
00421    { \
00422       qx::IxDataMemberX * pDataMemberX = qx::QxClass< className >::getSingleton()->getDataMemberX(); \
00423       qx::IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); \
00424       if (! pDataMemberId) { qDebug("[QxOrm] problem with 'qxFetchById()' method : '%s'", "data member id not registered"); qAssert(false); } \
00425       if (! pDataMemberId) { return QSqlError("[QxOrm] problem with 'qxFetchById()' method : 'data member id not registered'", "", QSqlError::UnknownError); } \
00426       pDataMemberId->fromVariant(this, id, -1, qx::cvt::context::e_database); \
00427    } \
00428    QSqlError err; \
00429    if (relation.count() == 0) { err = qx::dao::fetch_by_id((* this), pDatabase, columns); } \
00430    else { err = qx::dao::fetch_by_id_with_relation(relation, (* this), pDatabase); } \
00431    return err; \
00432 } \
00433 \
00434 QSqlError className::qxFetchAll(qx::IxPersistableCollection * list, const QStringList & columns, const QStringList & relation, QSqlDatabase * pDatabase) \
00435 { \
00436    QX_PERSISTABLE_CAST_COLLECTION(className) \
00437    if (! list_typed) { qDebug("[QxOrm] problem with 'qxFetchAll()' method : '%s'", "dynamic_cast failed using collection qx::QxCollection< type_primary_key, std::shared_ptr<type> >"); qAssert(false); } \
00438    if (! list_typed) { return QSqlError("[QxOrm] problem with 'qxFetchAll()' method : 'dynamic_cast failed using collection qx::QxCollection< type_primary_key, std::shared_ptr<type> >'", "", QSqlError::UnknownError); } \
00439    QSqlError err; \
00440    if (relation.count() == 0) { err = qx::dao::fetch_all((* list_typed), pDatabase, columns); } \
00441    else { err = qx::dao::fetch_all_with_relation(relation, (* list_typed), pDatabase); } \
00442    return err; \
00443 } \
00444 \
00445 QSqlError className::qxFetchByQuery(const qx::QxSqlQuery & query, qx::IxPersistableCollection * list, const QStringList & columns, const QStringList & relation, QSqlDatabase * pDatabase) \
00446 { \
00447    QX_PERSISTABLE_CAST_COLLECTION(className) \
00448    if (! list_typed) { qDebug("[QxOrm] problem with 'qxFetchByQuery()' method : '%s'", "dynamic_cast failed using collection qx::QxCollection< type_primary_key, std::shared_ptr<type> >"); qAssert(false); } \
00449    if (! list_typed) { return QSqlError("[QxOrm] problem with 'qxFetchByQuery()' method : 'dynamic_cast failed using collection qx::QxCollection< type_primary_key, std::shared_ptr<type> >'", "", QSqlError::UnknownError); } \
00450    QSqlError err; \
00451    if (relation.count() == 0) { err = qx::dao::fetch_by_query(query, (* list_typed), pDatabase, columns); } \
00452    else { err = qx::dao::fetch_by_query_with_relation(relation, query, (* list_typed), pDatabase); } \
00453    return err; \
00454 } \
00455 \
00456 QSqlError className::qxInsert(const QStringList & relation, QSqlDatabase * pDatabase) \
00457 { \
00458    QSqlError err; \
00459    if (relation.count() == 0) { err = qx::dao::insert((* this), pDatabase); } \
00460    else { err = qx::dao::insert_with_relation(relation, (* this), pDatabase); } \
00461    return err; \
00462 } \
00463 \
00464 QSqlError className::qxUpdate(const qx::QxSqlQuery & query, const QStringList & columns, const QStringList & relation, QSqlDatabase * pDatabase) \
00465 { \
00466    QSqlError err; \
00467    if (relation.count() == 0) { err = qx::dao::update_by_query(query, (* this), pDatabase, columns); } \
00468    else { err = qx::dao::update_by_query_with_relation(relation, query, (* this), pDatabase); } \
00469    return err; \
00470 } \
00471 \
00472 QSqlError className::qxSave(const QStringList & relation, QSqlDatabase * pDatabase) \
00473 { \
00474    QSqlError err; \
00475    if (relation.count() == 0) { err = qx::dao::save((* this), pDatabase); } \
00476    else { err = qx::dao::save_with_relation(relation, (* this), pDatabase); } \
00477    return err; \
00478 } \
00479 \
00480 QSqlError className::qxDeleteById(const QVariant & id, QSqlDatabase * pDatabase) \
00481 { \
00482    if (id.isValid()) \
00483    { \
00484       qx::IxDataMemberX * pDataMemberX = qx::QxClass< className >::getSingleton()->getDataMemberX(); \
00485       qx::IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); \
00486       if (! pDataMemberId) { qDebug("[QxOrm] problem with 'qxDeleteById()' method : '%s'", "data member id not registered"); qAssert(false); } \
00487       if (! pDataMemberId) { return QSqlError("[QxOrm] problem with 'qxDeleteById()' method : 'data member id not registered'", "", QSqlError::UnknownError); } \
00488       pDataMemberId->fromVariant(this, id, -1, qx::cvt::context::e_database); \
00489    } \
00490    return qx::dao::delete_by_id((* this), pDatabase); \
00491 } \
00492 \
00493 QSqlError className::qxDeleteAll(QSqlDatabase * pDatabase) \
00494 { \
00495    return qx::dao::delete_all< className >(pDatabase); \
00496 } \
00497 \
00498 QSqlError className::qxDeleteByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase) \
00499 { \
00500    return qx::dao::delete_by_query< className >(query, pDatabase); \
00501 } \
00502 \
00503 QSqlError className::qxDestroyById(const QVariant & id, QSqlDatabase * pDatabase) \
00504 { \
00505    if (id.isValid()) \
00506    { \
00507       qx::IxDataMemberX * pDataMemberX = qx::QxClass< className >::getSingleton()->getDataMemberX(); \
00508       qx::IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); \
00509       if (! pDataMemberId) { qDebug("[QxOrm] problem with 'qxDestroyById()' method : '%s'", "data member id not registered"); qAssert(false); } \
00510       if (! pDataMemberId) { return QSqlError("[QxOrm] problem with 'qxDestroyById()' method : 'data member id not registered'", "", QSqlError::UnknownError); } \
00511       pDataMemberId->fromVariant(this, id, -1, qx::cvt::context::e_database); \
00512    } \
00513    return qx::dao::destroy_by_id((* this), pDatabase); \
00514 } \
00515 \
00516 QSqlError className::qxDestroyAll(QSqlDatabase * pDatabase) \
00517 { \
00518    return qx::dao::destroy_all< className >(pDatabase); \
00519 } \
00520 \
00521 QSqlError className::qxDestroyByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase) \
00522 { \
00523    return qx::dao::destroy_by_query< className >(query, pDatabase); \
00524 } \
00525 \
00526 QSqlError className::qxExecuteQuery(qx::QxSqlQuery & query, QSqlDatabase * pDatabase) \
00527 { \
00528    return qx::dao::execute_query(query, (* this), pDatabase); \
00529 } \
00530 \
00531 QSqlError className::qxExecuteQuery(qx::QxSqlQuery & query, qx::IxPersistableCollection * list, QSqlDatabase * pDatabase) \
00532 { \
00533    QX_PERSISTABLE_CAST_COLLECTION(className) \
00534    if (! list_typed) { qDebug("[QxOrm] problem with 'qxExecuteQuery()' method : '%s'", "dynamic_cast failed using collection qx::QxCollection< type_primary_key, std::shared_ptr<type> >"); qAssert(false); } \
00535    if (! list_typed) { return QSqlError("[QxOrm] problem with 'qxExecuteQuery()' method : 'dynamic_cast failed using collection qx::QxCollection< type_primary_key, std::shared_ptr<type> >'", "", QSqlError::UnknownError); } \
00536    return qx::dao::execute_query(query, (* list_typed), pDatabase); \
00537 } \
00538 \
00539 qx_bool className::qxExist(const QVariant & id, QSqlDatabase * pDatabase) \
00540 { \
00541    if (id.isValid()) \
00542    { \
00543       qx::IxDataMemberX * pDataMemberX = qx::QxClass< className >::getSingleton()->getDataMemberX(); \
00544       qx::IxDataMember * pDataMemberId = (pDataMemberX ? pDataMemberX->getId_WithDaoStrategy() : NULL); \
00545       if (! pDataMemberId) { qDebug("[QxOrm] problem with 'qxExist()' method : '%s'", "data member id not registered"); qAssert(false); } \
00546       if (! pDataMemberId) { return qx_bool(false); } \
00547       pDataMemberId->fromVariant(this, id, -1, qx::cvt::context::e_database); \
00548    } \
00549    return qx::dao::exist((* this), pDatabase); \
00550 } \
00551 \
00552 qx::QxInvalidValueX className::qxValidate(const QStringList & groups) \
00553 { \
00554    return qx::validate((* this), groups); \
00555 } \
00556 \
00557 std::shared_ptr<qx::IxPersistableCollection> className::qxNewPersistableCollection() const \
00558 { \
00559    std::shared_ptr<qx::IxPersistableCollection> coll; \
00560    coll.reset(new qx::QxPersistableCollectionHelper< className >::type()); \
00561    return coll; \
00562 } \
00563 \
00564 qx::IxClass * className::qxClass() const \
00565 { \
00566    return qx::QxClass< className >::getSingleton(); \
00567 } \
00568 \
00569 QX_PERSISTABLE_JSON_CPP(className)
00570 
00571 QX_REGISTER_CLASS_NAME(qx::IxPersistable)
00572 
00573 #include <QxDao/IxPersistableCollection.h>
00574 
00575 #endif // _IX_PERSISTABLE_H_