From 74b2a4524ac058f9db043db013e15811a198febe Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Sat, 22 Jun 2019 01:32:37 +0430 Subject: [PATCH] initial --- 3rdparty/serializer | 2 +- ci-test-init.pri | 2 +- src/defines.h | 65 +++++++++++++++++++++++--- src/table.h | 10 +--- test/common/comment.cpp | 3 +- test/tst_generators/tst_generators.cpp | 2 +- 6 files changed, 65 insertions(+), 19 deletions(-) diff --git a/3rdparty/serializer b/3rdparty/serializer index f9d81fc..b3c550c 160000 --- a/3rdparty/serializer +++ b/3rdparty/serializer @@ -1 +1 @@ -Subproject commit f9d81fcc6244271b3926891b0c86554e1e6b967e +Subproject commit b3c550c5bb7c570b1b10492fcedf287c1915af39 diff --git a/ci-test-init.pri b/ci-test-init.pri index a204047..a24cc9d 100644 --- a/ci-test-init.pri +++ b/ci-test-init.pri @@ -1,3 +1,3 @@ #QT -= gui -DEFINES += DOC_PATH=\\\"$$PWD/../../doc\\\" +DEFINES += NUT_PATH=\\\"$$PWD/../../\\\" diff --git a/src/defines.h b/src/defines.h index 144ae10..a547688 100644 --- a/src/defines.h +++ b/src/defines.h @@ -84,15 +84,33 @@ 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_DECLARE_FIELD(keytype, name##Id, read##Id, write##Id)*/ \ NUT_INFO(__nut_FOREIGN_KEY, name, type) \ - Nut::Row m_##name; \ + Nut::ForeignKeyData m_##name; \ public: \ - Nut::Row read() const { return m_##name ; } \ + Nut::Row read() const { return m_##name.table() ; } \ void write(Nut::Row name){ \ - m_##name = name; \ + m_##name.setTable(name); \ + }\ + \ + Q_PROPERTY(keytype name##Id READ read##Id WRITE write##Id) \ + NUT_INFO(__nut_FIELD, name##Id, 0) \ +public: \ + 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(); \ + } \ + void write##Id(keytype name##Id){ \ + m_##name.setValue(name##Id); \ + propertyChanged(QT_STRINGIFY2(name##Id)); \ } + #define NUT_DECLARE_CHILD_TABLE(type, n) \ private: \ NUT_WRAP_NAMESPACE(TableSet) *m_##n; \ @@ -110,9 +128,18 @@ public: \ } #define NUT_FIELD(name) NUT_INFO(__nut_FIELD, name, 0) -#define NUT_PRIMARY_KEY(x) NUT_INFO(__nut_PRIMARY_KEY, x, 0) +#define NUT_PRIMARY_KEY(x) NUT_INFO(__nut_PRIMARY_KEY, x, 0) \ + QVariant primaryValue() const override { \ + return property(#x); \ + } \ + void setPrimaryValue(const QVariant &value) override { \ + setProperty(#x, value); \ + } + + #define NUT_AUTO_INCREMENT(x) NUT_INFO(__nut_AUTO_INCREMENT, x, 0) -#define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_INFO(__nut_PRIMARY_KEY_AI, x, 0) +#define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_INFO(__nut_PRIMARY_KEY_AI, x, 0)\ + NUT_PRIMARY_KEY(X) NUT_AUTO_INCREMENT(X) #define NUT_DISPLAY_NAME(field, name) NUT_INFO(__nut_DISPLAY, field, name) #define NUT_UNIQUE(x) NUT_INFO(__nut_UNIQUE, x, 0) #define NUT_LEN(field, len) NUT_INFO(__nut_LEN, field, len) @@ -250,6 +277,32 @@ inline T *get(const QSharedPointer row) { #endif +template +struct ForeignKeyData { + Nut::Row _table; + T _id; + + 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; + } +}; + NUT_END_NAMESPACE #endif // SYNTAX_DEFINES_H diff --git a/src/table.h b/src/table.h index d661784..16dfbd3 100644 --- a/src/table.h +++ b/src/table.h @@ -55,14 +55,8 @@ public: int save(Database *db); -// Q_DECL_DEPRECATED -// QString primaryKey() const; - -// Q_DECL_DEPRECATED -// bool isPrimaryKeyAutoIncrement() const; - -// Q_DECL_DEPRECATED -// QVariant primaryValue() const; + virtual QVariant primaryValue() const = 0; + virtual void setPrimaryValue(const QVariant &value) = 0; Status status() const; void setStatus(const Status &status); diff --git a/test/common/comment.cpp b/test/common/comment.cpp index d732145..87ec017 100644 --- a/test/common/comment.cpp +++ b/test/common/comment.cpp @@ -1,7 +1,6 @@ #include "comment.h" -Comment::Comment(QObject *parent) : Table(parent), - m_author(Q_NULLPTR), m_post(Q_NULLPTR) +Comment::Comment(QObject *parent) : Table(parent) { } diff --git a/test/tst_generators/tst_generators.cpp b/test/tst_generators/tst_generators.cpp index 140a6e1..8eb4d5f 100644 --- a/test/tst_generators/tst_generators.cpp +++ b/test/tst_generators/tst_generators.cpp @@ -140,7 +140,7 @@ void GeneratorsTest::cleanupTestCase() i.value().psql, i.value().mssql)); } - QFile file(DOC_PATH "/datatypes.md"); + QFile file(NUT_PATH "/doc/datatypes.md"); if (file.open(QIODevice::WriteOnly)) { file.write(p.toUtf8()); file.close();