diff --git a/src/serversdk/databaseutils.cpp b/src/serversdk/databaseutils.cpp index 298fe11..d4fa87d 100644 --- a/src/serversdk/databaseutils.cpp +++ b/src/serversdk/databaseutils.cpp @@ -79,7 +79,7 @@ QString DatabaseUtils::createTableText(const DatabaseTable *table, const QString // in: PRIMARY KEY // out: "CREATE TABLE colnod_subject ( id TEXT PRIMARY KEY" if (first) { // first row - sql += " PRIMARY KEY"; + sql += " PRIMARY KEY NOT NULL"; first = false; } @@ -105,6 +105,7 @@ QSqlQuery DatabaseUtils::createTable(const DatabaseTable *table, const QString t { // CREATE TABLE ... QString sql = createTableText(table, tableName); + qCDebug(sdkdb) << "SQL:" << sql; return mDatabaseManager->execPlainSql(sql); } @@ -147,14 +148,17 @@ QSqlQuery DatabaseUtils::insertIntoTable(const DatabaseTable *table, const QStri QSqlQuery DatabaseUtils::updateTable(const DatabaseTable *table, const QString table_name) const { QString columnsAndValues; - - // tepmporary, for edit ( add one more parameter to func sth like QList with conditions - QString conditions; - conditions = "id = :id"; + QString primaryKeyCondition; QVariantMap valueMap = table->toVariantMap(); - auto keys = valueMap.keys(); + + Q_ASSERT(!keys.isEmpty()); + // Primary key is first user property ( first VariantMap item ) + // in ( primary key ): id + // out: id = :id + primaryKeyCondition = keys.at(0) + " = :" + keys.at(0); + for (auto _key : keys) { QString key = fromCamelCase(_key); if (!columnsAndValues.isEmpty()) { @@ -164,7 +168,7 @@ QSqlQuery DatabaseUtils::updateTable(const DatabaseTable *table, const QString t } QSqlQuery query(mDatabaseManager->database()); - QString queryText = QString("UPDATE %1 SET %2 WHERE %3;").arg(table_name).arg(columnsAndValues).arg(conditions); + QString queryText = QString("UPDATE %1 SET %2 WHERE %3;").arg(table_name).arg(columnsAndValues).arg(primaryKeyCondition); query.prepare(queryText); for (auto _key : keys ) { diff --git a/src/serversdk/databaseutils.h b/src/serversdk/databaseutils.h index 99c686e..0aefe71 100644 --- a/src/serversdk/databaseutils.h +++ b/src/serversdk/databaseutils.h @@ -35,7 +35,9 @@ public: int total = rec.count(); QMap map; for (int column = 0; column < total; ++column) { - map.insert(rec.fieldName(column), query.value(column)); + QString columnName = rec.fieldName(column); + QString propertyName = toCamelCase(columnName); + map.insert(propertyName, query.value(column)); } auto data = std::make_shared(); diff --git a/test/auto/database/tst_databaseutils.cpp b/test/auto/database/tst_databaseutils.cpp index 442f8c3..6b2547b 100644 --- a/test/auto/database/tst_databaseutils.cpp +++ b/test/auto/database/tst_databaseutils.cpp @@ -55,7 +55,7 @@ void DatabaseUtilsTest::createTable_test() QString sql = utils.createTableText(table.get(), "subjects"); QString expected = "CREATE TABLE subjects ( " - "id TEXT PRIMARY KEY, " + "id TEXT PRIMARY KEY NOT NULL, " "description TEXT, " "last_update INTEGER, " "name TEXT, " diff --git a/test/auto/database/tst_postgresql.cpp b/test/auto/database/tst_postgresql.cpp index 11efa56..bf1833b 100644 --- a/test/auto/database/tst_postgresql.cpp +++ b/test/auto/database/tst_postgresql.cpp @@ -6,7 +6,7 @@ // add necessary includes here -class Names : public serversdk::DatabaseTable { +class Name : public serversdk::DatabaseTable { Q_OBJECT TABLE_PROPERTY(int, id, set_id, 0); TABLE_PROPERTY(QString, name, set_name, 0); @@ -68,7 +68,7 @@ void PostgresqlTest::createTable_test() QVERIFY(db.isValid()); QVERIFY(db.isOpen()); - Names names; + Name names; //Have to drop tabel QSqlQuery dropQuery = db.execPlainSql("DROP TABLE names"); @@ -87,13 +87,13 @@ void PostgresqlTest::createTable_test() // SELECT FROM TABLE QSqlQuery selectSQL = db.execPlainSql("SELECT * FROM names"); - auto list = utils.tableFromQuery(selectSQL); + auto list = utils.tableFromQuery(selectSQL); // ENSURE SAME auto first = list.first(); // Problem is that fromListvariantMap returns shared_ptr of class DataTable // Must subclass. - auto names_tab = std::dynamic_pointer_cast(first); + auto names_tab = std::dynamic_pointer_cast(first); QCOMPARE(list.count(), 1); QCOMPARE(names_tab->name(), QStringLiteral("Testname")); diff --git a/test/auto/database/tst_sqlite.cpp b/test/auto/database/tst_sqlite.cpp index 6480e04..f0dab35 100644 --- a/test/auto/database/tst_sqlite.cpp +++ b/test/auto/database/tst_sqlite.cpp @@ -6,10 +6,12 @@ // add necessary includes here -class Names : public serversdk::DatabaseTable { +class Name : public serversdk::DatabaseTable { Q_OBJECT + TABLE_PROPERTY(QString, uuid, set_uuid, QString()); TABLE_PROPERTY(int, id, set_id, 0); - TABLE_PROPERTY(QString, name, set_name, 0); + TABLE_PROPERTY(QString, name, set_name, ""); + TABLE_PROPERTY(QString, vehicleName, set_vehicle_name, "Škodouliňkaťoučký"); }; @@ -18,24 +20,14 @@ class SqliteTest : public QObject Q_OBJECT public: - SqliteTest(); - ~SqliteTest(); + SqliteTest() = default; private slots: void createDb_test(); void createTable_test(); - + void updateTable_test(); }; -SqliteTest::SqliteTest() -{ - -} - -SqliteTest::~SqliteTest() -{ - -} void SqliteTest::createDb_test() { @@ -72,27 +64,76 @@ void SqliteTest::createTable_test() db.openSQLite(dbpath); QVERIFY(db.isOpen()); - Names names; + Name name_A, name_B; + + // CREATE TABLE + serversdk::DatabaseUtils utils(&db); + QSqlQuery query = utils.createTable(&name_A, "names"); + + // INSERT INTO TABLE + const QString uuidA = "48f64fab-ba2a-40b5-8fbb-75361099dfb6"; + 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"); + + // SELECT FROM TABLE + QSqlQuery selectSQL = db.execPlainSql("SELECT * FROM names"); + auto list = utils.tableFromQuery(selectSQL); + + + // ENSURE SAME + QCOMPARE(list.count(), 2); + auto names_tab = list.first(); + qDebug() << "Uuid" << names_tab->uuid(); + QVERIFY(names_tab); + QCOMPARE(names_tab->name(), QStringLiteral("TestnameA")); + + QCOMPARE(list.first()->jsonData(), name_A.jsonData()); +} + +void SqliteTest::updateTable_test() +{ + // Prepare temporary path for database + QTemporaryDir dir; + QString dbpath = dir.path() + "/testdb.sqlite"; + serversdk::DatabaseManager db; + db.openSQLite(dbpath); + QVERIFY(db.isOpen()); + + Name names; // CREATE TABLE serversdk::DatabaseUtils utils(&db); QSqlQuery query = utils.createTable(&names, "names"); // INSERT INTO TABLE + const QString uuidA = "48f64fab-ba2a-40b5-8fbb-75361099dfb6"; + names.set_uuid(uuidA); names.set_id(2); names.set_name("Testname"); utils.insertIntoTable(&names, "names"); + // NOW UPDATING TABLE WITH name: NewName + names.set_name("NewName"); + utils.updateTable(&names, "names"); + // SELECT FROM TABLE QSqlQuery selectSQL = db.execPlainSql("SELECT * FROM names"); - auto list = utils.tableFromQuery(selectSQL); + auto list = utils.tableFromQuery(selectSQL); // ENSURE SAME QCOMPARE(list.count(), 1); auto names_tab = list.first(); QVERIFY(names_tab); - QCOMPARE(names_tab->name(), QStringLiteral("Testname")); + QCOMPARE(names_tab->name(), QStringLiteral("NewName")); QCOMPARE(list.first()->jsonData(), names.jsonData()); }