Projekt

Allgemein

Profil

Herunterladen als
Herunterladen (6,47 KB) Statistiken
| Zweig: | Revision:
81c23b56 Christian Ehringfeld
/*
6899f814 Christian Ehringfeld
* Copyright (C) 2015 Christian Ehringfeld <c.ehringfeld@t-online.de>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
81c23b56 Christian Ehringfeld
#include "database.h"
45135a14 Christian Ehringfeld
#include "logger.h"
#include <QDir>
2d59cb88 Christian Ehringfeld
#include "schema/mysqlschema.h"
9cf4747e Christian Ehringfeld
using namespace CuteEntityManager;
81c23b56 Christian Ehringfeld
3938a37e Christian Ehringfeld
Database::Database(QSqlDatabase database, bool logQueries,
f12670e9 Christian Ehringfeld
bool logErrors, MsgType type) {
81c23b56 Christian Ehringfeld
this->database = database;
this->init();
this->connectionName = this->database.connectionName();
3938a37e Christian Ehringfeld
this->initLogger(logQueries, logErrors, type);
81c23b56 Christian Ehringfeld
}

e0e1ead8 Christian Ehringfeld
Database::Database(QString databaseType, QString connectionName,
QString hostname,
QString databasename,
54538efb Christian Ehringfeld
QString username, QString password, qint64 port,
f12670e9 Christian Ehringfeld
bool logQueries, bool logErrors, QString databaseOptions, MsgType type) {
426974c6 Christian Ehringfeld
this->database = QSqlDatabase::addDatabase(databaseType, connectionName);
81c23b56 Christian Ehringfeld
this->connectionName = connectionName;
9971e7d2 Christian Ehringfeld
if (!hostname.isEmpty()) {
a82e4cea Christian Ehringfeld
this->database.setHostName(hostname);
}
9971e7d2 Christian Ehringfeld
if (!databasename.isEmpty()) {
a82e4cea Christian Ehringfeld
this->database.setDatabaseName(databasename);
}
9971e7d2 Christian Ehringfeld
if (!username.isEmpty()) {
a82e4cea Christian Ehringfeld
this->database.setUserName(username);
}
9971e7d2 Christian Ehringfeld
if (!password.isEmpty()) {
a82e4cea Christian Ehringfeld
this->database.setPassword(password);
}
if (port != 0) {
this->database.setPort(port);
}
2d59cb88 Christian Ehringfeld
if (!databaseOptions.isEmpty()) {
9971e7d2 Christian Ehringfeld
this->database.setConnectOptions(databaseOptions);
}
81c23b56 Christian Ehringfeld
this->init();
3938a37e Christian Ehringfeld
this->initLogger(logQueries, logErrors, type);
}

Logger *Database::getLogger() const {
return logger;
81c23b56 Christian Ehringfeld
}

void Database::init() {
this->database.open();
e0e1ead8 Christian Ehringfeld
this->supportTransactions = this->database.driver()->hasFeature(
66704054 Christian Ehringfeld
QSqlDriver::Transactions);
45135a14 Christian Ehringfeld
}

3938a37e Christian Ehringfeld
void Database::initLogger(bool logQueries, bool logErrors,
f12670e9 Christian Ehringfeld
MsgType type) {
45135a14 Christian Ehringfeld
this->logQueries = logQueries;
this->logErrors = logErrors;
3938a37e Christian Ehringfeld
this->logger = new Logger(QDir::currentPath() + "/db" + this->connectionName +
".log", type);
81c23b56 Christian Ehringfeld
}

Database::~Database() {
66704054 Christian Ehringfeld
if (this->logger) {
delete this->logger;
this->logger = nullptr;
45135a14 Christian Ehringfeld
}
426974c6 Christian Ehringfeld
if (this->database.isOpen()) {
81c23b56 Christian Ehringfeld
this->database.close();
}
QSqlDatabase::removeDatabase(this->connectionName);
}

QString Database::getConnectionName() {
return this->connectionName;
}

QSqlQuery Database::getQuery() {
return QSqlQuery(this->database);
}

QSqlQuery Database::getQuery(const QString &prepare) {
QSqlQuery q = QSqlQuery(this->database);
q.prepare(prepare);
return q;
}

bool Database::transaction(const QStringList &queries) {
bool ok = false;
426974c6 Christian Ehringfeld
if (this->supportTransactions) {
81c23b56 Christian Ehringfeld
this->database.transaction();
QSqlQuery sqlquery = QSqlQuery(this->database);
for (int var = 0; var < queries.size(); ++var) {
sqlquery.exec(queries.at(var));
45135a14 Christian Ehringfeld
this->debugQuery(sqlquery);
81c23b56 Christian Ehringfeld
}
11bbe9a6 Christian Ehringfeld
ok = this->commitTransaction();
81c23b56 Christian Ehringfeld
} else {
ok = this->exec(queries);
}
return ok;
}

bool Database::transaction(QList<QSqlQuery> &queries) {
11bbe9a6 Christian Ehringfeld
this->startTransaction();
81c23b56 Christian Ehringfeld
QSqlQuery q;
for (int var = 0; var < queries.size(); ++var) {
q = queries.at(var);
q.exec();
d568923d Christian Ehringfeld
this->debugQuery(q);
81c23b56 Christian Ehringfeld
}
11bbe9a6 Christian Ehringfeld
return this->commitTransaction();
}


bool Database::commitTransaction() {
d2c13492 Christian Ehringfeld
return this->supportTransactions && this->database.commit();
95b60eb2 Christian Ehringfeld
}

bool Database::rollbackTransaction() {
1701766b Christian Ehringfeld
this->logger->logMsg("Transaction rolled back!" +
this->database.lastError().text(), MsgType::WARNING);
95b60eb2 Christian Ehringfeld
return supportTransactions && this->database.rollback();
81c23b56 Christian Ehringfeld
}

3820ae33 Christian Ehringfeld
DatabaseType Database::getDatabaseType(QString s) {
if (s == "qmysql") {
return DatabaseType::MYSQL;
} else if (s == "qpgsql") {
return DatabaseType::PGSQL;
} else {
return DatabaseType::SQLITE;
}
}

35cf13b7 Christian Ehringfeld
QSharedPointer<Schema> Database::getSchema(DatabaseType db,
66704054 Christian Ehringfeld
QSharedPointer<Database> database) {
3820ae33 Christian Ehringfeld
switch (db) {
35cf13b7 Christian Ehringfeld
case DatabaseType::SQLITE:
3820ae33 Christian Ehringfeld
return QSharedPointer<Schema>(new SqliteSchema(database));;
break;
66704054 Christian Ehringfeld
// case PGSQL:
// return QSharedPointer<Schema>(new PgSqlSchema());
// break;
2d59cb88 Christian Ehringfeld
case DatabaseType::MYSQL:
return QSharedPointer<Schema>(new MysqlSchema(database));
break;
3820ae33 Christian Ehringfeld
default:
return QSharedPointer<Schema>(new SqliteSchema(database));
break;
}
}

d568923d Christian Ehringfeld
bool Database::exec(const QString &query) {
81c23b56 Christian Ehringfeld
QSqlQuery q = QSqlQuery(this->database);
11bbe9a6 Christian Ehringfeld
bool ok = q.exec(query);
d568923d Christian Ehringfeld
this->debugQuery(q);
11bbe9a6 Christian Ehringfeld
return ok;
81c23b56 Christian Ehringfeld
}

426974c6 Christian Ehringfeld
bool Database::exec(QStringList queries) {
81c23b56 Christian Ehringfeld
QSqlQuery q = QSqlQuery(this->database);
bool ok = true;
for (int var = 0; var < queries.size() && ok; ++var) {
ok = q.exec(queries.at(var));
d568923d Christian Ehringfeld
this->debugQuery(q);
426974c6 Christian Ehringfeld
if (!ok) {
81c23b56 Christian Ehringfeld
break;
}
}
return ok;
}

d568923d Christian Ehringfeld
bool Database::exec(QSqlQuery &query) {
bool ok = query.exec();
this->debugQuery(query);
return ok;
81c23b56 Christian Ehringfeld
}

bool Database::exec(QList<QSqlQuery> queries) {
bool ok = true;
QSqlQuery q = QSqlQuery(this->database);
for (int var = 0; var < queries.size() && ok; ++var) {
q = queries.at(var);
ok = q.exec();
d568923d Christian Ehringfeld
this->debugQuery(q);
426974c6 Christian Ehringfeld
if (!ok) {
81c23b56 Christian Ehringfeld
break;
}
}
return ok;
}

d568923d Christian Ehringfeld
void Database::debugQuery(const QSqlQuery &query) const {
66704054 Christian Ehringfeld
if (this->logger && this->logErrors) {
this->logger->lastError(query, this->logQueries);
45135a14 Christian Ehringfeld
} else {
qDebug() << query.executedQuery();
}
d568923d Christian Ehringfeld
}

81c23b56 Christian Ehringfeld
bool Database::select(QSqlQuery &query) {
query.setForwardOnly(true);
ed9ffe4a Christian Ehringfeld
bool ok = query.exec();
d568923d Christian Ehringfeld
this->debugQuery(query);
return ok;
81c23b56 Christian Ehringfeld
}

QSqlQuery Database::select(const QString &query) {
QSqlQuery q = QSqlQuery(this->database);
q.exec(query);
d568923d Christian Ehringfeld
this->debugQuery(q);
81c23b56 Christian Ehringfeld
return q;
}

11bbe9a6 Christian Ehringfeld
void Database::startTransaction() {
this->database.transaction();
}

81c23b56 Christian Ehringfeld
QSqlDatabase Database::getDatabase() {
return this->database;
}