From c5e9d5ec2b066be8ef0f9a38c4cb5af2e1d6e040 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Thu, 11 Jan 2018 13:38:45 +0330 Subject: [PATCH] new macro --- src/database.cpp | 38 +++++++++++++++++++++++++++++--------- src/database_p.h | 2 ++ src/databasemodel.cpp | 2 +- src/defines.h | 3 +-- src/table.cpp | 5 ++++- src/tablemodel.cpp | 4 +++- src/tablemodel.h | 3 ++- 7 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/database.cpp b/src/database.cpp index f9824d9..993f188 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -188,16 +188,20 @@ bool DatabasePrivate::getCurrectScheema() changeLogs = new TableSet(q); for (int i = 0; i < q->metaObject()->classInfoCount(); i++) { - QMetaClassInfo ci = q->metaObject()->classInfo(i); - QString ciName = QString(ci.name()) - .replace(__nut_NAME_PERFIX, "") - .replace("\"", ""); + QString type; + QString name; + QString value; - if (ciName.startsWith(__nut_TABLE)) - tables.insert(ciName.split(" ").at(1), ci.value()); + if (!checkClassInfo(q->metaObject()->classInfo(i), + type, name, value)) { + continue; + } - if (ciName == __nut_DB_VERSION) { - currentModel.setVersion(QString(ci.value())); + if (type == __nut_TABLE) + tables.insert(name, type); + + if (type == __nut_DB_VERSION) + currentModel.setVersion(name); /* TODO: remove QStringList version @@ -213,7 +217,6 @@ bool DatabasePrivate::getCurrectScheema() if (!ok) qFatal("NUT_DB_VERSION macro accept version in format 'x' or " "'x[.y]' only, and x,y must be integer values\n");*/ - } } for (int i = 1; i < q->metaObject()->propertyCount(); i++) { @@ -235,6 +238,23 @@ 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; + + type = parts[0]; + name = parts[1]; + value = parts[2]; + qDebug() << Q_FUNC_INFO << parts; + return true; + } +} + DatabaseModel DatabasePrivate::getLastScheema() { ChangeLogTable *u = changeLogs->query() diff --git a/src/database_p.h b/src/database_p.h index 4a64be7..8265273 100644 --- a/src/database_p.h +++ b/src/database_p.h @@ -45,6 +45,8 @@ public: DatabaseModel getLastScheema(); bool getCurrectScheema(); + bool checkClassInfo(const QMetaClassInfo &classInfo, + QString &type, QString &name, QString &value); QSqlDatabase db; QString hostName; diff --git a/src/databasemodel.cpp b/src/databasemodel.cpp index 3b203a4..a4f99bf 100644 --- a/src/databasemodel.cpp +++ b/src/databasemodel.cpp @@ -79,7 +79,7 @@ TableModel *DatabaseModel::tableByClassName(QString className) const // qWarning("Table with class name '%s' not found in model", // qUtf8Printable(className)); -// Q_UNREACHABLE(); + Q_UNREACHABLE(); return 0; } diff --git a/src/defines.h b/src/defines.h index 60b9d1c..b55e827 100644 --- a/src/defines.h +++ b/src/defines.h @@ -33,10 +33,9 @@ #endif #define NUT_INFO(type, name, value) \ - Q_CLASSINFO(__nut_NAME_PERFIX #type #name #value, #type "\n" #name "\n" #value) + Q_CLASSINFO(__nut_NAME_PERFIX type #name #value, type "\n" #name "\n" #value) // Database -//TODO: remove minor version #define NUT_DB_VERSION(version) \ NUT_INFO(__nut_DB_VERSION, version, 0) diff --git a/src/table.cpp b/src/table.cpp index c310e64..3f729dd 100644 --- a/src/table.cpp +++ b/src/table.cpp @@ -68,7 +68,10 @@ QString Table::primaryKey() const bool Table::isPrimaryKeyAutoIncrement() const { - return TableModel::findByClassName(metaObject()->className())->field(primaryKey())->isAutoIncrement; + auto m = TableModel::findByClassName(metaObject()->className()); + auto pk = m->primaryKey(); + auto f = m->field(pk); + return f->isAutoIncrement; } diff --git a/src/tablemodel.cpp b/src/tablemodel.cpp index bcded9c..4bd7cc4 100644 --- a/src/tablemodel.cpp +++ b/src/tablemodel.cpp @@ -144,7 +144,8 @@ bool TableModel::operator !=(const TableModel &t) const return !(*this == t); } -bool TableModel::checkClassInfo(const QMetaClassInfo &classInfo, QString type, QString name, QString value) +bool TableModel::checkClassInfo(const QMetaClassInfo &classInfo, + QString &type, QString &name, QString &value) { if (!QString(classInfo.name()).startsWith(__nut_NAME_PERFIX)) { return false; @@ -189,6 +190,7 @@ TableModel::TableModel(int typeId, QString tableName) continue; } + qDebug() << "**********" << type << __nut_FIELD << (type == __nut_FIELD); if(type == __nut_FIELD){ FieldModel *f = new FieldModel; f->name = name; diff --git a/src/tablemodel.h b/src/tablemodel.h index fd0d704..04d05be 100644 --- a/src/tablemodel.h +++ b/src/tablemodel.h @@ -117,7 +117,8 @@ private: QList _fields; QList _foregionKeys; 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