32#ifndef _QX_REPOSITORY_H_
33#define _QX_REPOSITORY_H_
59#define QX_REPOSITORY_COLLECTION_DYNAMIC_CAST_ERROR QSqlError("[QxOrm] qx::QxRepository<T> : 'invalid collection pointer, dynamic_cast failed'", "", QSqlError::UnknownError)
60#define QX_REPOSITORY_POINTER_DYNAMIC_CAST_ERROR QSqlError("[QxOrm] qx::QxRepository<T> : 'invalid pointer, dynamic_cast failed'", "", QSqlError::UnknownError)
61#define QX_REPOSITORY_QOBJECT_BASE_CLASS_ERROR QSqlError("[QxOrm] qx::QxRepository<T> : 'invalid pointer, need to inherit from QObject class to use qx::IxRepository interface'", "", QSqlError::UnknownError)
64#define QX_REPOSITORY_CAST_COLLECTION \
65type_collection_qt * x = dynamic_cast<type_collection_qt *>(p); \
66type_collection_boost * y = (x ? NULL : dynamic_cast<type_collection_boost *>(p)); \
67if (! x && ! y) { throw qx::dao::sql_error(QX_REPOSITORY_COLLECTION_DYNAMIC_CAST_ERROR); }
69#define QX_REPOSITORY_CAST_COLLECTION \
70type_collection_qt * x = NULL; \
71type_collection_boost * y = static_cast<type_collection_boost *>(p);
104 T *
fetchById(
const QVariant &
id,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
108 if (! pDataMemberId) {
qAssert(
false);
return NULL; }
109 T * t =
new T(); QSqlError err;
113 if (err.isValid() &&
m_pSession) {
delete t; t = NULL; (* m_pSession) += err; }
114 else if (err.isValid()) {
delete t; t = NULL; }
119 QSqlError
fetchById(U & u,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
124 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
129 QSqlError
fetchAll(U & u,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
134 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
139 QSqlError
fetchByQuery(
const qx::QxSqlQuery & query, U & u,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
144 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
149 QSqlError
insert(U & u,
const QStringList & relation = QStringList(),
bool bUseExecBatch =
false)
154 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
159 QSqlError
update(U & u,
const qx::QxSqlQuery & query =
qx::QxSqlQuery(),
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList(),
bool bUseExecBatch =
false)
164 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
169 QSqlError
save(U & u,
const QStringList & relation = QStringList())
174 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
182 if (! pDataMemberId) {
qAssert(
false);
return QSqlError(); }
183 std::shared_ptr<T> t = std::make_shared<T>();
186 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
194 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
201 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
208 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
216 if (! pDataMemberId) {
qAssert(
false);
return QSqlError(); }
217 std::shared_ptr<T> t = std::make_shared<T>();
220 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
228 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
235 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
242 if (err.isValid() &&
m_pSession) { (* m_pSession) += err; }
256 template <
bool bIsQObject ,
int dummy>
271 {
return this->
count(query); }
273 virtual void *
_fetchById(
const QVariant &
id,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
274 {
return static_cast<void *
>(this->
fetchById(
id, columns, relation)); }
276 virtual QSqlError
_fetchById(QObject * p,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
279 return this->
fetchById((* t), columns, relation);
282 virtual QSqlError
_fetchById(
qx::IxCollection * p,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
285 return (x ? this->
fetchById((* x), columns, relation) : this->
fetchById((* y), columns, relation));
288 virtual QSqlError
_fetchAll(QObject * p,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
291 return this->
fetchAll((* t), columns, relation);
294 virtual QSqlError
_fetchAll(
qx::IxCollection * p,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
297 return (x ? this->
fetchAll((* x), columns, relation) : this->
fetchAll((* y), columns, relation));
300 virtual QSqlError
_fetchByQuery(
const qx::QxSqlQuery & query, QObject * p,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
303 return this->
fetchByQuery(query, (* t), columns, relation);
309 return (x ? this->
fetchByQuery(query, (* x), columns, relation) : this->
fetchByQuery(query, (* y), columns, relation));
312 virtual QSqlError
_insert(QObject * p,
const QStringList & relation = QStringList())
315 return this->
insert((* t), relation);
321 return (x ? this->
insert((* x), relation) : this->
insert((* y), relation));
327 return this->
update((* t), query, columns, relation);
333 return (x ? this->
update((* x), query, columns, relation) : this->
update((* y), query, columns, relation));
336 virtual QSqlError
_save(QObject * p,
const QStringList & relation = QStringList())
339 return this->
save((* t), relation);
345 return (x ? this->
save((* x), relation) : this->
save((* y), relation));
393 return this->
exist(* t);
399 return (x ? this->
exist(* x) : this->
exist(* y));
413 static T *
getById(
const QVariant &
id,
const QStringList & columns = QStringList(),
const QStringList & relation = QStringList())
417 if (! pDataMemberId) {
qAssert(
false);
return NULL; }
418 T * t =
new T(); QSqlError err;
422 if (err.isValid()) {
delete t; t = NULL; }
433 Q_UNUSED(pNewRepository);
Common interface for all repositories to provide access to database by introspection using QObject cl...
Concrete class registered into QxOrm context.
QxOrm thread-safe container (keep insertion order + quick access by index + quick access by key)
Provide template functions to map C++ class registered into QxOrm context with table database (ORM - ...
#define QX_REPOSITORY_CAST_COLLECTION
#define QX_REPOSITORY_QOBJECT_BASE_CLASS_ERROR
#define QX_REPOSITORY_POINTER_DYNAMIC_CAST_ERROR
List of all repositories registered using qx::register_repository<T> function.
Define a session to manage automatically database transactions (using C++ RAII)
Define a SQL error exception and retrieve QSqlError type of Qt library.
qx::IxClass : common interface for all classes registered into QxOrm context
qx::IxCollection : common interface for all QxOrm containers qx::QxCollection<Key,...
qx::IxDataMember : common interface for all class properties registered into QxOrm context
virtual qx_bool fromVariant(void *pOwner, const QVariant &v, const QString &sFormat, int iIndexName=-1, qx::cvt::context::ctx_type ctx=qx::cvt::context::e_no_context)=0
qx::IxDataMemberX : common interface for a list of IxDataMember class properties registered into QxOr...
virtual IxDataMember * getId_WithDaoStrategy() const =0
qx::IxRepository : common interface for all repositories to provide access to database by introspecti...
QSqlDatabase * database()
QxSession * m_pSession
Session associated to the repository.
qx_bool : boolean type with code and description message when an error occured
qx::QxCollection<Key, Value> : QxOrm thread-safe container (keep insertion order + quick access by in...
qx::QxRepository<T> : repository to provide a common interface to communicate with database
virtual qx_bool _exist(QObject *p)
virtual QSqlError _deleteByQuery(const qx::QxSqlQuery &query)
virtual QSqlError _fetchByQuery(const qx::QxSqlQuery &query, qx::IxCollection *p, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
QxRepository(const QString &sKey)
qx::QxCollection< type_primary_key, std::shared_ptr< T > > type_collection_boost
virtual long _count(const qx::QxSqlQuery &query=qx::QxSqlQuery())
virtual QSqlError _fetchById(QObject *p, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
virtual qx::IxClass * _getClass() const
virtual QSqlError _update(QObject *p, const qx::QxSqlQuery &query=qx::QxSqlQuery(), const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
T * fetchById(const QVariant &id, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
static T * getById(const QVariant &id, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
QSqlError deleteById(const QVariant &id)
virtual QSqlError _insert(QObject *p, const QStringList &relation=QStringList())
virtual QSqlError _update(qx::IxCollection *p, const qx::QxSqlQuery &query=qx::QxSqlQuery(), const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
virtual QSqlError _fetchByQuery(const qx::QxSqlQuery &query, QObject *p, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
virtual qx::IxCollection_ptr _newCollection() const
virtual QSqlError _destroyAll()
virtual QSqlError _save(QObject *p, const QStringList &relation=QStringList())
friend void register_repository(const QString &sKey)
qx::trait::get_primary_key< T >::type type_primary_key
virtual QSqlError _destroyById(const QVariant &id)
QSqlError deleteByQuery(const qx::QxSqlQuery &query)
QxRepository(QxSession *pSession)
QSqlError insert(U &u, const QStringList &relation=QStringList(), bool bUseExecBatch=false)
virtual QSqlError _deleteById(qx::IxCollection *p)
virtual void * _fetchById(const QVariant &id, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
QSqlError save(U &u, const QStringList &relation=QStringList())
QSqlError fetchByQuery(const qx::QxSqlQuery &query, U &u, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
qx::QxCollection< type_primary_key, QSharedPointer< T > > type_collection_qt
virtual QSqlError _destroyById(QObject *p)
QxRepository(const QSqlDatabase &database)
QSqlError update(U &u, const qx::QxSqlQuery &query=qx::QxSqlQuery(), const QStringList &columns=QStringList(), const QStringList &relation=QStringList(), bool bUseExecBatch=false)
QSqlError destroyById(const QVariant &id)
virtual QSqlError _fetchAll(qx::IxCollection *p, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
virtual QSqlError _insert(qx::IxCollection *p, const QStringList &relation=QStringList())
long count(const qx::QxSqlQuery &query=qx::QxSqlQuery())
virtual QSqlError _save(qx::IxCollection *p, const QStringList &relation=QStringList())
virtual QSqlError _deleteById(QObject *p)
QSqlError deleteById(U &u, bool bUseExecBatch=false)
QSqlError fetchById(U &u, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
virtual QSqlError _fetchById(qx::IxCollection *p, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
QSqlError destroyByQuery(const qx::QxSqlQuery &query)
QSqlError destroyById(U &u, bool bUseExecBatch=false)
virtual qx_bool _exist(qx::IxCollection *p)
virtual QSqlError _deleteAll()
virtual QSqlError _destroyById(qx::IxCollection *p)
QSqlError fetchAll(U &u, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
virtual QSqlError _fetchAll(QObject *p, const QStringList &columns=QStringList(), const QStringList &relation=QStringList())
virtual QSqlError _destroyByQuery(const qx::QxSqlQuery &query)
virtual QSqlError _deleteById(const QVariant &id)
qx::QxSession : define a session to manage automatically database transactions (using C++ RAII)
static T * getSingleton()
qx::QxSqlQuery : define a user SQL query added to default SQL query builded by QxOrm library,...
qx::dao::sql_error : define a SQL error exception and retrieve QSqlError type of Qt library
qx::trait::get_primary_key<T>::type : return primary key type of T, by default primary key is long ty...
QSqlError destroy_all(QSqlDatabase *pDatabase=NULL)
Destroy all lines of a table (database) mapped to a C++ class T (registered into QxOrm context),...
QSqlError save(T &t, QSqlDatabase *pDatabase=NULL)
Insert (if no exist) or update (if already exist) an element or a list of elements into database.
QSqlError fetch_by_id(T &t, QSqlDatabase *pDatabase=NULL, const QStringList &columns=QStringList())
Fetch an object t (retrieve all its properties) of type T (registered into QxOrm context) mapped to a...
QSqlError fetch_by_query_with_relation(const QString &relation, const qx::QxSqlQuery &query, T &t, QSqlDatabase *pDatabase=NULL)
Fetch a list of objects (retrieve all elements and properties associated) of type T (container regist...
QSqlError fetch_by_id_with_relation(const QString &relation, T &t, QSqlDatabase *pDatabase=NULL)
Fetch an object t (retrieve all its properties) of type T (registered into QxOrm context) mapped to a...
QSqlError delete_by_id(T &t, QSqlDatabase *pDatabase=NULL, bool bUseExecBatch=false)
Delete a line (or list of lines) of a table (database) mapped to a C++ object of type T (registered i...
qx_bool exist(T &t, QSqlDatabase *pDatabase=NULL)
Search if an element (or list of elements) already exists into database.
QSqlError save_with_relation(const QString &relation, T &t, QSqlDatabase *pDatabase=NULL)
Insert (if no exist) or update (if already exist) an element and its relationships (or a list of elem...
QSqlError insert_with_relation(const QString &relation, T &t, QSqlDatabase *pDatabase=NULL)
Insert an element and its relationships (or a list of elements + relationships) into database.
QSqlError insert(T &t, QSqlDatabase *pDatabase=NULL, bool bUseExecBatch=false)
Insert an element or a list of elements into database.
QSqlError destroy_by_query(const qx::QxSqlQuery &query, QSqlDatabase *pDatabase=NULL)
Destroy all lines of a table (database) mapped to a C++ class T (registered into QxOrm context) and f...
QSqlError delete_all(QSqlDatabase *pDatabase=NULL)
Delete all lines of a table (database) mapped to a C++ class T (registered into QxOrm context)
QSqlError update_by_query(const qx::QxSqlQuery &query, T &t, QSqlDatabase *pDatabase=NULL, const QStringList &columns=QStringList(), bool bUseExecBatch=false)
Update an element or a list of elements into database (adding a user SQL query to the default SQL que...
QSqlError fetch_by_query(const qx::QxSqlQuery &query, T &t, QSqlDatabase *pDatabase=NULL, const QStringList &columns=QStringList())
Fetch a list of objects (retrieve all elements and properties associated) of type T (container regist...
QSqlError update_by_query_with_relation(const QString &relation, const qx::QxSqlQuery &query, T &t, QSqlDatabase *pDatabase=NULL)
Update an element and its relationships (or a list of elements + relationships) into database (adding...
QSqlError fetch_all(T &t, QSqlDatabase *pDatabase=NULL, const QStringList &columns=QStringList())
Fetch a list of objects (retrieve all elements and properties associated) of type T (container regist...
QSqlError delete_by_query(const qx::QxSqlQuery &query, QSqlDatabase *pDatabase=NULL)
Delete all lines of a table (database) mapped to a C++ class T (registered into QxOrm context) and fi...
QSqlError fetch_all_with_relation(const QString &relation, T &t, QSqlDatabase *pDatabase=NULL)
Fetch a list of objects (retrieve all elements and properties associated) of type T (container regist...
long count(const qx::QxSqlQuery &query=qx::QxSqlQuery(), QSqlDatabase *pDatabase=NULL)
Return the number of lines in the table (database) mapped to the C++ class T (registered into QxOrm c...
QSqlError destroy_by_id(T &t, QSqlDatabase *pDatabase=NULL, bool bUseExecBatch=false)
Destroy a line (or list of lines) of a table (database) mapped to a C++ object of type T (registered ...
Root namespace for all QxOrm library features.
void register_repository(const QString &sKey)
std::shared_ptr< qx::IxCollection > IxCollection_ptr
static T * get(QObject *p)
static T * get(QObject *p)