int CPVRDatabase::Get(CPVRChannelGroup &group) { int iReturn = -1; /* invalid group id */ if (group.GroupID() < 0) { CLog::Log(LOGERROR, "PVR - %s - invalid group id: %d", __FUNCTION__, group.GroupID()); return -1; } std::string strQuery = PrepareSQL("SELECT idChannel, iChannelNumber FROM map_channelgroups_channels WHERE idGroup = %u ORDER BY iChannelNumber", group.GroupID()); if (ResultQuery(strQuery)) { iReturn = 0; try { while (!m_pDS->eof()) { int iChannelId = m_pDS->fv("idChannel").get_asInt(); int iChannelNumber = m_pDS->fv("iChannelNumber").get_asInt(); CPVRChannelPtr channel = g_PVRChannelGroups->GetGroupAll(group.IsRadio())->GetByChannelID(iChannelId); if (channel) { #if PVRDB_DEBUGGING CLog::Log(LOGDEBUG, "PVR - %s - channel '%s' loaded from the database", __FUNCTION__, channel->m_strChannelName.c_str()); #endif PVRChannelGroupMember newMember = { channel, (unsigned int)iChannelNumber }; group.m_sortedMembers.push_back(newMember); group.m_members.insert(std::make_pair(channel->StorageId(), newMember)); iReturn++; } else { // remove a channel that doesn't exist (anymore) from the table 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::Log(LOGERROR, "PVR - %s - failed to get channels", __FUNCTION__); } } if (iReturn > 0) group.SortByChannelNumber(); return iReturn; }
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; }