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

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 }