From 465200821a1536752d8e308a444c959b3cff0b5f Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Mon, 3 Jun 2019 00:59:44 +0430 Subject: [PATCH 1/4] Json test added --- test/test.pro | 3 ++- test/tst_json/db.cpp | 9 +++++++ test/tst_json/db.h | 22 +++++++++++++++++ test/tst_json/sampletable.cpp | 7 ++++++ test/tst_json/sampletable.h | 23 ++++++++++++++++++ test/tst_json/tst_json.cpp | 45 +++++++++++++++++++++++++++++++++++ test/tst_json/tst_json.h | 27 +++++++++++++++++++++ test/tst_json/tst_json.pro | 19 +++++++++++++++ 8 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 test/tst_json/db.cpp create mode 100644 test/tst_json/db.h create mode 100644 test/tst_json/sampletable.cpp create mode 100644 test/tst_json/sampletable.h create mode 100644 test/tst_json/tst_json.cpp create mode 100644 test/tst_json/tst_json.h create mode 100644 test/tst_json/tst_json.pro diff --git a/test/test.pro b/test/test.pro index ae95ff5..504a9c5 100644 --- a/test/test.pro +++ b/test/test.pro @@ -9,5 +9,6 @@ SUBDIRS += \ tst_phrases \ tst_quuid \ tst_generators \ - tst_upgrades + tst_upgrades \ + tst_json diff --git a/test/tst_json/db.cpp b/test/tst_json/db.cpp new file mode 100644 index 0000000..598f17c --- /dev/null +++ b/test/tst_json/db.cpp @@ -0,0 +1,9 @@ +#include "db.h" + +#include "sampletable.h" + +DB::DB() : Nut::Database (), + m_sampleTable(new Nut::TableSet(this)) +{ + +} diff --git a/test/tst_json/db.h b/test/tst_json/db.h new file mode 100644 index 0000000..d31adb7 --- /dev/null +++ b/test/tst_json/db.h @@ -0,0 +1,22 @@ +#ifndef DB1_H +#define DB1_H + +#include "database.h" + +class Table; + +class DB : public Nut::Database +{ + Q_OBJECT + + NUT_DB_VERSION(1) + + NUT_DECLARE_TABLE(Table, sampleTable) + +public: + DB(); +}; + +Q_DECLARE_METATYPE(DB*) + +#endif // DB1_H diff --git a/test/tst_json/sampletable.cpp b/test/tst_json/sampletable.cpp new file mode 100644 index 0000000..3ba992b --- /dev/null +++ b/test/tst_json/sampletable.cpp @@ -0,0 +1,7 @@ +#include "sampletable.h" + + +Table::Table(QObject *parent) : Nut::Table (parent) +{ + +} diff --git a/test/tst_json/sampletable.h b/test/tst_json/sampletable.h new file mode 100644 index 0000000..57ac136 --- /dev/null +++ b/test/tst_json/sampletable.h @@ -0,0 +1,23 @@ +#ifndef TABLE1_H +#define TABLE1_H + +#include "table.h" +#include + +class Table : public Nut::Table +{ + Q_OBJECT + + NUT_PRIMARY_AUTO_INCREMENT(id) + NUT_DECLARE_FIELD(int, id, id, setId) + + NUT_DECLARE_FIELD(QJsonDocument, doc, doc, setDoc) + +public: + Q_INVOKABLE Table(QObject *parent = Q_NULLPTR); + +}; + +Q_DECLARE_METATYPE(Table*) + +#endif // TABLE1_H diff --git a/test/tst_json/tst_json.cpp b/test/tst_json/tst_json.cpp new file mode 100644 index 0000000..3129b16 --- /dev/null +++ b/test/tst_json/tst_json.cpp @@ -0,0 +1,45 @@ +#include + +#include "db.h" +#include "sampletable.h" +#include "query.h" + +#include "tst_json.h" +#include "consts.h" + +void TestJson::initDb(Nut::Database &db) +{ + db.setDriver(DRIVER); + db.setHostName(HOST); + db.setDatabaseName(DATABASE); + db.setUserName(USERNAME); + db.setPassword(PASSWORD); +} + +TestJson::TestJson() +{ + +} + +TestJson::~TestJson() +{ + +} + +void TestJson::initTestCase() +{ + QFile::remove(DATABASE); + REGISTER(DB); + REGISTER(Table); +} + +void TestJson::store() +{ + DB db; + initDb(db); + + QTEST_ASSERT(db.open()); +} + +QTEST_APPLESS_MAIN(TestJson) + diff --git a/test/tst_json/tst_json.h b/test/tst_json/tst_json.h new file mode 100644 index 0000000..5271c65 --- /dev/null +++ b/test/tst_json/tst_json.h @@ -0,0 +1,27 @@ +#ifndef TST_TESTJSON_H +#define TST_TESTJSON_H + +#include + +namespace Nut { +class Database; +} +class TestJson : public QObject +{ + Q_OBJECT + + void initDb(Nut::Database &db); + + int id; +public: + TestJson(); + ~TestJson(); + +private slots: + void initTestCase(); + + void store(); + +}; + +#endif // TST_TESTJSON_H diff --git a/test/tst_json/tst_json.pro b/test/tst_json/tst_json.pro new file mode 100644 index 0000000..04f053c --- /dev/null +++ b/test/tst_json/tst_json.pro @@ -0,0 +1,19 @@ +QT += testlib sql + +TARGET = tst_upgrades +TEMPLATE = app +CONFIG += warn_on c++11 + +include(../common/nut-lib.pri) + +SOURCES += \ + tst_json.cpp \ + db.cpp \ + sampletable.cpp + +HEADERS += \ + tst_json.h \ + db.h \ + sampletable.h + +include($$PWD/../../ci-test-init.pri) From ae1ee06f85e5b52245fbbe9ed104cf5389cd71bf Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Wed, 5 Jun 2019 00:45:30 +0430 Subject: [PATCH 2/4] wip: remove unneeded TableModel creation --- 3rdparty/serializer | 2 +- ci-test-init.pri | 2 +- src/database.cpp | 6 ++++++ src/generators/sqlgeneratorbase.cpp | 1 + src/table.cpp | 16 ++++++++-------- src/tablemodel.cpp | 1 + test/common/consts.h | 6 ++++-- test/common/nut-lib.pri | 16 ++++++++-------- test/tst_json/tst_json.cpp | 10 +++++++++- 9 files changed, 39 insertions(+), 21 deletions(-) diff --git a/3rdparty/serializer b/3rdparty/serializer index e2d8a72..b3c550c 160000 --- a/3rdparty/serializer +++ b/3rdparty/serializer @@ -1 +1 @@ -Subproject commit e2d8a726ef1396c47bf35347ea8b55ca47c6af3b +Subproject commit b3c550c5bb7c570b1b10492fcedf287c1915af39 diff --git a/ci-test-init.pri b/ci-test-init.pri index 021efb9..c3d1f7b 100644 --- a/ci-test-init.pri +++ b/ci-test-init.pri @@ -1 +1 @@ -QT -= gui +#QT -= gui diff --git a/src/database.cpp b/src/database.cpp index e6ebfd3..2b38e67 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -625,6 +625,12 @@ void Database::add(TableSetBase *t) int Database::saveChanges(bool cleanUp) { Q_D(Database); + + if (!d->db.isOpen()) { + qWarning("Database is not open"); + return 0; + } + int rowsAffected = 0; foreach (TableSetBase *ts, d->tableSets) rowsAffected += ts->save(this, cleanUp); diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index 22b0757..45460b3 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -152,6 +152,7 @@ QString SqlGeneratorBase::fieldDeclare(FieldModel *field) QStringList SqlGeneratorBase::constraints(TableModel *table) { + Q_UNUSED(table); return QStringList(); } diff --git a/src/table.cpp b/src/table.cpp index c2c3636..b45f98d 100644 --- a/src/table.cpp +++ b/src/table.cpp @@ -45,7 +45,7 @@ Table::Table(QObject *parent) : QObject(parent), { Q_D(Table); d->status = NewCreated; - d->model = TableModel::findByClassName(metaObject()->className()); +// d->model = TableModel::findByClassName(metaObject()->className()); } Table::~Table() @@ -86,15 +86,15 @@ QVariant Table::primaryValue() const void Table::propertyChanged(const QString &propName) { Q_D(Table); - if (!d->model) - d->model = TableModel::findByClassName(metaObject()->className()); +// if (!d->model) +// d->model = TableModel::findByClassName(metaObject()->className()); - if (!d->model) - qFatal ("model for class '%s' not found", qPrintable(metaObject()->className())); +// if (!d->model) +// qFatal ("model for class '%s' not found", qPrintable(metaObject()->className())); - foreach (FieldModel *f, d->model->fields()) - if(f->isPrimaryKey && propName == f->name && f->isAutoIncrement) - return; +// foreach (FieldModel *f, d->model->fields()) +// if(f->isPrimaryKey && propName == f->name && f->isAutoIncrement) +// return; d->changedProperties.insert(propName); if (d->status == FeatchedFromDB) diff --git a/src/tablemodel.cpp b/src/tablemodel.cpp index aa5d416..ce302be 100644 --- a/src/tablemodel.cpp +++ b/src/tablemodel.cpp @@ -300,6 +300,7 @@ TableModel::TableModel(const QJsonObject &json, const QString &tableName) : _typ QJsonObject relations = json.value(__FOREIGN_KEYS).toObject(); foreach (QString key, fields.keys()) { QJsonObject fieldObject = fields.value(key).toObject(); + //TODO: use FieldModel(QJsonObject) ctor auto *f = new FieldModel; f->name = fieldObject.value(__NAME).toString(); f->type = static_cast(QMetaType::type(fieldObject.value(__TYPE).toString().toLatin1().data())); diff --git a/test/common/consts.h b/test/common/consts.h index 1a1a479..901bd2a 100644 --- a/test/common/consts.h +++ b/test/common/consts.h @@ -1,6 +1,8 @@ #ifndef CONSTS_H #define CONSTS_H +#include + #define REGISTER(x) qDebug() << (#x) << "type id:" << qMetaTypeId() #define PRINT(x) qDebug() << (#x "=") << (x); #define TIC() QElapsedTimer timer; timer.start() @@ -11,8 +13,8 @@ #define DRIVER "QPSQL" #define DATABASE QString("nut_test_%1_db").arg(metaObject()->className()).toLower() #define HOST "127.0.0.1" -#define USERNAME "postgres" -#define PASSWORD "" +#define USERNAME "nut" +#define PASSWORD "856856" #ifdef Q_OS_LINUX # define OS "Linux" diff --git a/test/common/nut-lib.pri b/test/common/nut-lib.pri index 02daed5..8bf4a5b 100644 --- a/test/common/nut-lib.pri +++ b/test/common/nut-lib.pri @@ -1,10 +1,10 @@ -win32 { - CONFIG(debug,debug|release): LIBDIR = $$absolute_path($$OUT_PWD/../../src/debug) - CONFIG(release,debug|release): LIBDIR = $$absolute_path($$OUT_PWD/../../src/release) -} else { - LIBDIR = $$absolute_path($$OUT_PWD/../../src) -} - -LIBS += -L$$LIBDIR -lnut +#win32 { +# CONFIG(debug,debug|release): LIBDIR = $$absolute_path($$OUT_PWD/../../src/debug) +# CONFIG(release,debug|release): LIBDIR = $$absolute_path($$OUT_PWD/../../src/release) +#} else { +# LIBDIR = $$absolute_path($$OUT_PWD/../../src) +#} +#LIBS += -L$$LIBDIR -lnut +include(../../src/src.pri) INCLUDEPATH += $$PWD/../../src $$PWD/../common diff --git a/test/tst_json/tst_json.cpp b/test/tst_json/tst_json.cpp index 3129b16..3ae5b61 100644 --- a/test/tst_json/tst_json.cpp +++ b/test/tst_json/tst_json.cpp @@ -38,7 +38,15 @@ void TestJson::store() DB db; initDb(db); - QTEST_ASSERT(db.open()); + db.open(); + + Table *t = new Table; + QJsonDocument doc = QJsonDocument::fromJson("{a: 4, b:3.14}"); + t->setDoc(doc); + db.sampleTable()->append(t); + db.saveChanges(true); + +// QTEST_ASSERT(db.open()); } QTEST_APPLESS_MAIN(TestJson) From 27a8908e2618b210398fbe059f5ba62edd3077a7 Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Thu, 6 Jun 2019 01:13:36 +0430 Subject: [PATCH 3/4] working to remove extra model check [skip ci] --- src/databasemodel.cpp | 2 +- src/databasemodel.h | 2 +- src/generators/sqlgeneratorbase.cpp | 3 ++- src/src.pri | 3 +++ src/src.pro | 1 - src/table.cpp | 5 +++-- src/table.h | 5 +++++ src/tablemodel.cpp | 8 ++++++++ src/tablemodel.h | 1 + test/common/nut-lib.pri | 14 +++++++------- test/tst_basic/tst_basic.pro | 2 +- 11 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/databasemodel.cpp b/src/databasemodel.cpp index 42211fb..e9e3a13 100644 --- a/src/databasemodel.cpp +++ b/src/databasemodel.cpp @@ -57,7 +57,7 @@ DatabaseModel::DatabaseModel(const QJsonObject &json) : } } -TableModel *DatabaseModel::tableByName(QString tableName) const +TableModel *DatabaseModel::tableByName(const QString &tableName) const { for(int i = 0; i < size(); i++){ TableModel *s = at(i); diff --git a/src/databasemodel.h b/src/databasemodel.h index f3696e9..41a97e5 100644 --- a/src/databasemodel.h +++ b/src/databasemodel.h @@ -45,7 +45,7 @@ public: DatabaseModel(const QJsonObject &json); ~DatabaseModel() = default; - TableModel *tableByName(QString tableName) const; + TableModel *tableByName(const QString &tableName) const; TableModel *tableByClassName(QString className) const; RelationModel *relationByClassNames(const QString &masterClassName, diff --git a/src/generators/sqlgeneratorbase.cpp b/src/generators/sqlgeneratorbase.cpp index 45460b3..6858b65 100644 --- a/src/generators/sqlgeneratorbase.cpp +++ b/src/generators/sqlgeneratorbase.cpp @@ -440,7 +440,8 @@ QString SqlGeneratorBase::join(const QStringList &list, QStringList *order) QString SqlGeneratorBase::insertRecord(Table *t, QString tableName) { QString sql = QString(); - QString key = t->isPrimaryKeyAutoIncrement() ? t->primaryKey() : QString(); + auto model = _database->model().tableByName(tableName); + QString key = model->isPrimaryKeyAutoIncrement() ? model->primaryKey() : QString(); QStringList values; diff --git a/src/src.pri b/src/src.pri index 211096e..84d9a48 100644 --- a/src/src.pri +++ b/src/src.pri @@ -61,3 +61,6 @@ SOURCES += \ $$PWD/phrases/phrasedatalist.cpp \ $$PWD/phrases/phraselist.cpp \ $$PWD/phrases/datephrase.cpp + + +include($$PWD/../3rdparty/serializer/src/src.pri) diff --git a/src/src.pro b/src/src.pro index 223e6c1..6f3372d 100644 --- a/src/src.pro +++ b/src/src.pro @@ -8,5 +8,4 @@ CONFIG += staticlib DEFINES += QT_DEPRECATED_WARNINGS NUT_COMPILE_STATIC include($$PWD/src.pri) -include($$PWD/../3rdparty/serializer/src/src.pri) include($$PWD/../ci-test-init.pri) diff --git a/src/table.cpp b/src/table.cpp index b45f98d..8f43d19 100644 --- a/src/table.cpp +++ b/src/table.cpp @@ -164,8 +164,9 @@ int Table::save(Database *db) QSqlQuery q = db->exec(db->sqlGenertor()->saveRecord(this, db->tableName(metaObject()->className()))); - if(status() == Added && isPrimaryKeyAutoIncrement()) - setProperty(primaryKey().toLatin1().data(), q.lastInsertId()); + auto model = db->model().tableByName(metaObject()->className()); + if(status() == Added && model->isPrimaryKeyAutoIncrement()) + setProperty(model->primaryKey().toLatin1().data(), q.lastInsertId()); foreach(TableSetBase *ts, d->childTableSets) ts->save(db); diff --git a/src/table.h b/src/table.h index 4d58fde..64c1c6c 100644 --- a/src/table.h +++ b/src/table.h @@ -55,8 +55,13 @@ public: int save(Database *db); + Q_DECL_DEPRECATED QString primaryKey() const; + + Q_DECL_DEPRECATED bool isPrimaryKeyAutoIncrement() const; + + Q_DECL_DEPRECATED QVariant primaryValue() const; Status status() const; void setStatus(const Status &status); diff --git a/src/tablemodel.cpp b/src/tablemodel.cpp index ce302be..e434e84 100644 --- a/src/tablemodel.cpp +++ b/src/tablemodel.cpp @@ -411,6 +411,14 @@ QString TableModel::primaryKey() const return QString(); } +bool TableModel::isPrimaryKeyAutoIncrement() const +{ + FieldModel *pk = field(primaryKey()); + if (!pk) + return false; + return pk->isAutoIncrement; +} + FieldModel::FieldModel(const QJsonObject &json) { name = json.value(__NAME).toString(); diff --git a/src/tablemodel.h b/src/tablemodel.h index 5ef28bb..7914ee5 100644 --- a/src/tablemodel.h +++ b/src/tablemodel.h @@ -110,6 +110,7 @@ public: QString toString() const; QString primaryKey() const; + bool isPrimaryKeyAutoIncrement() const; QString name() const; void setName(const QString &name); diff --git a/test/common/nut-lib.pri b/test/common/nut-lib.pri index 8bf4a5b..190f49e 100644 --- a/test/common/nut-lib.pri +++ b/test/common/nut-lib.pri @@ -1,10 +1,10 @@ -#win32 { -# CONFIG(debug,debug|release): LIBDIR = $$absolute_path($$OUT_PWD/../../src/debug) -# CONFIG(release,debug|release): LIBDIR = $$absolute_path($$OUT_PWD/../../src/release) -#} else { -# LIBDIR = $$absolute_path($$OUT_PWD/../../src) -#} +win32 { + CONFIG(debug,debug|release): LIBDIR = $$absolute_path($$OUT_PWD/../../src/debug) + CONFIG(release,debug|release): LIBDIR = $$absolute_path($$OUT_PWD/../../src/release) +} else { + LIBDIR = $$absolute_path($$OUT_PWD/../../src) +} #LIBS += -L$$LIBDIR -lnut -include(../../src/src.pri) INCLUDEPATH += $$PWD/../../src $$PWD/../common +include(../../src/src.pri) diff --git a/test/tst_basic/tst_basic.pro b/test/tst_basic/tst_basic.pro index 6a9aac2..24ffb66 100644 --- a/test/tst_basic/tst_basic.pro +++ b/test/tst_basic/tst_basic.pro @@ -1,6 +1,6 @@ QT += testlib sql -TARGET = tst_nut +TARGET = tst_basic TEMPLATE = app CONFIG += warn_on c++11 From 070254bd021aabfcd2187ae8e331faf369530aaf Mon Sep 17 00:00:00 2001 From: Hamed Masafi Date: Thu, 6 Jun 2019 15:32:02 +0430 Subject: [PATCH 4/4] continue --- src/table.cpp | 21 ++++++++++++--------- test/tst_basic/tst_basic.cpp | 4 ++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/table.cpp b/src/table.cpp index 8f43d19..3d75143 100644 --- a/src/table.cpp +++ b/src/table.cpp @@ -86,15 +86,15 @@ QVariant Table::primaryValue() const void Table::propertyChanged(const QString &propName) { Q_D(Table); -// if (!d->model) -// d->model = TableModel::findByClassName(metaObject()->className()); + if (!d->model) + d->model = TableModel::findByClassName(metaObject()->className()); -// if (!d->model) -// qFatal ("model for class '%s' not found", qPrintable(metaObject()->className())); + if (!d->model) + qFatal ("model for class '%s' not found", qPrintable(metaObject()->className())); -// foreach (FieldModel *f, d->model->fields()) -// if(f->isPrimaryKey && propName == f->name && f->isAutoIncrement) -// return; + foreach (FieldModel *f, d->model->fields()) + if(f->isPrimaryKey && propName == f->name && f->isAutoIncrement) + return; d->changedProperties.insert(propName); if (d->status == FeatchedFromDB) @@ -122,6 +122,9 @@ bool Table::setParentTable(Table *master) QString masterClassName = master->metaObject()->className(); + if (!d->model) + d->model = TableModel::findByClassName(metaObject()->className()); + foreach (RelationModel *r, d->model->foregionKeys()) if(r->masterClassName == masterClassName) { @@ -164,7 +167,7 @@ int Table::save(Database *db) QSqlQuery q = db->exec(db->sqlGenertor()->saveRecord(this, db->tableName(metaObject()->className()))); - auto model = db->model().tableByName(metaObject()->className()); + auto model = db->model().tableByClassName(metaObject()->className()); if(status() == Added && model->isPrimaryKeyAutoIncrement()) setProperty(model->primaryKey().toLatin1().data(), q.lastInsertId()); @@ -190,7 +193,7 @@ void Table::setStatus(const Status &status) TablePrivate::TablePrivate(Table *parent) : q_ptr(parent), - status(Table::NewCreated), parentTableSet(nullptr) + model(nullptr), status(Table::NewCreated), parentTableSet(nullptr) { } diff --git a/test/tst_basic/tst_basic.cpp b/test/tst_basic/tst_basic.cpp index 29f7a97..df3c568 100644 --- a/test/tst_basic/tst_basic.cpp +++ b/test/tst_basic/tst_basic.cpp @@ -274,8 +274,8 @@ void BasicTest::emptyDatabase() void BasicTest::cleanupTestCase() { - post->deleteLater(); - user->deleteLater(); +// post->deleteLater(); +// user->deleteLater(); //release models before exiting // qDeleteAll(TableModel::allModels());