From f696ffc5c4befcd89f2fe9c05b6e67f6bb38e475 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Sat, 22 Jun 2019 09:49:06 +0430 Subject: [PATCH] working on it --- 3rdparty/serializer | 2 +- src/defines.h | 90 ++++++++++++++++++++---------------- test/common/comment.cpp | 5 ++ test/common/score.cpp | 5 ++ test/tst_basic/tst_basic.cpp | 10 ++-- 5 files changed, 67 insertions(+), 45 deletions(-) diff --git a/3rdparty/serializer b/3rdparty/serializer index b3c550c..f9d81fc 160000 --- a/3rdparty/serializer +++ b/3rdparty/serializer @@ -1 +1 @@ -Subproject commit b3c550c5bb7c570b1b10492fcedf287c1915af39 +Subproject commit f9d81fcc6244271b3926891b0c86554e1e6b967e diff --git a/src/defines.h b/src/defines.h index a547688..50e3cbe 100644 --- a/src/defines.h +++ b/src/defines.h @@ -83,30 +83,40 @@ public: \ } #define NUT_FOREIGN_KEY(type, keytype, name, read, write) \ - Q_PROPERTY(Nut::Row name READ read WRITE write) \ - /*NUT_DECLARE_FIELD(keytype, name##Id, read##Id, write##Id)*/ \ - NUT_INFO(__nut_FOREIGN_KEY, name, type) \ - Nut::ForeignKeyData m_##name; \ -public: \ - Nut::Row read() const { return m_##name.table() ; } \ - void write(Nut::Row name){ \ - m_##name.setTable(name); \ - }\ - \ - Q_PROPERTY(keytype name##Id READ read##Id WRITE write##Id) \ NUT_INFO(__nut_FIELD, name##Id, 0) \ + NUT_INFO(__nut_FOREIGN_KEY, name, type) \ + Nut::Row m_##name; \ + keytype m_##name##Id; \ + Q_PROPERTY(keytype name##Id READ read##Id WRITE write##Id) \ public: \ + Nut::Row read() const; \ + void write(Nut::Row name); \ static NUT_WRAP_NAMESPACE(FieldPhrase)& name##Id ## Field(){ \ static NUT_WRAP_NAMESPACE(FieldPhrase) f = \ NUT_WRAP_NAMESPACE(FieldPhrase) \ (staticMetaObject.className(), #name); \ return f; \ } \ - keytype read##Id() const{ \ - return m_##name.value(); \ + keytype read##Id() const; \ + void write##Id(keytype name##Id); + +#define NUT_FOREIGN_KEY_IMPLEMENT(class, type, keytype, name, read, write) \ + \ + Nut::Row class::read() const { return m_##name ; } \ + void class::write(Nut::Row name){ \ + propertyChanged(QT_STRINGIFY2(name##Id)); \ + m_##name = name; \ + m_##name##Id = name->primaryValue().value(); \ + } \ + \ + keytype class::read##Id() const{ \ + if (m_##name) \ + return m_##name->primaryValue().value(); \ + return m_##name##Id; \ } \ - void write##Id(keytype name##Id){ \ - m_##name.setValue(name##Id); \ + void class::write##Id(keytype name##Id){ \ + m_##name##Id = name##Id; \ + m_##name = nullptr; \ propertyChanged(QT_STRINGIFY2(name##Id)); \ } @@ -129,12 +139,14 @@ public: \ #define NUT_FIELD(name) NUT_INFO(__nut_FIELD, name, 0) #define NUT_PRIMARY_KEY(x) NUT_INFO(__nut_PRIMARY_KEY, x, 0) \ + public: \ QVariant primaryValue() const override { \ return property(#x); \ } \ void setPrimaryValue(const QVariant &value) override { \ setProperty(#x, value); \ - } + } \ + private: #define NUT_AUTO_INCREMENT(x) NUT_INFO(__nut_AUTO_INCREMENT, x, 0) @@ -277,31 +289,31 @@ inline T *get(const QSharedPointer row) { #endif -template -struct ForeignKeyData { - Nut::Row _table; - T _id; +//template +//struct ForeignKeyData { +// Nut::Row _table; +// T _id; - ForeignKeyData() : _table(nullptr) - {} +// ForeignKeyData() : _table(nullptr) +// {} - void setTable(Nut::Row t) { - _table = t; - _id = t->primaryValue().value(); - } - Nut::Row table() const { - return _table; - } - void setValue(const T& val) { - _table = nullptr; - _id = val; - } - T value() const { - if (_table) - return _table->primaryValue().value(); - return _id; - } -}; +// void setTable(Nut::Row t) { +// _table = t; +// _id = t->primaryValue().value(); +// } +// Nut::Row table() const { +// return _table; +// } +// void setValue(const T& val) { +// _table = nullptr; +// _id = val; +// } +// T value() const { +// if (_table) +// return _table->primaryValue().value(); +// return _id; +// } +//}; NUT_END_NAMESPACE diff --git a/test/common/comment.cpp b/test/common/comment.cpp index 87ec017..59b2e0d 100644 --- a/test/common/comment.cpp +++ b/test/common/comment.cpp @@ -1,6 +1,11 @@ #include "comment.h" +#include "post.h" +#include "user.h" Comment::Comment(QObject *parent) : Table(parent) { } + +NUT_FOREIGN_KEY_IMPLEMENT(Comment, Post, int, post, post, setPost) +NUT_FOREIGN_KEY_IMPLEMENT(Comment, User, int, author, author, setAuthor) diff --git a/test/common/score.cpp b/test/common/score.cpp index 08466a2..91881b5 100644 --- a/test/common/score.cpp +++ b/test/common/score.cpp @@ -1,6 +1,11 @@ #include "score.h" +#include "user.h" +#include "post.h" Score::Score(QObject *parent) : Nut::Table(parent) { } + +NUT_FOREIGN_KEY_IMPLEMENT(Score, Post, int, post, post, setPost) +NUT_FOREIGN_KEY_IMPLEMENT(Score, User, QUuid, author, author, setAuthor) diff --git a/test/tst_basic/tst_basic.cpp b/test/tst_basic/tst_basic.cpp index f728887..c512790 100644 --- a/test/tst_basic/tst_basic.cpp +++ b/test/tst_basic/tst_basic.cpp @@ -80,11 +80,11 @@ void BasicTest::createPost() comment->setAuthorId(user->id()); db.comments()->append(comment); } - for (int i = 0; i < 10; ++i) { - auto score = Nut::create(); - score->setScore(i % 5); - newPost->scores()->append(score); - } +// for (int i = 0; i < 10; ++i) { +// auto score = Nut::create(); +// score->setScore(i % 5); +// newPost->scores()->append(score); +// } db.saveChanges();