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; }