File indexing completed on 2024-05-12 16:25:41

0001 /*
0002    SPDX-FileCopyrightText: 2023-2024 Laurent Montel <montel.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "globaldatabase.h"
0008 #include "localdatabaseutils.h"
0009 #include "ruqola_database_debug.h"
0010 
0011 #include <QSqlError>
0012 #include <QSqlQuery>
0013 #include <QSqlRecord>
0014 #include <QSqlTableModel>
0015 
0016 static const char s_schemaGlobalDataBase[] = "CREATE TABLE GLOBAL (identifier TEXT PRIMARY KEY NOT NULL, timestamp INTEGER)";
0017 enum class GlobalFields {
0018     Identifier,
0019     TimeStamp,
0020 }; // in the same order as the table
0021 
0022 GlobalDatabase::GlobalDatabase()
0023     : LocalDatabaseBase(LocalDatabaseUtils::localGlobalDatabasePath(), LocalDatabaseBase::DatabaseType::Global)
0024 {
0025 }
0026 
0027 GlobalDatabase::~GlobalDatabase() = default;
0028 
0029 QString GlobalDatabase::schemaDataBase() const
0030 {
0031     return QString::fromLatin1(s_schemaGlobalDataBase);
0032 }
0033 
0034 QString GlobalDatabase::generateIdentifier(const QString &accountName, const QString &roomName, TimeStampType type)
0035 {
0036     QString identifier;
0037     if (accountName.isEmpty()) {
0038         return identifier;
0039     }
0040     switch (type) {
0041     case TimeStampType::MessageTimeStamp:
0042         identifier = QStringLiteral("messages-");
0043         break;
0044     case TimeStampType::RoomTimeStamp:
0045         identifier = QStringLiteral("rooms-");
0046         break;
0047     case TimeStampType::AccountTimeStamp:
0048         identifier = QStringLiteral("account-");
0049         break;
0050     }
0051     identifier += accountName;
0052     if (roomName.isEmpty() && type != TimeStampType::AccountTimeStamp) {
0053         qCWarning(RUQOLA_DATABASE_LOG) << "Missing roomName! It's a bug!!!";
0054     }
0055     if (!roomName.isEmpty()) {
0056         identifier += QLatin1Char('-') + LocalDatabaseUtils::fixRoomName(roomName);
0057     }
0058     return identifier;
0059 }
0060 
0061 void GlobalDatabase::insertOrReplaceTimeStamp(const QString &accountName, const QString &roomName, qint64 timestamp, TimeStampType type)
0062 {
0063     QSqlDatabase db;
0064     if (initializeDataBase(accountName, db)) {
0065         const QString identifier = generateIdentifier(accountName, roomName, type);
0066         QSqlQuery query(LocalDatabaseUtils::insertReplaceGlobal(), db);
0067         query.addBindValue(identifier);
0068         query.addBindValue(timestamp);
0069         if (!query.exec()) {
0070             qCWarning(RUQOLA_DATABASE_LOG) << "Couldn't insert-or-replace in GLOBAL table" << db.databaseName() << query.lastError();
0071         }
0072     }
0073 }
0074 
0075 void GlobalDatabase::removeTimeStamp(const QString &accountName, const QString &roomName, TimeStampType type)
0076 {
0077     QSqlDatabase db;
0078     if (!checkDataBase(accountName, db)) {
0079         return;
0080     }
0081     const QString identifier = generateIdentifier(accountName, roomName, type);
0082     QSqlQuery query(QStringLiteral("DELETE FROM GLOBAL WHERE identifier = ?"), db);
0083     query.addBindValue(identifier);
0084     if (!query.exec()) {
0085         qCWarning(RUQOLA_DATABASE_LOG) << "Couldn't insert-or-replace in GLOBAL table" << db.databaseName() << query.lastError();
0086     }
0087 }
0088 
0089 qint64 GlobalDatabase::timeStamp(const QString &accountName, const QString &roomName, TimeStampType type)
0090 {
0091     QSqlDatabase db;
0092     if (!initializeDataBase(accountName, db)) {
0093         return -1;
0094     }
0095     const QString identifier = generateIdentifier(accountName, roomName, type);
0096     QSqlQuery query(QStringLiteral("SELECT timestamp FROM GLOBAL WHERE identifier = \"%1\"").arg(identifier), db);
0097     qint64 value = -1;
0098     // We have one element
0099     if (query.first()) {
0100         value = query.value(0).toLongLong();
0101     }
0102     return value;
0103 }