diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/pvr/epg/EpgDatabase.h | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/pvr/epg/EpgDatabase.h')
-rw-r--r-- | xbmc/pvr/epg/EpgDatabase.h | 377 |
1 files changed, 377 insertions, 0 deletions
diff --git a/xbmc/pvr/epg/EpgDatabase.h b/xbmc/pvr/epg/EpgDatabase.h new file mode 100644 index 0000000..580568d --- /dev/null +++ b/xbmc/pvr/epg/EpgDatabase.h @@ -0,0 +1,377 @@ +/* + * Copyright (C) 2012-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "dbwrappers/Database.h" +#include "threads/CriticalSection.h" + +#include <memory> +#include <vector> + +class CDateTime; + +namespace PVR +{ + class CPVREpg; + class CPVREpgInfoTag; + class CPVREpgSearchFilter; + + struct PVREpgSearchData; + + /** The EPG database */ + + static constexpr int EPG_COMMIT_QUERY_COUNT_LIMIT = 10000; + + class CPVREpgDatabase : public CDatabase, public std::enable_shared_from_this<CPVREpgDatabase> + { + public: + /*! + * @brief Create a new instance of the EPG database. + */ + CPVREpgDatabase() = default; + + /*! + * @brief Destroy this instance. + */ + ~CPVREpgDatabase() override = default; + + /*! + * @brief Open the database. + * @return True if it was opened successfully, false otherwise. + */ + bool Open() override; + + /*! + * @brief Close the database. + */ + void Close() override; + + /*! + * @brief Lock the database. + */ + void Lock(); + + /*! + * @brief Unlock the database. + */ + void Unlock(); + + /*! + * @brief Get the minimal database version that is required to operate correctly. + * @return The minimal database version. + */ + int GetSchemaVersion() const override { return 16; } + + /*! + * @brief Get the default sqlite database filename. + * @return The default filename. + */ + const char* GetBaseDBName() const override { return "Epg"; } + + /*! @name EPG methods */ + //@{ + + /*! + * @brief Remove all EPG information from the database + * @return True if the EPG information was erased, false otherwise. + */ + bool DeleteEpg(); + + /*! + * @brief Queue deletionof an EPG table. + * @param tag The table to queue for deletion. + * @return True on success, false otherwise. + */ + bool QueueDeleteEpgQuery(const CPVREpg& table); + + /*! + * @brief Write the query to delete the given EPG tag to db query queue. + * @param tag The EPG tag to remove. + * @return True on success, false otherwise. + */ + bool QueueDeleteTagQuery(const CPVREpgInfoTag& tag); + + /*! + * @brief Get all EPG tables from the database. Does not get the EPG tables' entries. + * @return The entries. + */ + std::vector<std::shared_ptr<CPVREpg>> GetAll(); + + /*! + * @brief Get all tags for a given EPG id. + * @param iEpgID The ID of the EPG. + * @return The entries. + */ + std::vector<std::shared_ptr<CPVREpgInfoTag>> GetAllEpgTags(int iEpgID); + + /*! + * @brief Get all icon paths for a given EPG id. + * @param iEpgID The ID of the EPG. + * @return The entries. + */ + std::vector<std::string> GetAllIconPaths(int iEpgID); + + /*! + * @brief Check whether this EPG has any tags. + * @param iEpgID The ID of the EPG. + * @return True in case there are tags, false otherwise. + */ + bool HasTags(int iEpgID); + + /*! + * @brief Get the end time of the last tag in this EPG. + * @param iEpgID The ID of the EPG. + * @return The time. + */ + CDateTime GetLastEndTime(int iEpgID); + + /*! + * @brief Get the start and end time across all EPGs. + * @return The times; first: start time, second: end time. + */ + std::pair<CDateTime, CDateTime> GetFirstAndLastEPGDate(); + + /*! + * @brief Get the start time of the first tag with a start time greater than the given min time. + * @param iEpgID The ID of the EPG. + * @param minStart The min start time. + * @return The time. + */ + CDateTime GetMinStartTime(int iEpgID, const CDateTime& minStart); + + /*! + * @brief Get the end time of the first tag with an end time less than the given max time. + * @param iEpgID The ID of the EPG. + * @param maxEnd The mx end time. + * @return The time. + */ + CDateTime GetMaxEndTime(int iEpgID, const CDateTime& maxEnd); + + /*! + * @brief Get all EPG tags matching the given search criteria. + * @param searchData The search criteria. + * @return The matching tags. + */ + std::vector<std::shared_ptr<CPVREpgInfoTag>> GetEpgTags(const PVREpgSearchData& searchData); + + /*! + * @brief Get an EPG tag given its EPG id and unique broadcast ID. + * @param iEpgID The ID of the EPG for the tag to get. + * @param iUniqueBroadcastId The unique broadcast ID for the tag to get. + * @return The tag or nullptr, if not found. + */ + std::shared_ptr<CPVREpgInfoTag> GetEpgTagByUniqueBroadcastID(int iEpgID, + unsigned int iUniqueBroadcastId); + + /*! + * @brief Get an EPG tag given its EPG id and database ID. + * @param iEpgID The ID of the EPG for the tag to get. + * @param iDatabaseId The database ID for the tag to get. + * @return The tag or nullptr, if not found. + */ + std::shared_ptr<CPVREpgInfoTag> GetEpgTagByDatabaseID(int iEpgID, int iDatabaseId); + + /*! + * @brief Get an EPG tag given its EPG ID and start time. + * @param iEpgID The ID of the EPG for the tag to get. + * @param startTime The start time for the tag to get. + * @return The tag or nullptr, if not found. + */ + std::shared_ptr<CPVREpgInfoTag> GetEpgTagByStartTime(int iEpgID, const CDateTime& startTime); + + /*! + * @brief Get the next EPG tag matching the given EPG id and min start time. + * @param iEpgID The ID of the EPG for the tag to get. + * @param minStartTime The min start time for the tag to get. + * @return The tag or nullptr, if not found. + */ + std::shared_ptr<CPVREpgInfoTag> GetEpgTagByMinStartTime(int iEpgID, + const CDateTime& minStartTime); + + /*! + * @brief Get the next EPG tag matching the given EPG id and max end time. + * @param iEpgID The ID of the EPG for the tag to get. + * @param maxEndTime The max end time for the tag to get. + * @return The tag or nullptr, if not found. + */ + std::shared_ptr<CPVREpgInfoTag> GetEpgTagByMaxEndTime(int iEpgID, const CDateTime& maxEndTime); + + /*! + * @brief Get all EPG tags matching the given EPG id, min start time and max end time. + * @param iEpgID The ID of the EPG for the tags to get. + * @param minStartTime The min start time for the tags to get. + * @param maxEndTime The max end time for the tags to get. + * @return The tags or empty vector, if no tags were found. + */ + std::vector<std::shared_ptr<CPVREpgInfoTag>> GetEpgTagsByMinStartMaxEndTime( + int iEpgID, const CDateTime& minStartTime, const CDateTime& maxEndTime); + + /*! + * @brief Get all EPG tags matching the given EPG id, min end time and max start time. + * @param iEpgID The ID of the EPG for the tags to get. + * @param minEndTime The min end time for the tags to get. + * @param maxStartTime The max start time for the tags to get. + * @return The tags or empty vector, if no tags were found. + */ + std::vector<std::shared_ptr<CPVREpgInfoTag>> GetEpgTagsByMinEndMaxStartTime( + int iEpgID, const CDateTime& minEndTime, const CDateTime& maxStartTime); + + /*! + * @brief Write the query to delete all EPG tags in range of given EPG id, min end time and max + * start time to db query queue. . + * @param iEpgID The ID of the EPG for the tags to delete. + * @param minEndTime The min end time for the tags to delete. + * @param maxStartTime The max start time for the tags to delete. + * @return True if it was removed or queued successfully, false otherwise. + */ + bool QueueDeleteEpgTagsByMinEndMaxStartTimeQuery(int iEpgID, + const CDateTime& minEndTime, + const CDateTime& maxStartTime); + + /*! + * @brief Get the last stored EPG scan time. + * @param iEpgId The table to update the time for. Use 0 for a global value. + * @param lastScan The last scan time or -1 if it wasn't found. + * @return True if the time was fetched successfully, false otherwise. + */ + bool GetLastEpgScanTime(int iEpgId, CDateTime* lastScan); + + /*! + * @brief Write the query to update the last scan time for the given EPG to db query queue. + * @param iEpgId The table to update the time for. + * @param lastScanTime The time to write to the database. + * @return True on success, false otherwise. + */ + bool QueuePersistLastEpgScanTimeQuery(int iEpgId, const CDateTime& lastScanTime); + + /*! + * @brief Write the query to delete the last scan time for the given EPG to db query queue. + * @param iEpgId The table to delete the time for. + * @return True on success, false otherwise. + */ + bool QueueDeleteLastEpgScanTimeQuery(const CPVREpg& table); + + /*! + * @brief Persist an EPG table. It's entries are not persisted. + * @param epg The table to persist. + * @param bQueueWrite If true, don't execute the query immediately but queue it. + * @return The database ID of this entry or 0 if bQueueWrite is false and the query was queued. + */ + int Persist(const CPVREpg& epg, bool bQueueWrite); + + /*! + * @brief Erase all EPG tags with the given epg ID and an end time less than the given time. + * @param iEpgId The ID of the EPG. + * @param maxEndTime The maximum allowed end time. + * @return True if the entries were removed successfully, false otherwise. + */ + bool DeleteEpgTags(int iEpgId, const CDateTime& maxEndTime); + + /*! + * @brief Erase all EPG tags with the given epg ID. + * @param iEpgId The ID of the EPG. + * @return True if the entries were removed successfully, false otherwise. + */ + bool DeleteEpgTags(int iEpgId); + + /*! + * @brief Queue the erase all EPG tags with the given epg ID. + * @param iEpgId The ID of the EPG. + * @return True if the entries were queued successfully, false otherwise. + */ + bool QueueDeleteEpgTags(int iEpgId); + + /*! + * @brief Write the query to persist the given EPG tag to db query queue. + * @param tag The tag to persist. + * @return True on success, false otherwise. + */ + bool QueuePersistQuery(const CPVREpgInfoTag& tag); + + /*! + * @return Last EPG id in the database + */ + int GetLastEPGId(); + + //@} + + /*! @name EPG searches methods */ + //@{ + + /*! + * @brief Get all saved searches from the database. + * @param bRadio Whether to fetch saved searches for radio or TV. + * @return The searches. + */ + std::vector<std::shared_ptr<CPVREpgSearchFilter>> GetSavedSearches(bool bRadio); + + /*! + * @brief Get the saved search matching the given id. + * @param bRadio Whether to fetch a TV or radio saved search. + * @param iId The id. + * @return The saved search or nullptr if not found. + */ + std::shared_ptr<CPVREpgSearchFilter> GetSavedSearchById(bool bRadio, int iId); + + /*! + * @brief Persist a search. + * @param epgSearch The search. + * @return True on success, false otherwise. + */ + bool Persist(CPVREpgSearchFilter& epgSearch); + + /*! + * @brief Update time last executed for the given search. + * @param epgSearch The search. + * @return True on success, false otherwise. + */ + bool UpdateSavedSearchLastExecuted(const CPVREpgSearchFilter& epgSearch); + + /*! + * @brief Delete a saved search. + * @param epgSearch The search. + * @return True on success, false otherwise. + */ + bool Delete(const CPVREpgSearchFilter& epgSearch); + + /*! + * @brief Delete all saved searches. + * @return True on success, false otherwise. + */ + bool DeleteSavedSearches(); + + //@} + + private: + /*! + * @brief Create the EPG database tables. + */ + void CreateTables() override; + + /*! + * @brief Create the EPG database analytics. + */ + void CreateAnalytics() override; + + /*! + * @brief Update an old version of the database. + * @param version The version to update the database from. + */ + void UpdateTables(int version) override; + + int GetMinSchemaVersion() const override { return 4; } + + std::shared_ptr<CPVREpgInfoTag> CreateEpgTag(const std::unique_ptr<dbiplus::Dataset>& pDS); + + std::shared_ptr<CPVREpgSearchFilter> CreateEpgSearchFilter( + bool bRadio, const std::unique_ptr<dbiplus::Dataset>& pDS); + + CCriticalSection m_critSection; + }; +} |