Warning, file /utilities/telly-skout/src/database.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 // SPDX-FileCopyrightText: 2022 Plata Hill <plata.hill@kdemail.net>
0002 // SPDX-License-Identifier: LGPL-2.1-or-later
0003 
0004 #pragma once
0005 
0006 #include <QObject>
0007 
0008 #include "channeldata.h"
0009 #include "groupdata.h"
0010 #include "programdata.h"
0011 #include "types.h"
0012 
0013 #include <QList>
0014 #include <QMap>
0015 #include <QMultiMap>
0016 #include <QSqlQuery>
0017 #include <QString>
0018 #include <QVector>
0019 
0020 #include <memory>
0021 
0022 class QSqlQuery;
0023 
0024 class Database : public QObject
0025 {
0026     Q_OBJECT
0027 
0028 public:
0029     static Database &instance()
0030     {
0031         static Database _instance;
0032         return _instance;
0033     }
0034 
0035     bool execute(QSqlQuery &query) const;
0036     bool execute(const QString &query) const;
0037 
0038     void addGroup(const GroupData &data);
0039     void addGroups(const QVector<GroupData> &groups);
0040     size_t groupCount() const;
0041     bool groupExists(const GroupId &id) const;
0042     QVector<GroupData> groups() const;
0043     QVector<GroupData> groups(const ChannelId &channelId) const;
0044 
0045     void addChannel(const ChannelData &data, const GroupId &group);
0046     void addChannels(const QList<ChannelData> &channels, const GroupId &group);
0047     size_t channelCount() const;
0048     bool channelExists(const ChannelId &id) const;
0049     QVector<ChannelData> channels(bool onlyFavorites) const;
0050     ChannelData channel(const ChannelId &channelId) const;
0051 
0052     void addFavorite(const ChannelId &channelId);
0053     void removeFavorite(const ChannelId &channelId);
0054     void sortFavorites(const QVector<ChannelId> &newOrder); // newOrder must contain same channel IDs as existing favorites
0055     void clearFavorites();
0056     size_t favoriteCount() const;
0057     QVector<ChannelId> favorites() const;
0058     bool isFavorite(const ChannelId &channelId) const;
0059 
0060     void addProgram(const ProgramData &data);
0061     void updateProgramDescription(const ProgramId &id, const QString &description);
0062     void addPrograms(const QVector<ProgramData> &programs);
0063     bool programExists(const ChannelId &channelId, const QDateTime &lastTime) const;
0064     size_t programCount(const ChannelId &channelId) const;
0065     QMap<ChannelId, QVector<ProgramData>> programs() const;
0066     QVector<ProgramData> programs(const ChannelId &channelId) const;
0067 
0068 Q_SIGNALS:
0069     void groupAdded(const GroupId &id);
0070     void channelAdded(const ChannelId &id);
0071     void channelDetailsUpdated(const ChannelId &id, bool favorite);
0072     void favoritesUpdated();
0073 
0074 private:
0075     Database();
0076     ~Database() = default;
0077 
0078     int version() const;
0079     int fetcher() const;
0080     bool createTables();
0081     bool dropTables();
0082     void cleanup();
0083     QMultiMap<ProgramId, QString> programCategories() const;
0084 
0085     std::unique_ptr<QSqlQuery> m_addGroupQuery;
0086     std::unique_ptr<QSqlQuery> m_groupCountQuery;
0087     std::unique_ptr<QSqlQuery> m_groupExistsQuery;
0088     std::unique_ptr<QSqlQuery> m_groupsQuery;
0089     std::unique_ptr<QSqlQuery> m_groupsPerChannelQuery;
0090 
0091     std::unique_ptr<QSqlQuery> m_addGroupChannelQuery;
0092 
0093     std::unique_ptr<QSqlQuery> m_addChannelQuery;
0094     std::unique_ptr<QSqlQuery> m_channelCountQuery;
0095     std::unique_ptr<QSqlQuery> m_channelExistsQuery;
0096     std::unique_ptr<QSqlQuery> m_channelsQuery;
0097     std::unique_ptr<QSqlQuery> m_channelQuery;
0098 
0099     std::unique_ptr<QSqlQuery> m_addFavoriteQuery;
0100     std::unique_ptr<QSqlQuery> m_clearFavoritesQuery;
0101     std::unique_ptr<QSqlQuery> m_favoriteCountQuery;
0102     std::unique_ptr<QSqlQuery> m_favoritesQuery;
0103     std::unique_ptr<QSqlQuery> m_isFavoriteQuery;
0104 
0105     std::unique_ptr<QSqlQuery> m_addProgramCategoryQuery;
0106     std::unique_ptr<QSqlQuery> m_programCategoriesQuery;
0107 
0108     std::unique_ptr<QSqlQuery> m_addProgramQuery;
0109     std::unique_ptr<QSqlQuery> m_updateProgramDescriptionQuery;
0110     std::unique_ptr<QSqlQuery> m_programExistsQuery;
0111     std::unique_ptr<QSqlQuery> m_programCountQuery;
0112     std::unique_ptr<QSqlQuery> m_programsQuery;
0113     std::unique_ptr<QSqlQuery> m_programsPerChannelQuery;
0114 };