From e4f1c4c2667e984e496fcd000647b402fd03ac34 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Sun, 8 Apr 2018 19:46:44 +0430 Subject: [PATCH] some polish and #21 [skip ci] --- src/database.cpp | 32 ++++----- src/database_p.h | 4 +- src/defines.h | 99 +++++++++++++++++++++++--- src/defines_p.h | 3 +- src/generators/postgresqlgenerator.cpp | 2 +- src/phrase.cpp | 44 ------------ src/tablemodel.cpp | 54 +++++++------- src/tablemodel.h | 4 +- test/common/comment.h | 5 +- test/common/consts.h | 2 +- test/common/user.h | 4 +- 11 files changed, 146 insertions(+), 107 deletions(-) diff --git a/src/database.cpp b/src/database.cpp index 40de725..1bbd3f8 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -203,8 +203,8 @@ bool DatabasePrivate::getCurrectScheema() QString name; QString value; - if (!checkClassInfo(q->metaObject()->classInfo(i), - type, name, value)) { + if (!nutClassInfoString(q->metaObject()->classInfo(i), + type, name, value)) { continue; } @@ -249,21 +249,21 @@ bool DatabasePrivate::getCurrectScheema() return true; } -bool DatabasePrivate::checkClassInfo(const QMetaClassInfo &classInfo, QString &type, QString &name, QString &value) -{ - if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { - return false; - } else { - QStringList parts = QString(classInfo.value()).split("\n"); - if (parts.count() != 3) - return false; +//bool DatabasePrivate::checkClassInfo(const QMetaClassInfo &classInfo, QString &type, QString &name, QString &value) +//{ +// if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { +// return false; +// } else { +// QStringList parts = QString(classInfo.value()).split("\n"); +// if (parts.count() != 3) +// return false; - type = parts[0]; - name = parts[1]; - value = parts[2]; - return true; - } -} +// type = parts[0]; +// name = parts[1]; +// value = parts[2]; +// return true; +// } +//} DatabaseModel DatabasePrivate::getLastScheema() { diff --git a/src/database_p.h b/src/database_p.h index 3299e4a..cbe2379 100644 --- a/src/database_p.h +++ b/src/database_p.h @@ -45,8 +45,8 @@ public: DatabaseModel getLastScheema(); bool getCurrectScheema(); - bool checkClassInfo(const QMetaClassInfo &classInfo, - QString &type, QString &name, QString &value); +// bool checkClassInfo(const QMetaClassInfo &classInfo, +// QString &type, QString &name, QString &value); QSqlDatabase db; QString hostName; diff --git a/src/defines.h b/src/defines.h index a779ccd..699e5b7 100644 --- a/src/defines.h +++ b/src/defines.h @@ -26,6 +26,11 @@ #include "defines_p.h" #include "qglobal.h" +#include +#include +#include +#include + #ifdef NUT_COMPILE_STATIC # define NUT_EXPORT #else @@ -36,21 +41,95 @@ Q_CLASSINFO(__nut_NAME_PERFIX type #name #value, \ type "\n" #name "\n" #value) +#define NUT_INFO_STRING(type, name, value) \ + Q_CLASSINFO(__nut_NAME_PERFIX type #name #value, \ + type "\n" #name "\n" value) + +inline bool nutClassInfo(const QMetaClassInfo &classInfo, + QString &type, QString &name, QVariant &value) +{ + if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { + return false; + } else { + QStringList parts = QString(classInfo.value()).split("\n"); + if (parts.count() != 3) + return false; + + type = parts[0]; + name = parts[1]; + value = qVariantFromValue(parts[2]); + return true; + } +} + +inline bool nutClassInfoString(const QMetaClassInfo &classInfo, + QString &type, QString &name, QString &value) +{ + if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { + return false; + } else { + QStringList parts = QString(classInfo.value()).split("\n"); + if (parts.count() != 3) + return false; + + type = parts[0]; + name = parts[1]; + value = parts[2]; + return true; + } +} + +inline bool nutClassInfoBool(const QMetaClassInfo &classInfo, + QString &type, QString &name, bool &value) +{ + if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { + return false; + } else { + QStringList parts = QString(classInfo.value()).split("\n"); + if (parts.count() != 3) + return false; + + QString buffer = parts[2].toLower(); + if (buffer != "true" && buffer != "false") + return false; + + type = parts[0]; + name = parts[1]; + value = (buffer == "true"); + return true; + } +} + +inline bool nutClassInfoInt(const QMetaClassInfo &classInfo, + QString &type, QString &name, bool &value) +{ + if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { + return false; + } else { + QStringList parts = QString(classInfo.value()).split("\n"); + if (parts.count() != 3) + return false; + bool ok; + type = parts[0]; + name = parts[1]; + value = parts[2].toInt(&ok); + return ok; + } +} + + // Database #define NUT_DB_VERSION(version) \ NUT_INFO(__nut_DB_VERSION, version, 0) #define NUT_DECLARE_TABLE(type, name) \ NUT_INFO(__nut_TABLE, type, name) \ - Q_PROPERTY(type* name READ name) \ - Q_PROPERTY(NUT_WRAP_NAMESPACE(TableSet) name##Table READ name##Table)\ - type* m_##name; \ - NUT_WRAP_NAMESPACE(TableSet) *m_##name##Table; \ + Q_PROPERTY(NUT_WRAP_NAMESPACE(TableSet) name READ name) \ + NUT_WRAP_NAMESPACE(TableSet) *m_##name; \ public: \ - static const type _##name; \ - type* name() const{ return m_##name; } \ - NUT_WRAP_NAMESPACE(TableSet) *name##Table() const \ - { return m_##name##Table; } + static const type *_##name; \ + NUT_WRAP_NAMESPACE(TableSet) *name() const \ + { return m_##name; } //Table #define NUT_DECLARE_FIELD(type, name, read, write) \ @@ -99,11 +178,9 @@ public: \ return m_##n; \ } - #define NUT_PRIMARY_KEY(x) NUT_INFO(__nut_PRIMARY_KEY, x, 0) #define NUT_AUTO_INCREMENT(x) NUT_INFO(__nut_AUTO_INCREMENT, x, 0) -#define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_PRIMARY_KEY(x) \ - NUT_AUTO_INCREMENT(x) +#define NUT_PRIMARY_AUTO_INCREMENT(x) NUT_INFO(__nut_PRIMARY_KEY_AI, x, 0) #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) diff --git a/src/defines_p.h b/src/defines_p.h index 045d001..b37f715 100644 --- a/src/defines_p.h +++ b/src/defines_p.h @@ -27,10 +27,11 @@ #define __FOREIGN_KEYS "foreign_keys" #define __nut_FIELD "field" +#define __nut_NAME_PERFIX "nut_info::" #define __nut_DB_VERSION "database_version" -#define __nut_NAME_PERFIX "nut_db_key::" #define __nut_PRIMARY_KEY "primary_key" #define __nut_AUTO_INCREMENT "auto_increment" +#define __nut_PRIMARY_KEY_AI "primary_key_ai" #define __nut_UNIQUE "unique" #define __nut_TABLE "table" #define __nut_TABLE_NAME "table_name" diff --git a/src/generators/postgresqlgenerator.cpp b/src/generators/postgresqlgenerator.cpp index 6bab95e..a791922 100644 --- a/src/generators/postgresqlgenerator.cpp +++ b/src/generators/postgresqlgenerator.cpp @@ -63,7 +63,7 @@ QString PostgreSqlGenerator::fieldType(FieldModel *field) if(field->isAutoIncrement) dbType = "BIGSERIAL"; else - dbType = "BIGINTEGER"; + dbType = "BIGINT"; break; case QVariant::Double: diff --git a/src/phrase.cpp b/src/phrase.cpp index 274cdcc..4dba9b5 100644 --- a/src/phrase.cpp +++ b/src/phrase.cpp @@ -24,8 +24,6 @@ NUT_BEGIN_NAMESPACE -#define LOG(s) qDebug() << __func__ << s - PhraseData::PhraseData() : className(""), fieldName(""), type(Field), operatorCond(NotAssign), @@ -65,7 +63,6 @@ PhraseData::PhraseData(PhraseData *l, PhraseData::Condition o, QVariant r) PhraseData *PhraseData::operator =(PhraseData *other) { - LOG(""); other->parents++; return other; } @@ -76,20 +73,6 @@ PhraseData &PhraseData::operator =(PhraseData &other) return other; } -//PhraseData::PhraseData(const PhraseData &other) : -// left(other.left), right(other.right), operand(other.operand), -// operatorCond(other.operatorCond), className(other.className), -// fieldName(other.fieldName), type(other.type), isNot(other.isNot), -// parents(other.parents + 1) -//{ } - -//PhraseData::PhraseData(const PhraseData *other) : -// left(other->left), right(other->right), operand(other->operand), -// operatorCond(other->operatorCond), className(other->className), -// fieldName(other->fieldName), type(other->type), isNot(other->isNot), -// parents(other->parents + 1) -//{ } - QString PhraseData::toString() const { return QString("[%1].%2").arg(className).arg(fieldName); @@ -97,27 +80,10 @@ QString PhraseData::toString() const PhraseData::~PhraseData() { -// if (type == WithOther) { -// delete left; -// delete right; -// } -// if (type == WithVariant) { -// if (left) -// delete left; -// } - -// if (right && !--right->parents) -// delete right; - -// if (left && !--left->parents) -// delete left; - - LOG(""); } void PhraseData::cleanUp() { -// cleanUp(this); } void PhraseData::cleanUp(PhraseData *d) @@ -154,12 +120,6 @@ AbstractFieldPhrase::AbstractFieldPhrase(AbstractFieldPhrase &&other) AbstractFieldPhrase::~AbstractFieldPhrase() { - if (data) { - LOG(data->toString()) << data->parents; - } else { - LOG(""); - } - if (data) { --data->parents; if (data->parents <= 0) @@ -232,14 +192,12 @@ PhraseList::PhraseList() : isValid(false) PhraseList::PhraseList(const PhraseList &other) : isValid(true) { - LOG(""); data = qMove(other.data); const_cast(other).data.clear(); } PhraseList::PhraseList(PhraseList &&other) { - LOG(""); data = other.data; } @@ -277,7 +235,6 @@ PhraseList::PhraseList(PhraseList *left, const AbstractFieldPhrase *right) PhraseList::~PhraseList() { - LOG(""); } PhraseList &PhraseList::operator =(const PhraseList &other) @@ -484,7 +441,6 @@ ConditionalPhrase::ConditionalPhrase(ConditionalPhrase *l, ConditionalPhrase::~ConditionalPhrase() { - LOG(""); if (data) { data->cleanUp(); if (!--data->parents) diff --git a/src/tablemodel.cpp b/src/tablemodel.cpp index bc542a0..2908f26 100644 --- a/src/tablemodel.cpp +++ b/src/tablemodel.cpp @@ -156,22 +156,22 @@ bool TableModel::operator !=(const TableModel &t) const return !(*this == t); } -bool TableModel::checkClassInfo(const QMetaClassInfo &classInfo, - QString &type, QString &name, QString &value) -{ - if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { - return false; - } else { - QStringList parts = QString(classInfo.value()).split("\n"); - if (parts.count() != 3) - return false; +//bool TableModel::checkClassInfo(const QMetaClassInfo &classInfo, +// QString &type, QString &name, QString &value) +//{ +// if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { +// return false; +// } else { +// QStringList parts = QString(classInfo.value()).split("\n"); +// if (parts.count() != 3) +// return false; - type = parts[0]; - name = parts[1]; - value = parts[2]; - return true; - } -} +// type = parts[0]; +// name = parts[1]; +// value = parts[2]; +// return true; +// } +//} TableModel::TableModel(int typeId, QString tableName) { @@ -196,7 +196,7 @@ TableModel::TableModel(int typeId, QString tableName) QString name; QString value; - if (!checkClassInfo(tableMetaObject->classInfo(j), + if (!nutClassInfoString(tableMetaObject->classInfo(j), type, name, value)) { continue; } @@ -227,7 +227,7 @@ TableModel::TableModel(int typeId, QString tableName) QString name; QString value; - if (!checkClassInfo(tableMetaObject->classInfo(j), + if (!nutClassInfoString(tableMetaObject->classInfo(j), type, name, value)) { continue; } @@ -248,23 +248,27 @@ TableModel::TableModel(int typeId, QString tableName) FieldModel *f = field(name); - if(!f) + if (!f) continue; - if(type == __nut_LEN) + if (type == __nut_LEN) f->length = value.toInt(); - else if(type == __nut_NOT_NULL) + else if (type == __nut_NOT_NULL) f->notNull = true; - else if(type == __nut_DEFAULT_VALUE) + else if (type == __nut_DEFAULT_VALUE) f->defaultValue = value; - else if(type == __nut_PRIMARY_KEY) + else if (type == __nut_PRIMARY_KEY) f->isPrimaryKey = true; - else if(type == __nut_AUTO_INCREMENT) + else if (type == __nut_AUTO_INCREMENT) f->isAutoIncrement = true; - else if(type == __nut_UNIQUE) + else if (type == __nut_UNIQUE) f->isUnique = true; - else if(type == __nut_DISPLAY) + else if (type == __nut_DISPLAY) f->displayName = value.mid(1, value.length() - 2); + else if (type == __nut_PRIMARY_KEY_AI) { + f->isPrimaryKey = true; + f->isAutoIncrement = true; + } } if(!findByTypeId(typeId) && !tableName.isNull()) diff --git a/src/tablemodel.h b/src/tablemodel.h index 67fcc5e..345374f 100644 --- a/src/tablemodel.h +++ b/src/tablemodel.h @@ -138,8 +138,8 @@ private: QList _fields; QList _foreignKeys; static QSet_allModels; - bool checkClassInfo(const QMetaClassInfo &classInfo, - QString &type, QString &name, QString &value); +// bool checkClassInfo(const QMetaClassInfo &classInfo, +// QString &type, QString &name, QString &value); }; NUT_END_NAMESPACE diff --git a/test/common/comment.h b/test/common/comment.h index 0fd30cc..0d0f9d2 100644 --- a/test/common/comment.h +++ b/test/common/comment.h @@ -3,6 +3,7 @@ #include #include +#include #include "table.h" #ifdef NUT_NAMESPACE @@ -16,13 +17,13 @@ class Comment : public Table Q_OBJECT NUT_PRIMARY_AUTO_INCREMENT(id) - NUT_DECLARE_FIELD(int, id, id, setId) + NUT_DECLARE_FIELD(QUuid, id, id, setId) NUT_DECLARE_FIELD(QString, message, message, setMessage) NUT_DECLARE_FIELD(QDateTime, saveDate, saveDate, setSaveDate) NUT_DECLARE_FIELD(qreal, point, point, setPoint) NUT_FOREGION_KEY(Post, int, post, post, setPost) - NUT_FOREGION_KEY(User, int, author, author, setAuthor) + NUT_FOREGION_KEY(User, QUuid, author, author, setAuthor) public: Q_INVOKABLE explicit Comment(QObject *parentTableSet = 0); diff --git a/test/common/consts.h b/test/common/consts.h index 40ca178..75d7623 100644 --- a/test/common/consts.h +++ b/test/common/consts.h @@ -9,7 +9,7 @@ #define DRIVER "QSQLITE" #define HOST "127.0.0.1" -#define DATABASE "nutdb" +#define DATABASE "nutdb1" #define USERNAME "root" #define PASSWORD "onlyonlyi" diff --git a/test/common/user.h b/test/common/user.h index 0b98721..2fff65f 100644 --- a/test/common/user.h +++ b/test/common/user.h @@ -17,8 +17,8 @@ class User : public Nut::Table { Q_OBJECT - NUT_PRIMARY_AUTO_INCREMENT(id) - NUT_DECLARE_FIELD(int, id, id, setId) + NUT_PRIMARY_KEY(id) + NUT_DECLARE_FIELD(QUuid, id, id, setId) NUT_NOT_NULL(username) NUT_LEN(username, 50)