/*
* Copyright (C) 2010 Ixonos Plc.
* Copyright (C) 2011-2021 Philipp Spitzer, gregor herrmann, Stefan Stahl
*
* This file is part of ConfClerk.
*
* ConfClerk is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 2 of the License, or (at your option)
* any later version.
*
* ConfClerk 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 General Public License along with
* ConfClerk. If not, see .
*/
#ifndef SQLENGINE_H
#define SQLENGINE_H
#include
#include
#include
class SqlEngine : public QObject {
Q_OBJECT
public:
const QString DATE_FORMAT; // "yyyy-MM-dd"
const QString TIME_FORMAT; // "hh:mm"
QString dbFilename; ///< database filename including path
QSqlDatabase db; ///< this may be private one day...
SqlEngine(QObject *aParent = NULL);
~SqlEngine();
// Open/Close
void open(); ///< emits a database error if failed.
bool isOpen() const {return db.isOpen();}
void close() {db.close();}
// Schema version
/// returns the "user_version" of the database schema
/// we return -1 for an empty database
/// the database has to be open
/// returns -2 if an error occurs and emits the error message
int dbSchemaVersion();
/// called by createOrUpdateDbSchema. Do not use directly. true for success.
bool updateDbSchemaVersion000To001();
bool updateDbSchemaVersion001To002();
/// called by createOrUpdateDbSchma. Do not use directly. true for success.
bool createCurrentDbSchema();
/// creates the current database schema if an empty database is found,
/// otherwise updates the schema if an old one is found. true for success.
bool createOrUpdateDbSchema();
/// Applies an SQL file
bool applySqlFile(const QString sqlFile);
// if a conferenceId != 0 is given, the conference is updated instead of inserted.
void addConferenceToDB(QHash &aConference, int conferenceId, bool omit_display_time_shift = false);
void addEventToDB(QHash &aEvent);
void addPersonToDB(QHash &aPerson);
void addLinkToDB(QHash &aLink);
void addRoomToDB(QHash &aRoom);
bool deleteConference(int id);
bool beginTransaction();
bool commitTransaction();
bool rollbackTransaction();
/// search Events for .... returns true if success
bool searchEvent(int conferenceId, const QMultiHash &columns, const QString &keyword);
private:
static QString login(const QString &aDatabaseType, const QString &aDatabaseName);
/// emits a possible error message as signal. Does nothing if there was not last error
void emitSqlQueryError(const QSqlQuery& query);
signals:
/// emitted when a database errors occur
void dbError(const QString& message);
};
class TransactionRaii {
SqlEngine& sqlEngine;
bool committed;
public:
TransactionRaii(SqlEngine& sqlEngine): sqlEngine(sqlEngine), committed(false) {
sqlEngine.beginTransaction();
}
void commit() {
sqlEngine.commitTransaction();
committed = true;
}
~TransactionRaii() {
if (!committed) sqlEngine.rollbackTransaction();
}
};
#endif /* SQLENGINE_H */