added support for Postgresql database

This commit is contained in:
Filip Bucek 2019-11-12 17:42:54 +01:00
parent c4c51e5099
commit 16fe2db973
8 changed files with 178 additions and 33 deletions

View File

@ -10,22 +10,7 @@ DatabaseManager::DatabaseManager()
{ {
} }
DatabaseManager::DatabaseManager(const QString& host, const QString& dbName, const QString& user, const QString& password, bool dryMode)
: mDryMode(dryMode)
{
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", mDatabase);
} else {
log("Opening error" + mDatabase.lastError().text());
emit error();
}
}
DatabaseManager::~DatabaseManager() DatabaseManager::~DatabaseManager()
{ {
@ -48,6 +33,7 @@ bool DatabaseManager::openSQLite(const QString &path, const QString &connectionN
mConnectionName = connectionName; mConnectionName = connectionName;
mDatabase = QSqlDatabase::addDatabase("QSQLITE", mConnectionName); mDatabase = QSqlDatabase::addDatabase("QSQLITE", mConnectionName);
mDatabase.setDatabaseName(path); mDatabase.setDatabaseName(path);
int res = mDatabase.open(); int res = mDatabase.open();
if (!res) { if (!res) {
@ -56,6 +42,25 @@ bool DatabaseManager::openSQLite(const QString &path, const QString &connectionN
return res; return res;
} }
bool DatabaseManager::openPostgres(const QString &host, const QString &dbName, const QString &user, const QString &password, const QString &connectionName)
{
Q_ASSERT_X(mConnectionName.isEmpty(), "open postgres", "Expecting only one database per DatabaseManager");
mConnectionName = connectionName;
mDatabase = QSqlDatabase::addDatabase("QPSQL", mConnectionName);
mDatabase.setDatabaseName(dbName);
mDatabase.setHostName(host);
mDatabase.setUserName(user); // home-office stuff -->> db.setPort(80);
mDatabase.setPassword(password);
int res = mDatabase.open();
if (!res) {
qInfo(sdkdb) << "Not possible to open database from url:" << host;
}
return res;
}
bool DatabaseManager::isValid() const bool DatabaseManager::isValid() const
{ {
@ -116,8 +121,9 @@ QSqlQuery DatabaseManager::executeQuery(QSqlQuery &query, const QString &sqlText
QSqlQuery DatabaseManager::processResult(int res, const QSqlQuery &query) const QSqlQuery DatabaseManager::processResult(int res, const QSqlQuery &query) const
{ {
if ( !res ) { if ( !res ) {
QString msg = QString("Source: Database Manager, Error: %1").arg(query.lastError().text()); QString msg = QString("Source: Database Manager \nError --------\n%1\nSQL-------\n%2\n--------")
qCWarning(sdkdb) << msg; .arg(query.lastError().text(), query.lastQuery());
qCDebug(sdkdb).noquote() << msg;
log(msg); log(msg);
} }
return query; return query;

View File

@ -27,6 +27,7 @@ public:
bool openSQLite(const QString &path, const QString &connectionName = QStringLiteral("qt_sql_default_connection")); bool openSQLite(const QString &path, const QString &connectionName = QStringLiteral("qt_sql_default_connection"));
bool openPostgres(const QString& host, const QString& dbName, const QString& user, const QString& password, const QString &connectionName = QStringLiteral("qt_sql_default_connection"));
bool isValid() const; bool isValid() const;
bool isOpen() const; bool isOpen() const;
void close(); void close();

View File

@ -15,7 +15,7 @@ namespace serversdk {
* @return * @return
* *
* @code{sql} * @code{sql}
* "CREATE TABLE colnod_subject (" * "CREATE TABLE colsunod_bject ("
"id character(36) primary key NOT NULL," "id character(36) primary key NOT NULL,"
"description character varying(255)," "description character varying(255),"
"last_update timestamp NOT NULL," "last_update timestamp NOT NULL,"
@ -66,9 +66,8 @@ QString DatabaseUtils::createTableText(const DatabaseTable *table, const QString
if (sqlType() == "SQLITE") { if (sqlType() == "SQLITE") {
textType = this->textSQLIteType(type); textType = this->textSQLIteType(type);
} else if (sqlType() == "PSQL") { } else if (sqlType() == "PSQL") {
qCDebug(sdkdb) << "Implemented only for SQLITE"; textType = this->textSQLIteType(type);
return QString(); //return QString();
} else { } else {
qCDebug(sdkdb) << "Implemented only for SQLITE"; qCDebug(sdkdb) << "Implemented only for SQLITE";
return QString(); return QString();
@ -130,7 +129,7 @@ QSqlQuery DatabaseUtils::insertIntoTable(const DatabaseTable *table, const QStri
} }
QSqlQuery query(mDatabaseManager->database()); QSqlQuery query(mDatabaseManager->database());
QString queryText = QString("INSERT OR IGNORE INTO %1 ( %2 ) VALUES ( %3 );").arg(table_name).arg(columns).arg(values); QString queryText = QString("INSERT INTO %1 ( %2 ) VALUES ( %3 );").arg(table_name).arg(columns).arg(values);
query.prepare(queryText); query.prepare(queryText);
for (auto key : keys ) { for (auto key : keys ) {
@ -193,6 +192,30 @@ QString DatabaseUtils::textSQLIteType(QVariant::Type type) const
} }
} }
QString DatabaseUtils::textPostgresType(QVariant::Type type) const
{
switch (type) {
case QVariant::Int:
return QStringLiteral("INTEGER");
break;
case QVariant::Uuid:
return QStringLiteral("TEXT");
break;
case QVariant::String:
return QStringLiteral("TEXT");
break;
case QVariant::DateTime:
return QStringLiteral("INTEGER");
break;
case QVariant::Bool:
return QStringLiteral("INTEGER");
break;
default:
return QString();
break;
}
}
} // namespace serversdk } // namespace serversdk

View File

@ -32,6 +32,7 @@ private:
QString textSQLIteType(QVariant::Type type) const; QString textSQLIteType(QVariant::Type type) const;
QString textPostgresType(QVariant::Type type) const;
private: private:
DatabaseManager *mDatabaseManager = nullptr; DatabaseManager *mDatabaseManager = nullptr;
QString mSqlType; QString mSqlType;

View File

@ -6,6 +6,7 @@ SUBDIRS += \
request/tst_requestmanager.pro \ request/tst_requestmanager.pro \
database/tst_databasemanager.pro \ database/tst_databasemanager.pro \
database/tst_sqlite.pro \ database/tst_sqlite.pro \
database/tst_postgresql.pro \
database/tst_databasetable.pro \ database/tst_databasetable.pro \
database/tst_databaseutils.pro \ database/tst_databaseutils.pro \
tst_utils tst_utils

View File

@ -0,0 +1,102 @@
#include <QtTest>
#include "serversdk/databasemanager.h"
#include "serversdk/databaseutils.h"
#include "serversdk/core.h"
// add necessary includes here
class Names : public serversdk::DatabaseTable {
Q_OBJECT
TABLE_PROPERTY(int, id, set_id, 0);
TABLE_PROPERTY(QString, name, set_name, 0);
};
class PostgresqlTest : public QObject
{
Q_OBJECT
public:
PostgresqlTest();
~PostgresqlTest();
private slots:
void opendb_test();
void createTable_test();
};
PostgresqlTest::PostgresqlTest()
{
}
PostgresqlTest::~PostgresqlTest()
{
}
void PostgresqlTest::opendb_test()
{
// Prepare temporary path for database
const QString host = "192.168.1.94";
const QString databaseName = "serversdk";
const QString user = "postgres";
const QString password = "34rjkciea12";
serversdk::DatabaseManager db;
db.openPostgres(host, databaseName, user, password);
QVERIFY(db.isValid());
QVERIFY(db.isOpen());
// Closing database
db.close();
QVERIFY(!db.isOpen());
}
void PostgresqlTest::createTable_test()
{
// Prepare temporary path for database
const QString host = "192.168.1.94";
const QString databaseName = "serversdk";
const QString user = "postgres";
const QString password = "34rjkciea12";
serversdk::DatabaseManager db;
db.openPostgres(host, databaseName, user, password);
QVERIFY(db.isValid());
QVERIFY(db.isOpen());
Names names;
//Have to drop tabel
QSqlQuery dropQuery = db.execPlainSql("DROP TABLE names");
//QVERIFY(dropQuery.isValid());
// CREATE TABLE
serversdk::DatabaseUtils utils(&db, "PSQL");
QSqlQuery query = utils.createTable(&names, "names");
//QVERIFY(query.isValid());
// INSERT INTO TABLE
names.set_id(2);
names.set_name("Testname");
utils.insertIntoTable(&names, "names");
// SELECT FROM TABLE
QSqlQuery selectSQL = db.execPlainSql("SELECT * FROM names");
auto listVariantMap = utils.listMapFromQuery(selectSQL);
auto list = Names::fromListVariantMap(listVariantMap);
// ENSURE SAME
QCOMPARE(list.count(), 1);
QCOMPARE(list.first()->name(), QStringLiteral("Testname"));
QCOMPARE(list.first()->jsonData(), names.jsonData());
}
QTEST_APPLESS_MAIN(PostgresqlTest)
#include "tst_postgresql.moc"

View File

@ -0,0 +1,11 @@
QT += testlib
QT -= gui
CONFIG += qt console warn_on depend_includepath testcase
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += tst_postgresql.cpp
include(../../test.pri)

View File

@ -41,26 +41,26 @@ void SqliteTest::createDb_test()
{ {
// Prepare temporary path for database // Prepare temporary path for database
QTemporaryDir dir; QTemporaryDir dir;
Q_ASSERT(dir.isValid()); QVERIFY(dir.isValid());
QString dbpath = dir.path() + "/testdb.sqlite"; QString dbpath = dir.path() + "/testdb.sqlite";
Q_ASSERT(!dbpath.isEmpty()); QVERIFY(!dbpath.isEmpty());
Q_ASSERT(!QFileInfo::exists(dbpath)); QVERIFY(!QFileInfo::exists(dbpath));
serversdk::DatabaseManager db; serversdk::DatabaseManager db;
db.openSQLite(dbpath); db.openSQLite(dbpath);
Q_ASSERT(db.isValid()); QVERIFY(db.isValid());
Q_ASSERT(db.isOpen()); QVERIFY(db.isOpen());
Q_ASSERT(QFileInfo::exists(dbpath)); QVERIFY(QFileInfo::exists(dbpath));
// Closing database // Closing database
db.close(); db.close();
Q_ASSERT(!db.isOpen()); QVERIFY(!db.isOpen());
// Temporary dir cleanup // Temporary dir cleanup
Q_ASSERT(dir.remove()); QVERIFY(dir.remove());
Q_ASSERT(!QFileInfo::exists(dbpath)); QVERIFY(!QFileInfo::exists(dbpath));
} }
void SqliteTest::createTable_test() void SqliteTest::createTable_test()
@ -70,7 +70,7 @@ void SqliteTest::createTable_test()
QString dbpath = dir.path() + "/testdb.sqlite"; QString dbpath = dir.path() + "/testdb.sqlite";
serversdk::DatabaseManager db; serversdk::DatabaseManager db;
db.openSQLite(dbpath); db.openSQLite(dbpath);
Q_ASSERT(db.isOpen()); QVERIFY(db.isOpen());