server-sdk/src/serversdk/databasemanager.cpp

173 lines
4.2 KiB
C++

#include "databasemanager.h"
#include "logger.h"
namespace serversdk {
DatabaseManager::DatabaseManager()
{
}
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::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);
// @see https://www.qtcentre.org/threads/39913-QSqlDatabase-connection-timeout
mDatabase.setConnectOptions("connect_timeout=10");
int res = mDatabase.open();
if (!res) {
qInfo(sdkdb) << "Not possible to open database from url:" << host;
}
return res;
}
bool DatabaseManager::isValid() const
{
return mDatabase.isValid();
}
bool DatabaseManager::isOpen() const
{
return mDatabase.isOpen();
}
void DatabaseManager::close()
{
mDatabase.close();
}
QSqlQuery DatabaseManager::execPlainSql(const QString &sqlText)
{
QSqlQuery query(mDatabase);
return executeQuery(query, sqlText);
}
QSqlQuery DatabaseManager::executeQuery(QSqlQuery &query, const QString &sqlText)
{
// Get correct SQL statement and correct isSelect
// Need for output correct SQL command
// isSelect is needed for correct bahaviour of 'dryMode' only select should be executed
QString sqlStatement = sqlText;
bool isSelect = false;
if ( sqlText.isEmpty()) {
sqlStatement = getLastQuery(query);
}
if (sqlText.startsWith("SELECT", Qt::CaseInsensitive)) {
isSelect = true;
}
if (mDryMode) {
qCInfo(sdkdb) << "SQL statement: " << sqlStatement;
}
// Execute only SELECT statement or when not drymode
if ( isSelect || !mDryMode ) {
int res = false;
if ( ! sqlText.isEmpty()) { // prepared statement.
res = query.exec(sqlText);
return processResult(res, query);
}
res = query.exec();
return processResult(res, query);
}
return query;
}
QSqlQuery DatabaseManager::createQuery()
{
QSqlQuery query(mDatabase);
return query;
}
QSqlQuery DatabaseManager::processResult(int res, const QSqlQuery &query) const
{
if ( !res ) {
QString msg = QString("Source: Database Manager \nError --------\n%1\nSQL-------\n%2\n--------")
.arg(query.lastError().text(), query.lastQuery());
qCDebug(sdkdb).noquote() << msg;
emit sqlError(query);
log(msg);
}
return query;
}
QString DatabaseManager::getLastQuery(const QSqlQuery& query) const
{
QString str = query.lastQuery();
QMapIterator<QString, QVariant> it(query.boundValues());
while (it.hasNext())
{
it.next();
str.replace(it.key(),it.value().toString());
}
return str;
}
void DatabaseManager::log(const QString &msg) const
{
qDebug() << "database logger implement logger";
qDebug() << msg;
}
bool DatabaseManager::dryMode() const
{
return mDryMode;
}
void DatabaseManager::setDryMode(bool dryMode)
{
mDryMode = dryMode;
}
QSqlDatabase DatabaseManager::database() const
{
Q_ASSERT(mDatabase.isValid());
return mDatabase;
}
} // core