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 "localroomsdatabase.h" 0008 #include "localdatabaseutils.h" 0009 #include "room.h" 0010 #include "ruqola_database_debug.h" 0011 0012 #include <QSqlDatabase> 0013 #include <QSqlError> 0014 #include <QSqlQuery> 0015 #include <QSqlRecord> 0016 0017 static const char s_schemaRoomDataBase[] = "CREATE TABLE ROOMS (roomId TEXT PRIMARY KEY NOT NULL, timestamp INTEGER, json TEXT)"; 0018 enum class RoomFields { 0019 RoomId, 0020 TimeStamp, 0021 Json, 0022 }; // in the same order as the table 0023 0024 LocalRoomsDatabase::LocalRoomsDatabase() 0025 : LocalDatabaseBase(LocalDatabaseUtils::localRoomsDatabasePath(), LocalDatabaseBase::DatabaseType::Rooms) 0026 { 0027 } 0028 0029 LocalRoomsDatabase::~LocalRoomsDatabase() = default; 0030 0031 QString LocalRoomsDatabase::schemaDataBase() const 0032 { 0033 return QString::fromLatin1(s_schemaRoomDataBase); 0034 } 0035 0036 void LocalRoomsDatabase::addRoom(const QString &accountName, Room *room) 0037 { 0038 QSqlDatabase db; 0039 if (initializeDataBase(accountName, db)) { 0040 QSqlQuery query(LocalDatabaseUtils::insertReplaceRoom(), db); 0041 query.addBindValue(room->roomId()); 0042 query.addBindValue(room->updatedAt()); // TODO ? 0043 query.addBindValue(Room::serialize(room, false)); // TODO use binary ? 0044 if (!query.exec()) { 0045 qCWarning(RUQOLA_DATABASE_LOG) << "Couldn't insert-or-replace in ROOMS table" << db.databaseName() << query.lastError(); 0046 } 0047 } 0048 } 0049 0050 void LocalRoomsDatabase::deleteRoom(const QString &accountName, const QString &roomId) 0051 { 0052 QSqlDatabase db; 0053 if (!checkDataBase(accountName, db)) { 0054 return; 0055 } 0056 QSqlQuery query(LocalDatabaseUtils::deleteRooms(), db); 0057 query.addBindValue(roomId); 0058 if (!query.exec()) { 0059 qCWarning(RUQOLA_DATABASE_LOG) << "Couldn't insert-or-replace in ROOMS table" << db.databaseName() << query.lastError(); 0060 } 0061 } 0062 0063 QByteArray LocalRoomsDatabase::jsonRoom(const QString &accountName, const QString &roomId) 0064 { 0065 QSqlDatabase db; 0066 if (!initializeDataBase(accountName, db)) { 0067 qCWarning(RUQOLA_DATABASE_LOG) << "Could not initialize database from " << accountName << " roomId " << roomId; 0068 return {}; 0069 } 0070 QSqlQuery query(QStringLiteral("SELECT json FROM ROOMS WHERE roomId = \"%1\"").arg(roomId), db); 0071 QByteArray value; 0072 // We have one element 0073 if (query.first()) { 0074 value = query.value(0).toByteArray(); 0075 } 0076 return value; 0077 }