diff --git a/serversdk.pri b/serversdk.pri index 05e48b7..8e2fea1 100644 --- a/serversdk.pri +++ b/serversdk.pri @@ -31,6 +31,7 @@ win32:CONFIG(release, debug|release): LIBS += -L$$SDKDIR/release/ -lserversdk else:win32:CONFIG(debug, debug|release): LIBS += -L$$SDKDIR/debug/ -lserversdk else:unix: LIBS += -L$$SDKDIR/ -lserversdk +QT += network sql INCLUDEPATH += $$shell_quote($$PWD/src/) DEPENDPATH += $$shell_quote($$PWD/src/serversdk) diff --git a/serversdkint.pri b/serversdkint.pri index 0b72df8..4659012 100644 --- a/serversdkint.pri +++ b/serversdkint.pri @@ -25,7 +25,7 @@ win32:CONFIG(release, debug|release): LIBS += -L$$SDKDIR/release/ -lserversdk else:win32:CONFIG(debug, debug|release): LIBS += -L$$SDKDIR/debug/ -lserversdk else:unix: LIBS += -L$$SDKDIR/ -lserversdk -lz -QT += network +QT += network sql INCLUDEPATH += $$PWD/src/ DEPENDPATH += $$PWD/src/serversdk diff --git a/src/serversdk/databasemanager.cpp b/src/serversdk/databasemanager.cpp index ca09696..9a1e959 100644 --- a/src/serversdk/databasemanager.cpp +++ b/src/serversdk/databasemanager.cpp @@ -1,24 +1,77 @@ #include "databasemanager.h" +#include "logger.h" + + + namespace serversdk { +DatabaseManager::DatabaseManager() +{ +} + DatabaseManager::DatabaseManager(const QString& host, const QString& dbName, const QString& user, const QString& password, bool dryMode) : mDryMode(dryMode) { - db = QSqlDatabase::addDatabase("QPSQL"); - db.setDatabaseName(dbName); - db.setHostName(host); - db.setUserName(user); // home-office stuff -->> db.setPort(80); - db.setPassword(password); - if (db.open()) + mDatabase = QSqlDatabase::addDatabase("QPSQL"); + mDatabase.setDatabaseName(dbName); + mDatabase.setHostName(host); + mDatabase.setUserName(user); // home-office stuff -->> db.setPort(80); + mDatabase.setPassword(password); + if (mDatabase.open()) { - query = QSqlQuery("query", db); + query = QSqlQuery("query", mDatabase); } else { - log("Opening error" + db.lastError().text()); + log("Opening error" + mDatabase.lastError().text()); emit error(); } } +DatabaseManager::~DatabaseManager() +{ + if (mDatabase.isValid()) { + mDatabase.close(); + mDatabase = QSqlDatabase(); // invalidate database + qDebug(sdkdb) << "removing database connection:" << mConnectionName; + QSqlDatabase::removeDatabase(mConnectionName); + } +} + +/** + * @brief Creates new SQLite connection + * @param path to database ( will be created when none ) + * @param connectionName + * @return + */ +bool DatabaseManager::openSQLite(const QString &path, const QString &connectionName) +{ + mConnectionName = connectionName; + mDatabase = QSqlDatabase::addDatabase("QSQLITE", mConnectionName); + mDatabase.setDatabaseName(path); + int res = mDatabase.open(); + + if (!res) { + qInfo(sdkdb) << "Not possible to open database from path:" << path; + } + return res; +} + + +bool DatabaseManager::isValid() const +{ + return mDatabase.isValid(); +} + +bool DatabaseManager::isOpen() const +{ + return mDatabase.isOpen(); +} + +void DatabaseManager::close() +{ + mDatabase.close(); +} + bool DatabaseManager::executeQuery(QSqlQuery &query) { if (mDryMode){ diff --git a/src/serversdk/databasemanager.h b/src/serversdk/databasemanager.h index cd43f22..4da4b98 100644 --- a/src/serversdk/databasemanager.h +++ b/src/serversdk/databasemanager.h @@ -17,7 +17,14 @@ class DatabaseManager : public QObject Q_OBJECT friend class Logger; public: + DatabaseManager(); DatabaseManager(const QString& host, const QString& dbName, const QString& user, const QString& password, bool mDryMode = false); + ~DatabaseManager(); + + bool openSQLite(const QString &path, const QString &connectionName = QStringLiteral("qt_sql_default_connection")); + bool isValid() const; + bool isOpen() const; + void close(); private: bool executeQuery(QSqlQuery &query); @@ -29,7 +36,8 @@ signals: void error(); private: - QSqlDatabase db; + QString mConnectionName; + QSqlDatabase mDatabase; QSqlQuery query; bool mDryMode = false; }; diff --git a/src/serversdk/logger.cpp b/src/serversdk/logger.cpp index 2db66c8..bd6481f 100644 --- a/src/serversdk/logger.cpp +++ b/src/serversdk/logger.cpp @@ -7,6 +7,7 @@ Q_LOGGING_CATEGORY(sdkcore, "sdk.core"); Q_LOGGING_CATEGORY(sdknetwork, "sdk.network"); Q_LOGGING_CATEGORY(sdkutils, "sdk.utils"); +Q_LOGGING_CATEGORY(sdkdb, "sdk.db"); namespace serversdk { diff --git a/src/serversdk/logger.h b/src/serversdk/logger.h index 88868b2..5e1c0e7 100644 --- a/src/serversdk/logger.h +++ b/src/serversdk/logger.h @@ -11,11 +11,11 @@ Q_DECLARE_LOGGING_CATEGORY(sdkcore) Q_DECLARE_LOGGING_CATEGORY(sdknetwork) Q_DECLARE_LOGGING_CATEGORY(sdkutils) +Q_DECLARE_LOGGING_CATEGORY(sdkdb) namespace serversdk { -/** - * # Loggger +/** # Loggger * * Class for logging qDebug qWarning qInfo and qCritical messages * @@ -44,7 +44,21 @@ public: // User defined consumer ( messages will be sent there using insertMessage ) static Logger* sConsumer; - /// Default constructor + /** + * # Default values + * + * * bits - Expected 32bits + * * subjectId - must be valid ( not possible to add token withou valid subject ) + * + * @m_class{m-block m-error} + + @par Third-party license info + This utility depends on the [Magnum engine](https://magnum.graphics). + It's licensed under MIT, so all you need to do is mention it in the + credits of your commercial app. + * + * + */ explicit Logger(QObject *parent = nullptr); @@ -85,7 +99,7 @@ signals: void messageReceived(const serversdk::LoggerMessage &message); void messageListUpdated(); private: - QList mLogMessages; + QList mLogMessages; //!< Test QMutex mMutex; }; diff --git a/test/auto/auto.pro b/test/auto/auto.pro index 85235ea..858079a 100644 --- a/test/auto/auto.pro +++ b/test/auto/auto.pro @@ -3,5 +3,6 @@ TEMPLATE = subdirs SUBDIRS += \ tst_soap \ tst_request \ - tst_database \ + tst_database/tst_database.pro \ + tst_database/tst_sqlite.pro \ tst_utils diff --git a/test/auto/tst_database/tst_database.pro b/test/auto/tst_database/tst_database.pro index 24ef8d8..49cc8db 100644 --- a/test/auto/tst_database/tst_database.pro +++ b/test/auto/tst_database/tst_database.pro @@ -7,3 +7,5 @@ CONFIG -= app_bundle TEMPLATE = app SOURCES += tst_databasetest.cpp + +include(../../test.pri) diff --git a/test/auto/tst_database/tst_databasetest.cpp b/test/auto/tst_database/tst_databasetest.cpp index a6f0de9..4193e6a 100644 --- a/test/auto/tst_database/tst_databasetest.cpp +++ b/test/auto/tst_database/tst_databasetest.cpp @@ -1,5 +1,6 @@ #include +#include "serversdk/databasemanager.h" // add necessary includes here class DatabaseTest : public QObject @@ -11,7 +12,7 @@ public: ~DatabaseTest(); private slots: - void test_case1(); + void createDb_test(); }; @@ -25,7 +26,7 @@ DatabaseTest::~DatabaseTest() } -void DatabaseTest::test_case1() +void DatabaseTest::createDb_test() { } diff --git a/test/auto/tst_database/tst_sqlite.cpp b/test/auto/tst_database/tst_sqlite.cpp new file mode 100644 index 0000000..25d3be0 --- /dev/null +++ b/test/auto/tst_database/tst_sqlite.cpp @@ -0,0 +1,57 @@ +#include + +#include "serversdk/databasemanager.h" +// add necessary includes here + +class SqliteTest : public QObject +{ + Q_OBJECT + +public: + SqliteTest(); + ~SqliteTest(); + +private slots: + void createDb_test(); + +}; + +SqliteTest::SqliteTest() +{ + +} + +SqliteTest::~SqliteTest() +{ + +} + +void SqliteTest::createDb_test() +{ + // Prepare temporary path for database + QTemporaryDir dir; + Q_ASSERT(dir.isValid()); + QString dbpath = dir.path() + "/testdb.sqlite"; + Q_ASSERT(!dbpath.isEmpty()); + Q_ASSERT(!QFileInfo::exists(dbpath)); + + serversdk::DatabaseManager db; + db.openSQLite(dbpath); + Q_ASSERT(db.isValid()); + Q_ASSERT(db.isOpen()); + Q_ASSERT(QFileInfo::exists(dbpath)); + + // Closing database + db.close(); + Q_ASSERT(!db.isOpen()); + + + // Temporary dir cleanup + Q_ASSERT(dir.remove()); + + Q_ASSERT(!QFileInfo::exists(dbpath)); +} + +QTEST_APPLESS_MAIN(SqliteTest) + +#include "tst_sqlite.moc" diff --git a/test/auto/tst_database/tst_sqlite.pro b/test/auto/tst_database/tst_sqlite.pro new file mode 100644 index 0000000..6e2eafd --- /dev/null +++ b/test/auto/tst_database/tst_sqlite.pro @@ -0,0 +1,11 @@ +QT += testlib +QT -= gui + +CONFIG += qt console warn_on depend_includepath testcase +CONFIG -= app_bundle + +TEMPLATE = app + +SOURCES += tst_sqlite.cpp + +include(../../test.pri)