int CEpgDatabase::Persist(const CEpg &epg, bool bQueueWrite /* = false */) { int iReturn = -1; CStdString strQuery; if (epg.EpgID() > 0) { strQuery = FormatSQL("REPLACE INTO epg (idEpg, sName, sScraperName) " "VALUES (%u, '%s', '%s');", epg.EpgID(), epg.Name().c_str(), epg.ScraperName().c_str()); } else { strQuery = FormatSQL("REPLACE INTO epg (sName, sScraperName) " "VALUES ('%s', '%s');", epg.Name().c_str(), epg.ScraperName().c_str()); } if (bQueueWrite) { if (QueueInsertQuery(strQuery)) iReturn = epg.EpgID() <= 0 ? 0 : epg.EpgID(); } else { if (ExecuteQuery(strQuery)) iReturn = epg.EpgID() <= 0 ? (int) m_pDS->lastinsertid() : epg.EpgID(); } return iReturn; }
void CEpgContainer::InsertFromDatabase(int iEpgID, const CStdString &strName, const CStdString &strScraperName) { // table might already have been created when pvr channels were loaded CEpg* epg = GetById(iEpgID); if (epg) { if (!epg->Name().Equals(strName) || !epg->ScraperName().Equals(strScraperName)) { // current table data differs from the info in the db epg->SetChanged(); SetChanged(); } } else { // create a new epg table epg = new CEpg(iEpgID, strName, strScraperName, true); if (epg) { m_epgs.insert(make_pair(iEpgID, epg)); SetChanged(); epg->RegisterObserver(this); } } }
bool CEpgContainer::DeleteEpg(const CEpg &epg, bool bDeleteFromDatabase /* = false */) { if (epg.EpgID() < 0) return false; CSingleLock lock(m_critSection); const auto &epgEntry = m_epgs.find((unsigned int)epg.EpgID()); if (epgEntry == m_epgs.end()) return false; CLog::Log(LOGDEBUG, "deleting EPG table %s (%d)", epg.Name().c_str(), epg.EpgID()); if (bDeleteFromDatabase && !m_bIgnoreDbForClient && m_database.IsOpen()) m_database.Delete(*epgEntry->second); epgEntry->second->UnregisterObserver(this); m_epgs.erase(epgEntry); return true; }
bool CEpgContainer::UpdateEPG(bool bOnlyPending /* = false */) { bool bInterrupted(false); unsigned int iUpdatedTables(0); bool bShowProgress(false); /* set start and end time */ time_t start; time_t end; CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(start); end = start + m_iDisplayTime; start -= g_advancedSettings.m_iEpgLingerTime * 60; bShowProgress = g_advancedSettings.m_bEpgDisplayUpdatePopup && (m_bIsInitialising || g_advancedSettings.m_bEpgDisplayIncrementalUpdatePopup); { CSingleLock lock(m_critSection); if (m_bIsUpdating || InterruptUpdate()) return false; m_bIsUpdating = true; } if (bShowProgress && !bOnlyPending) ShowProgressDialog(); if (!m_bIgnoreDbForClient && !m_database.IsOpen()) { CLog::Log(LOGERROR, "EpgContainer - %s - could not open the database", __FUNCTION__); CSingleLock lock(m_critSection); m_bIsUpdating = false; m_updateEvent.Set(); if (bShowProgress && !bOnlyPending) CloseProgressDialog(); return false; } vector<CEpg*> invalidTables; /* load or update all EPG tables */ CEpg *epg; unsigned int iCounter(0); for (map<unsigned int, CEpg *>::iterator it = m_epgs.begin(); it != m_epgs.end(); it++) { if (InterruptUpdate()) { bInterrupted = true; break; } epg = it->second; if (!epg) continue; if (bShowProgress && !bOnlyPending) UpdateProgressDialog(++iCounter, m_epgs.size(), epg->Name()); // we currently only support update via pvr add-ons. skip update when the pvr manager isn't started if (!g_PVRManager.IsStarted()) continue; // check the pvr manager when the channel pointer isn't set if (!epg->Channel()) { CPVRChannelPtr channel = g_PVRChannelGroups->GetChannelByEpgId(epg->EpgID()); if (channel) epg->SetChannel(channel); } if ((!bOnlyPending || epg->UpdatePending()) && epg->Update(start, end, m_iUpdateTime, bOnlyPending)) iUpdatedTables++; else if (!epg->IsValid()) invalidTables.push_back(epg); } for (vector<CEpg*>::iterator it = invalidTables.begin(); it != invalidTables.end(); it++) DeleteEpg(**it, true); if (bInterrupted) { /* the update has been interrupted. try again later */ time_t iNow; CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(iNow); m_iNextEpgUpdate = iNow + g_advancedSettings.m_iEpgRetryInterruptedUpdateInterval; } else { CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgUpdate); m_iNextEpgUpdate += g_advancedSettings.m_iEpgUpdateCheckInterval; m_bHasPendingUpdates = false; } if (bShowProgress && !bOnlyPending) CloseProgressDialog(); /* notify observers */ if (iUpdatedTables > 0) { SetChanged(); NotifyObservers(ObservableMessageEpgContainer); } CSingleLock lock(m_critSection); m_bIsUpdating = false; m_updateEvent.Set(); return !bInterrupted; }
bool CEpgContainer::UpdateEPG(bool bOnlyPending /* = false */) { bool bInterrupted(false); unsigned int iUpdatedTables(0); bool bShowProgress(false); /* set start and end time */ time_t start; time_t end; CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(start); end = start + m_iDisplayTime; start -= g_advancedSettings.m_iEpgLingerTime * 60; bShowProgress = g_advancedSettings.m_bEpgDisplayUpdatePopup && (m_bIsInitialising || g_advancedSettings.m_bEpgDisplayIncrementalUpdatePopup); { CSingleLock lock(m_critSection); if (m_bIsUpdating || InterruptUpdate()) return false; m_bIsUpdating = true; } if (bShowProgress && !bOnlyPending) ShowProgressDialog(); if (!m_bIgnoreDbForClient && !m_database.IsOpen()) { CLog::Log(LOGERROR, "EpgContainer - %s - could not open the database", __FUNCTION__); CSingleLock lock(m_critSection); m_bIsUpdating = false; m_updateEvent.Set(); if (bShowProgress && !bOnlyPending) CloseProgressDialog(); return false; } /* load or update all EPG tables */ CEpg *epg; unsigned int iCounter(0); for (map<unsigned int, CEpg *>::iterator it = m_epgs.begin(); it != m_epgs.end(); it++) { if (InterruptUpdate()) { bInterrupted = true; break; } epg = it->second; if (!epg) continue; if (bShowProgress && !bOnlyPending) UpdateProgressDialog(++iCounter, m_epgs.size(), epg->Name()); if ((!bOnlyPending || epg->UpdatePending()) && epg->Update(start, end, m_iUpdateTime, bOnlyPending)) ++iUpdatedTables; } if (!bInterrupted) { if (bInterrupted) { /* the update has been interrupted. try again later */ time_t iNow; CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(iNow); m_iNextEpgUpdate = iNow + g_advancedSettings.m_iEpgRetryInterruptedUpdateInterval; } else { CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgUpdate); m_iNextEpgUpdate += g_advancedSettings.m_iEpgUpdateCheckInterval; m_bHasPendingUpdates = false; } } if (bShowProgress && !bOnlyPending) CloseProgressDialog(); /* notify observers */ if (iUpdatedTables > 0) { SetChanged(); NotifyObservers("epg", true); } CSingleLock lock(m_critSection); m_bIsUpdating = false; m_updateEvent.Set(); return !bInterrupted; }
bool CEpgContainer::UpdateEPG(bool bShowProgress /* = false */) { bool bInterrupted(false); bool bDbOpened(false); unsigned int iUpdatedTables(0); /* set start and end time */ time_t start; time_t end; CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(start); end = start + m_iDisplayTime; start -= g_advancedSettings.m_iEpgLingerTime * 60; { CSingleLock lock(m_critSection); if (m_bIsUpdating || InterruptUpdate()) return false; m_bIsUpdating = true; } if (bShowProgress) ShowProgressDialog(); /* open the database */ if (!m_bIgnoreDbForClient && !(bDbOpened = m_database.Open())) { CLog::Log(LOGERROR, "EpgContainer - %s - could not open the database", __FUNCTION__); return false; } /* load or update all EPG tables */ CEpg *epg; for (unsigned int iEpgPtr = 0; iEpgPtr < m_epgs.size(); iEpgPtr++) { if (InterruptUpdate()) { bInterrupted = true; break; } epg = m_epgs[iEpgPtr]; if (!epg) continue; if (epg->Update(start, end, m_iUpdateTime)) ++iUpdatedTables; if (bShowProgress) UpdateProgressDialog(iEpgPtr, m_epgs.size(), epg->Name()); } if (!bInterrupted) { CSingleLock lock(m_critSection); m_bIsUpdating = false; if (bInterrupted) { /* the update has been interrupted. try again later */ time_t iNow; CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(iNow); m_iNextEpgUpdate = iNow + g_advancedSettings.m_iEpgRetryInterruptedUpdateInterval; } else { CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgUpdate); m_iNextEpgUpdate += g_advancedSettings.m_iEpgUpdateCheckInterval; } } if (bShowProgress) CloseProgressDialog(); /* notify observers */ if (iUpdatedTables > 0) { if (CheckPlayingEvents()) SetChanged(); NotifyObservers("epg", true); } if (bDbOpened) m_database.Close(); m_updateEvent.Set(); return !bInterrupted; }