File indexing completed on 2025-03-16 13:27:30
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 }