diff options
Diffstat (limited to 'xbmc/pvr/PVRDatabase.h')
-rw-r--r-- | xbmc/pvr/PVRDatabase.h | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/xbmc/pvr/PVRDatabase.h b/xbmc/pvr/PVRDatabase.h new file mode 100644 index 0000000..1e9cbf5 --- /dev/null +++ b/xbmc/pvr/PVRDatabase.h @@ -0,0 +1,320 @@ +/* + * 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 <map> +#include <vector> + +namespace PVR +{ + class CPVRChannel; + class CPVRChannelGroup; + class CPVRChannelGroupMember; + class CPVRChannelGroups; + class CPVRProvider; + class CPVRProviders; + class CPVRClient; + class CPVRTimerInfoTag; + class CPVRTimers; + + /** The PVR database */ + + static constexpr int CHANNEL_COMMIT_QUERY_COUNT_LIMIT = 10000; + + class CPVRDatabase : public CDatabase + { + public: + /*! + * @brief Create a new instance of the PVR database. + */ + CPVRDatabase() = default; + ~CPVRDatabase() 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 40; } + + /*! + * @brief Get the default sqlite database filename. + * @return The default filename. + */ + const char* GetBaseDBName() const override { return "TV"; } + + /*! @name Client methods */ + //@{ + + /*! + * @brief Remove all client entries from the database. + * @return True if all client entries were removed, false otherwise. + */ + bool DeleteClients(); + + /*! + * @brief Add or update a client entry in the database + * @param client The client to persist. + * @return True when persisted, false otherwise. + */ + bool Persist(const CPVRClient& client); + + /*! + * @brief Remove a client entry from the database + * @param client The client to remove. + * @return True if the client was removed, false otherwise. + */ + bool Delete(const CPVRClient& client); + + /*! + * @brief Get the priority for a given client from the database. + * @param client The client. + * @return The priority. + */ + int GetPriority(const CPVRClient& client); + + /*! @name Channel methods */ + //@{ + + /*! + * @brief Remove all channels from the database. + * @return True if all channels were removed, false otherwise. + */ + bool DeleteChannels(); + + /*! + * @brief Get channels from the database. + * @param bRadio Whether to fetch radio or TV channels. + * @param clients The PVR clients the channels should be loaded for. Leave empty for all clients. + * @param results The container for the channels. + * @return The number of channels loaded. + */ + int Get(bool bRadio, + const std::vector<std::shared_ptr<CPVRClient>>& clients, + std::map<std::pair<int, int>, std::shared_ptr<CPVRChannel>>& results) const; + + /*! + * @brief Add or update a channel entry in the database + * @param channel The channel to persist. + * @param bCommit queue only or queue and commit + * @return True when persisted or queued, false otherwise. + */ + bool Persist(CPVRChannel& channel, bool bCommit); + + /*! + * @brief Remove a channel entry from the database + * @param channel The channel to remove. + * @return True if the channel was removed, false otherwise. + */ + bool QueueDeleteQuery(const CPVRChannel& channel); + + //@} + + /*! @name Channel group member methods */ + //@{ + + /*! + * @brief Remove a channel group member entry from the database + * @param groupMember The group member to remove. + * @return True if the member was removed, false otherwise. + */ + bool QueueDeleteQuery(const CPVRChannelGroupMember& groupMember); + + //@} + + /*! @name Channel provider methods */ + //@{ + + /*! + * @brief Remove all providers from the database. + * @return True if all providers were removed, false otherwise. + */ + bool DeleteProviders(); + + /*! + * @brief Add or update a provider entry in the database + * @param provider The provider to persist. + * @param updateRecord True if record to be updated, false for insert + * @return True when persisted, false otherwise. + */ + bool Persist(CPVRProvider& provider, bool updateRecord = false); + + /*! + * @brief Remove a provider entry from the database + * @param provider The provider to remove. + * @return True if the provider was removed, false otherwise. + */ + bool Delete(const CPVRProvider& provider); + + /*! + * @brief Get the list of providers from the database + * @param results The providers to store the results in. + * @param clients The PVR clients the providers should be loaded for. Leave empty for all clients. + * @return The amount of providers that were added. + */ + bool Get(CPVRProviders& results, const std::vector<std::shared_ptr<CPVRClient>>& clients) const; + + /*! + * @brief Get the maximum provider id in the database + * @return The maximum provider id in the database + */ + int GetMaxProviderId(); + + //@} + + /*! @name Channel group methods */ + //@{ + + /*! + * @brief Remove all channel groups from the database + * @return True if all channel groups were removed. + */ + bool DeleteChannelGroups(); + + /*! + * @brief Delete a channel group and all its members from the database. + * @param group The group to delete. + * @return True if the group was deleted successfully, false otherwise. + */ + bool Delete(const CPVRChannelGroup& group); + + /*! + * @brief Get the channel groups. + * @param results The container to store the results in. + * @return The number of groups loaded. + */ + int Get(CPVRChannelGroups& results) const; + + /*! + * @brief Get the members of a channel group. + * @param group The group to get the members for. + * @param clients The PVR clients the group members should be loaded for. Leave empty for all clients. + * @return The group members. + */ + std::vector<std::shared_ptr<CPVRChannelGroupMember>> Get( + const CPVRChannelGroup& group, + const std::vector<std::shared_ptr<CPVRClient>>& clients) const; + + /*! + * @brief Add or update a channel group entry in the database. + * @param group The group to persist. + * @return True if the group was persisted successfully, false otherwise. + */ + bool Persist(CPVRChannelGroup& group); + + /*! + * @brief Reset all epg ids to 0 + * @return True when reset, false otherwise. + */ + bool ResetEPG(); + + /*! @name Timer methods */ + //@{ + + /*! + * @brief Get the timers. + * @param timers The container for the timers. + * @param clients The PVR clients the timers should be loaded for. Leave empty for all clients. + * @return The timers. + */ + std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetTimers( + CPVRTimers& timers, const std::vector<std::shared_ptr<CPVRClient>>& clients) const; + + /*! + * @brief Add or update a timer entry in the database + * @param channel The timer to persist. + * @return True if persisted, false otherwise. + */ + bool Persist(CPVRTimerInfoTag& timer); + + /*! + * @brief Remove a timer from the database + * @param timer The timer to remove. + * @return True if the timer was removed, false otherwise. + */ + bool Delete(const CPVRTimerInfoTag& timer); + + /*! + * @brief Remove all timer entries from the database. + * @return True if all timer entries were removed, false otherwise. + */ + bool DeleteTimers(); + //@} + + /*! @name Client methods */ + //@{ + + /*! + * @brief Updates the last watched timestamp for the channel + * @param channel the channel + * @return whether the update was successful + */ + bool UpdateLastWatched(const CPVRChannel& channel); + + /*! + * @brief Updates the last watched timestamp for the channel group + * @param group the group + * @return whether the update was successful + */ + bool UpdateLastWatched(const CPVRChannelGroup& group); + //@} + + /*! + * @brief Updates the last opened timestamp for the channel group + * @param group the group + * @return whether the update was successful + */ + bool UpdateLastOpened(const CPVRChannelGroup& group); + //@} + + private: + /*! + * @brief Create the PVR database tables. + */ + void CreateTables() override; + 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 11; } + + bool PersistGroupMembers(const CPVRChannelGroup& group); + + bool PersistChannels(const CPVRChannelGroup& group); + + bool RemoveChannelsFromGroup(const CPVRChannelGroup& group); + + mutable CCriticalSection m_critSection; + }; +} |