kasts/src/database.cpp

115 lines
3.8 KiB
C++
Raw Normal View History

2020-03-16 22:37:04 +01:00
/**
* Copyright 2020 Tobias Fella <fella@posteo.de>
*
* This program 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) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* 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 General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <QDir>
#include <QStandardPaths>
#include <QSqlError>
#include <QSqlDatabase>
#include <QDateTime>
2020-03-16 22:37:04 +01:00
#include "database.h"
#include "alligatorsettings.h"
2020-03-16 22:37:04 +01:00
#include "alligator-debug.h"
#define TRUE_OR_RETURN(x) if(!x) return false;
Database::Database()
{
QSqlDatabase db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"));
QString databasePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
QDir(databasePath).mkpath(databasePath);
db.setDatabaseName(databasePath + QStringLiteral("/database.db3"));
qCDebug(ALLIGATOR) << "Opening database " << databasePath << "/database.db3";
db.open();
if(!migrate()) {
qCCritical(ALLIGATOR) << "Failed to migrate the database";
}
cleanup();
2020-03-16 22:37:04 +01:00
}
bool Database::migrate() {
qCDebug(ALLIGATOR) << "Migrating database";
if(version() < 1) TRUE_OR_RETURN(migrateTo1());
return true;
}
bool Database::migrateTo1() {
QSqlQuery query(QSqlDatabase::database());
TRUE_OR_RETURN(execute(QStringLiteral("CREATE TABLE IF NOT EXISTS Feeds (name TEXT, url TEXT);")));
TRUE_OR_RETURN(execute(QStringLiteral("CREATE TABLE IF NOT EXISTS Entries (feed TEXT, id TEXT UNIQUE, title TEXT, content TEXT, created INTEGER, updated INTEGER);")));
2020-03-16 22:37:04 +01:00
TRUE_OR_RETURN(execute(QStringLiteral("CREATE TABLE IF NOT EXISTS Authors (id TEXT, name TEXT, uri TEXT, email TEXT);")));
TRUE_OR_RETURN(execute(QStringLiteral("PRAGMA user_version = 1;")));
return true;
}
bool Database::execute(QString query) {
QSqlQuery q;
q.prepare(query);
return execute(q);
}
bool Database::execute(QSqlQuery &query) {
if(!query.exec()) {
qCWarning(ALLIGATOR) << "Failed to execute SQL Query";
qCWarning(ALLIGATOR) << query.lastQuery();
qCWarning(ALLIGATOR) << query.lastError();
return false;
}
return true;
}
int Database::version() {
QSqlQuery query;
query.prepare(QStringLiteral("PRAGMA user_version;"));
execute(query);
if(query.next()) {
bool ok;
int value = query.value(0).toInt(&ok);
qCDebug(ALLIGATOR) << "Database version " << value;
if(ok) return value;
} else {
qCCritical(ALLIGATOR) << "Failed to check database version";
}
return -1;
}
void Database::cleanup() {
AlligatorSettings settings;
int count = settings.deleteAfterCount();
int type = settings.deleteAfterType();
if(type == 0) { // Delete after <count> posts per feed
//TODO
} else {
QDateTime dateTime = QDateTime::currentDateTime();
if(type == 1) dateTime.addDays(-count);
else if(type == 2) dateTime.addDays(-7*count);
else if(type == 3) dateTime.addMonths(-count);
qint64 sinceEpoch = dateTime.toSecsSinceEpoch();
QSqlQuery query;
query.prepare("DELETE FROM Entries WHERE updated < :sinceEpoch;");
query.bindValue(":sinceEpoch", sinceEpoch);
execute(query);
}
}