bool CActiveAEDSPDatabase::DeleteModes(int modeType) { /* invalid addon Id */ if (modeType <= 0) { CLog::Log(LOGERROR, "Audio DSP - %s - invalid mode type id: %i", __FUNCTION__, modeType); return false; } CLog::Log(LOGDEBUG, "Audio DSP - %s - deleting all modes from type '%i' from the database", __FUNCTION__, modeType); Filter filter; filter.AppendWhere(PrepareSQL("iType = %u", modeType)); return DeleteValues("modes", filter); }
bool CActiveAEDSPDatabase::DeleteAddonModes(int addonId) { /* invalid addon Id */ if (addonId <= 0) { CLog::Log(LOGERROR, "Audio DSP - %s - invalid add-on id: %i", __FUNCTION__, addonId); return false; } CLog::Log(LOGDEBUG, "Audio DSP - %s - deleting all modes from add-on '%i' from the database", __FUNCTION__, addonId); Filter filter; filter.AppendWhere(PrepareSQL("iAddonId = %u", addonId)); return DeleteValues("modes", filter); }
bool CPVRDatabase::DeleteClientChannels(const CPVRClient &client) { /* invalid client Id */ if (client.GetID() <= 0) { CLog::Log(LOGERROR, "PVR - %s - invalid client id: %i", __FUNCTION__, client.GetID()); return false; } CLog::Log(LOGDEBUG, "PVR - %s - deleting all channels from client '%i' from the database", __FUNCTION__, client.GetID()); Filter filter; filter.AppendWhere(PrepareSQL("iClientId = %u", client.GetID())); return DeleteValues("channels", filter); }
int CPVRDatabase::Get(CPVRChannelGroup &group, const CPVRChannelGroup &allGroup) { int iReturn = -1; /* invalid group id */ if (group.GroupID() < 0) { CLog::LogF(LOGERROR, "Invalid channel group id: %d", group.GroupID()); return -1; } CSingleLock lock(m_critSection); const std::string strQuery = PrepareSQL("SELECT idChannel, iChannelNumber, iSubChannelNumber FROM map_channelgroups_channels " "WHERE idGroup = %u ORDER BY iChannelNumber", group.GroupID()); if (ResultQuery(strQuery)) { iReturn = 0; // create a map to speedup data lookup std::map<int, CPVRChannelPtr> allChannels; for (const auto& groupMember : allGroup.GetMembers()) { allChannels.insert(std::make_pair(groupMember.channel->ChannelID(), groupMember.channel)); } try { while (!m_pDS->eof()) { int iChannelId = m_pDS->fv("idChannel").get_asInt(); const auto& channel = allChannels.find(iChannelId); if (channel != allChannels.end()) { PVRChannelGroupMember newMember(channel->second, CPVRChannelNumber(static_cast<unsigned int>(m_pDS->fv("iChannelNumber").get_asInt()), static_cast<unsigned int>(m_pDS->fv("iSubChannelNumber").get_asInt())), 0); group.m_sortedMembers.emplace_back(newMember); group.m_members.insert(std::make_pair(channel->second->StorageId(), newMember)); ++iReturn; } else { // remove the channel from the table if it doesn't exist on client (anymore) int iClientId = GetClientIdByChannelId(iChannelId); if (iClientId == PVR_INVALID_CLIENT_ID || !allGroup.IsMissingChannelsFromClient(iClientId)) { Filter filter; filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID())); filter.AppendWhere(PrepareSQL("idChannel = %u", iChannelId)); DeleteValues("map_channelgroups_channels", filter); } } m_pDS->next(); } m_pDS->close(); } catch(...) { CLog::LogF(LOGERROR, "Failed to get channels"); } } if (iReturn > 0) group.SortByChannelNumber(); return iReturn; }
bool CPVRDatabase::RemoveStaleChannelsFromGroup(const CPVRChannelGroup &group) { bool bDelete(true); /* invalid group id */ if (group.GroupID() <= 0) { CLog::LogF(LOGERROR, "Invalid channel group id: %d", group.GroupID()); return false; } CSingleLock lock(m_critSection); if (!group.IsInternalGroup()) { /* First remove channels that don't exist in the main channels table */ // XXX work around for frodo: fix this up so it uses one query for all db types // mysql doesn't support subqueries when deleting and sqlite doesn't support joins when deleting if (StringUtils::EqualsNoCase(g_advancedSettings.m_databaseTV.type, "mysql")) { const std::string strQuery = PrepareSQL("DELETE m FROM map_channelgroups_channels m LEFT JOIN channels c ON (c.idChannel = m.idChannel) WHERE c.idChannel IS NULL"); bDelete = ExecuteQuery(strQuery); } else { Filter filter; filter.AppendWhere("idChannel IN (SELECT m.idChannel FROM map_channelgroups_channels m LEFT JOIN channels on m.idChannel = channels.idChannel WHERE channels.idChannel IS NULL)"); bDelete = DeleteValues("map_channelgroups_channels", filter); } } if (group.HasChannels()) { std::vector<int> currentMembers; if (GetCurrentGroupMembers(group, currentMembers)) { std::vector<int> channelsToDelete; for (int iChannelId : currentMembers) { if (!group.IsGroupMember(iChannelId)) { int iClientId = GetClientIdByChannelId(iChannelId); if (iClientId == PVR_INVALID_CLIENT_ID || !group.IsMissingChannelsFromClient(iClientId)) { channelsToDelete.emplace_back(iChannelId); } } } if (!channelsToDelete.empty()) bDelete = DeleteChannelsFromGroup(group, channelsToDelete) && bDelete; } } else { Filter filter; filter.AppendWhere(PrepareSQL("idGroup = %u", group.GroupID())); bDelete = DeleteValues("map_channelgroups_channels", filter) && bDelete; } return bDelete; }