From f387b600f787fe4d71f647ad4a90ff41bbb4b412 Mon Sep 17 00:00:00 2001 From: Filip Bucek Date: Tue, 19 Nov 2019 14:15:40 +0100 Subject: [PATCH] DatabaseTable new method primaryKey --- src/serversdk/databasetable.cpp | 12 ++++++++ src/serversdk/databasetable.h | 2 ++ src/serversdk/databaseutils.cpp | 13 ++++++-- test/auto/database/tst_databasetable.cpp | 3 ++ test/auto/database/tst_sqlite.cpp | 38 +++++++++++++++--------- 5 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/serversdk/databasetable.cpp b/src/serversdk/databasetable.cpp index 4cce529..27679a7 100644 --- a/src/serversdk/databasetable.cpp +++ b/src/serversdk/databasetable.cpp @@ -13,6 +13,18 @@ DatabaseTable::DatabaseTable(QObject *parent) : QObject(parent) { } +QString DatabaseTable::primaryKey() const +{ + const QMetaObject *metaObj = this->metaObject(); + for (int i = metaObj->propertyOffset(); i < metaObj->propertyCount(); ++i) { + QMetaProperty prop = metaObj->property(i); + if (!prop.isUser()) + continue; + return prop.name(); + } + return QString(); +} + QByteArray DatabaseTable::jsonData(const QSet &filters) const { auto variantMap = this->toVariantMap(filters); diff --git a/src/serversdk/databasetable.h b/src/serversdk/databasetable.h index a90b5f8..f07f455 100644 --- a/src/serversdk/databasetable.h +++ b/src/serversdk/databasetable.h @@ -84,6 +84,8 @@ class DatabaseTable : public QObject public: explicit DatabaseTable(QObject *parent = nullptr); + QString primaryKey() const; + /** * @brief Creates JSON from QMetaObject data ( Q_PROPERTY ) -> TABLE_PROPERTY * @return text json e.g. { "id": 00344 } diff --git a/src/serversdk/databaseutils.cpp b/src/serversdk/databaseutils.cpp index d4fa87d..224e277 100644 --- a/src/serversdk/databaseutils.cpp +++ b/src/serversdk/databaseutils.cpp @@ -109,7 +109,14 @@ QSqlQuery DatabaseUtils::createTable(const DatabaseTable *table, const QString t return mDatabaseManager->execPlainSql(sql); } - +/** + * @brief DatabaseUtils::insertIntoTable + * @param table + * @param table_name + * @return + * + * @todo Loop VariantMap change to Loop over propertiess + */ QSqlQuery DatabaseUtils::insertIntoTable(const DatabaseTable *table, const QString table_name) const { QString columns; @@ -145,6 +152,7 @@ QSqlQuery DatabaseUtils::insertIntoTable(const DatabaseTable *table, const QStri return res; } + QSqlQuery DatabaseUtils::updateTable(const DatabaseTable *table, const QString table_name) const { QString columnsAndValues; @@ -157,7 +165,8 @@ QSqlQuery DatabaseUtils::updateTable(const DatabaseTable *table, const QString t // Primary key is first user property ( first VariantMap item ) // in ( primary key ): id // out: id = :id - primaryKeyCondition = keys.at(0) + " = :" + keys.at(0); + const QString primaryKey = table->primaryKey(); + primaryKeyCondition = primaryKey + " = :" + primaryKey; for (auto _key : keys) { QString key = fromCamelCase(_key); diff --git a/test/auto/database/tst_databasetable.cpp b/test/auto/database/tst_databasetable.cpp index d246662..81f10f9 100644 --- a/test/auto/database/tst_databasetable.cpp +++ b/test/auto/database/tst_databasetable.cpp @@ -105,8 +105,11 @@ void DatabaseTableTest::constructor_test() auto table = std::make_unique(); QCOMPARE(table->id(), 0); QCOMPARE(table->name(), QStringLiteral("Test")); + + QCOMPARE(table->primaryKey(), QStringLiteral("uuid")); } + void DatabaseTableTest::qvariant_test() { auto table = std::make_unique(); diff --git a/test/auto/database/tst_sqlite.cpp b/test/auto/database/tst_sqlite.cpp index f0dab35..9208183 100644 --- a/test/auto/database/tst_sqlite.cpp +++ b/test/auto/database/tst_sqlite.cpp @@ -107,35 +107,45 @@ void SqliteTest::updateTable_test() db.openSQLite(dbpath); QVERIFY(db.isOpen()); - Name names; + Name name_A, name_B; // CREATE TABLE serversdk::DatabaseUtils utils(&db); - QSqlQuery query = utils.createTable(&names, "names"); + QSqlQuery query = utils.createTable(&name_A, "names"); // INSERT INTO TABLE const QString uuidA = "48f64fab-ba2a-40b5-8fbb-75361099dfb6"; - names.set_uuid(uuidA); - names.set_id(2); - names.set_name("Testname"); + const QString uuidB = "d70143ab-8c14-4ee0-85cb-f0d1b72df104"; + name_A.set_uuid(uuidA); + name_A.set_id(2); + name_A.set_name("TestnameA"); + name_B.set_uuid(uuidB); + name_B.set_id(2); + name_B.set_name("TestnameB"); + + + utils.insertIntoTable(&name_A, "names"); + utils.insertIntoTable(&name_B, "names"); - utils.insertIntoTable(&names, "names"); // NOW UPDATING TABLE WITH name: NewName - names.set_name("NewName"); - utils.updateTable(&names, "names"); + name_A.set_name("TestnameA-new"); + utils.updateTable(&name_A, "names"); + name_B.set_name("TestnameB-new"); + utils.updateTable(&name_B, "names"); // SELECT FROM TABLE QSqlQuery selectSQL = db.execPlainSql("SELECT * FROM names"); auto list = utils.tableFromQuery(selectSQL); + QCOMPARE(list.count(), 2); - // ENSURE SAME - QCOMPARE(list.count(), 1); - auto names_tab = list.first(); - QVERIFY(names_tab); - QCOMPARE(names_tab->name(), QStringLiteral("NewName")); + auto dbA = list.first(); + auto dbB = list.last(); + QCOMPARE(dbA->name(), name_A.name()); + QCOMPARE(dbB->name(), name_B.name()); - QCOMPARE(list.first()->jsonData(), names.jsonData()); + QCOMPARE(dbA->jsonData(), name_A.jsonData()); + QCOMPARE(dbB->jsonData(), name_B.jsonData()); } QTEST_APPLESS_MAIN(SqliteTest)