Ticket #11399: eitscannerpatch.v3

File eitscannerpatch.v3, 22.8 KB (added by Roger James <roger@…>, 11 years ago)

cleaned up version

Line 
1commit 5d472faa338d58cebc66ec971bacfd49474ab03e
2Merge: 79c6f27 69cd78b
3Author: Roger James <roger@beardandsandals.co.uk>
4Date:   Sun Apr 14 11:00:29 2013 +0100
5
6    Merge branch 'fixes/0.26' of https://github.com/MythTV/mythtv into fixes/0.26
7
8commit 79c6f2721fc0e41ded3106f0f843dc283c2927c9
9Author: Roger James <roger@beardandsandals.co.uk>
10Date:   Sun Apr 14 10:56:17 2013 +0100
11
12    Fixes to EIT handling
13
14diff --git a/mythtv/libs/libmythtv/eitcache.cpp b/mythtv/libs/libmythtv/eitcache.cpp
15index d42dacd..69e7b77 100644
16--- a/mythtv/libs/libmythtv/eitcache.cpp
17+++ b/mythtv/libs/libmythtv/eitcache.cpp
18@@ -12,11 +12,18 @@
19 #include "mythdb.h"
20 #include "mythlogging.h"
21 #include "mythdate.h"
22+#include "mpegtables.h"
23 
24 #define LOC QString("EITCache: ")
25 
26 // Highest version number. version is 5bits
27-const uint EITCache::kVersionMax = 31;
28+const uchar EITCache::kVersionMax = 31;
29+const uchar EITCache::kVersionInvalid = 32;
30+const uint  EITCache::kTimeInvalid = 0;
31+const uchar EITCache::kTableidInvalid = 0;
32+
33+event_map_entry::event_map_entry()
34+            : tableid(EITCache::kTableidInvalid), version(EITCache::kTimeInvalid), starttime(EITCache::kTimeInvalid), endtime(EITCache::kTimeInvalid), modified(false) {}
35 
36 EITCache::EITCache()
37     : accessCnt(0), hitCnt(0),   tblChgCnt(0),   verChgCnt(0),
38@@ -57,34 +64,7 @@ QString EITCache::GetStatistics(void) const
39         .arg((hitCnt+prunedHitCnt+wrongChannelHitCnt)/(double)accessCnt);
40 }
41 
42-static inline uint64_t construct_sig(uint tableid, uint version,
43-                                     uint endtime, bool modified)
44-{
45-    return (((uint64_t) modified  << 63) | ((uint64_t) tableid   << 40) |
46-            ((uint64_t) version   << 32) | ((uint64_t) endtime));
47-}
48-
49-static inline uint extract_table_id(uint64_t sig)
50-{
51-    return (sig >> 40) & 0xff;
52-}
53-
54-static inline uint extract_version(uint64_t sig)
55-{
56-    return (sig >> 32) & 0x1f;
57-}
58-
59-static inline uint extract_endtime(uint64_t sig)
60-{
61-    return sig & 0xffffffff;
62-}
63-
64-static inline bool modified(uint64_t sig)
65-{
66-    return sig >> 63;
67-}
68-
69-static void replace_in_db(int chanid, uint eventid, uint64_t sig)
70+static void replace_in_db(int chanid, uint eventid, event_map_entry_t entry)
71 {
72 
73     MSqlQuery query(MSqlQuery::InitCon());
74@@ -97,9 +77,9 @@ static void replace_in_db(int chanid, uint eventid, uint64_t sig)
75     query.prepare(qstr);
76     query.bindValue(":CHANID",   chanid);
77     query.bindValue(":EVENTID",  eventid);
78-    query.bindValue(":TABLEID",  extract_table_id(sig));
79-    query.bindValue(":VERSION",  extract_version(sig));
80-    query.bindValue(":ENDTIME",  extract_endtime(sig));
81+    query.bindValue(":TABLEID",  entry.tableid);
82+    query.bindValue(":VERSION",  entry.version);
83+    query.bindValue(":ENDTIME",  entry.endtime);
84 
85     if (!query.exec())
86         MythDB::DBError("Error updating eitcache", query);
87@@ -248,10 +228,12 @@ event_map_t * EITCache::LoadChannel(uint chanid)
88     {
89         uint eventid = query.value(0).toUInt();
90         uint tableid = query.value(1).toUInt();
91-        uint version = query.value(2).toUInt();
92+        uint version = kVersionInvalid; // Ignore stored version because the version has probably wrapped
93+                                        // by the time we read this!
94         uint endtime = query.value(3).toUInt();
95 
96-        (*eventMap)[eventid] = construct_sig(tableid, version, endtime, false);
97+        event_map_entry_t entry(tableid, version, kTimeInvalid, endtime, false);
98+        (*eventMap)[eventid] = entry;
99     }
100 
101     if (eventMap->size())
102@@ -278,11 +260,11 @@ void EITCache::WriteChannelToDB(uint chanid)
103     event_map_t::iterator it = eventMap->begin();
104     while (it != eventMap->end())
105     {
106-        if (modified(*it) && extract_endtime(*it) > lastPruneTime)
107+        if ((*it).modified && ((*it).endtime > lastPruneTime))
108         {
109             replace_in_db(chanid, it.key(), *it);
110             updated++;
111-            *it &= ~(uint64_t)0 >> 1; // mark as synced
112+            (*it).modified = false; // mark as synced
113         }
114         ++it;
115     }
116@@ -309,10 +291,12 @@ void EITCache::WriteToDB(void)
117 
118 
119 bool EITCache::IsNewEIT(uint chanid,  uint tableid,   uint version,
120-                        uint eventid, uint endtime)
121+                        uint eventid, uint starttime, uint endtime, bool &bEventMayCauseReschedule)
122 {
123     accessCnt++;
124 
125+    bEventMayCauseReschedule = false;
126+
127     if (accessCnt % 500000 == 50000)
128     {
129         LOG(VB_EIT, LOG_INFO, GetStatistics());
130@@ -343,30 +327,117 @@ bool EITCache::IsNewEIT(uint chanid,  uint tableid,   uint version,
131 
132     event_map_t * eventMap = channelMap[chanid];
133     event_map_t::iterator it = eventMap->find(eventid);
134+    bool bEntryUpdated = false;
135+
136     if (it != eventMap->end())
137     {
138-        if (extract_table_id(*it) > tableid)
139+        uint cached_tableid = (*it).tableid;
140+        uint cached_version = (*it).version;
141+        uint cached_starttime = (*it).starttime;
142+        uint cached_endtime = (*it).endtime;
143+        if ((TableID::PF_EIT == tableid) || (TableID::PF_EITo == tableid))
144         {
145-            // EIT from lower (ie. better) table number
146-            tblChgCnt++;
147-        }
148-        else if ((extract_table_id(*it) == tableid) &&
149-                 ((extract_version(*it) < version) ||
150-                  ((extract_version(*it) == kVersionMax) &&
151-                   version < kVersionMax)))
152-        {
153-            // EIT updated version on current table
154-            verChgCnt++;
155+            // tableid is for PF table
156+            if ((TableID::PF_EIT == cached_tableid) || (TableID::PF_EITo == cached_tableid))
157+            {
158+                // Already seen a PF table so check version
159+                // and update if it has changed
160+                if ((kVersionInvalid == cached_version) ||
161+                       (cached_version < version) ||
162+                       ((kVersionMax == cached_version) && (version < kVersionMax)))
163+                {
164+                    LOG(VB_EIT, LOG_INFO, LOC + QString("PF table version change - new (%1 %2) old (%3 %4) eventid %5 for chanid %6")
165+                        .arg(QString().sprintf("%02x", tableid)).arg(QString().sprintf("%02x", version))
166+                        .arg(QString().sprintf("%02x", cached_tableid)).arg(QString().sprintf("%02x", cached_version))
167+                        .arg(eventid).arg(chanid));
168+                    verChgCnt++;
169+                    bEntryUpdated = true;
170+                    if (((cached_starttime != kTimeInvalid) && (cached_starttime != starttime)) || (cached_endtime != endtime))
171+                        bEventMayCauseReschedule = true;
172+                }
173+                else
174+                {
175+                    // EIT data previously seen
176+                    hitCnt++;
177+                    return false;
178+                }
179+            }
180+            else
181+            {
182+                // Old entry is in SC table
183+                LOG(VB_EIT, LOG_INFO, LOC + QString("SC to PF tableid change - new (%1 %2) old (%3 %4) eventid %5 for chanid %6")
184+                        .arg(QString().sprintf("%02x", tableid)).arg(QString().sprintf("%02x", version))
185+                        .arg(QString().sprintf("%02x", cached_tableid)).arg(QString().sprintf("%02x", cached_version))
186+                        .arg(eventid).arg(chanid));
187+                bEntryUpdated = true;
188+                if (((cached_starttime != kTimeInvalid) && (cached_starttime != starttime)) || (cached_endtime != endtime))
189+                    bEventMayCauseReschedule = true;
190+            }
191         }
192         else
193         {
194-            // EIT data previously seen
195-            hitCnt++;
196-            return false;
197+            // tableid is for SC table
198+            if ((TableID::PF_EIT == cached_tableid) || (TableID::PF_EITo == cached_tableid))
199+            {
200+                // Already seen a PF table
201+                hitCnt++;
202+                return false;
203+            }
204+            else if ((cached_tableid & 0x0f) == (tableid & 0x0f))
205+            {
206+                // Already seen in this segment of the table so check version
207+                // and update if it has changed
208+                if ((kVersionInvalid == cached_version) ||
209+                       (cached_version < version) ||
210+                       ((kVersionMax == cached_version) && (version < kVersionMax)))
211+                {
212+                    LOG(VB_EIT, LOG_INFO, LOC + QString("SC table version change - new (%1 %2) old (%3 %4) eventid %5 for chanid %6")
213+                        .arg(QString().sprintf("%02x", tableid)).arg(QString().sprintf("%02x", version))
214+                        .arg(QString().sprintf("%02x", cached_tableid)).arg(QString().sprintf("%02x", cached_version))
215+                        .arg(eventid).arg(chanid));
216+                    verChgCnt++;
217+                    bEntryUpdated = true;
218+                    if (((cached_starttime != kTimeInvalid) && (cached_starttime != starttime)) || (cached_endtime != endtime))
219+                        bEventMayCauseReschedule = true;
220+                }
221+                else
222+                {
223+                    // EIT data previously seen
224+                    hitCnt++;
225+                    return false;
226+                }
227+            }
228+            else if ((cached_tableid & 0x0f) > (tableid < 0x0f))
229+            {
230+                LOG(VB_EIT, LOG_INFO, LOC + QString("SC tableid change - new (%1 %2) old (%3 %4) eventid %5 for chanid %6")
231+                        .arg(QString().sprintf("%02x", tableid)).arg(QString().sprintf("%02x", version))
232+                        .arg(QString().sprintf("%02x", cached_tableid)).arg(QString().sprintf("%02x", cached_version))
233+                        .arg(eventid).arg(chanid));
234+                bEntryUpdated = true;
235+                if (((cached_starttime != kTimeInvalid) && (cached_starttime != starttime)) || (cached_endtime != endtime))
236+                    bEventMayCauseReschedule = true;
237+            }
238+            else
239+            {
240+                // Already seen this segment of SC table
241+                hitCnt++;
242+                return false;
243+            }
244         }
245     }
246+    else
247+        bEventMayCauseReschedule = true;
248 
249-    eventMap->insert(eventid, construct_sig(tableid, version, endtime, true));
250+    if (bEntryUpdated)
251+        LOG(VB_EIT, LOG_INFO, LOC + QString("Updated entry - table (%1 %2) eventid %3 for chanid %4 reschedule %5")
252+            .arg(QString().sprintf("%02x", tableid)).arg(QString().sprintf("%02x", version))
253+            .arg(eventid).arg(chanid).arg(bEventMayCauseReschedule));
254+    else
255+        LOG(VB_EIT, LOG_INFO, LOC + QString("New entry - table (%1 %2) eventid %3 for chanid %4 reschedule %5")
256+            .arg(QString().sprintf("%02x", tableid)).arg(QString().sprintf("%02x", version))
257+            .arg(eventid).arg(chanid).arg(bEventMayCauseReschedule));
258+    event_map_entry_t entry(tableid, version, starttime, endtime, true);
259+    eventMap->insert(eventid, entry);
260     entryCnt++;
261 
262     return true;
263diff --git a/mythtv/libs/libmythtv/eitcache.h b/mythtv/libs/libmythtv/eitcache.h
264index 330b9aa..2ee0380 100644
265--- a/mythtv/libs/libmythtv/eitcache.h
266+++ b/mythtv/libs/libmythtv/eitcache.h
267@@ -16,7 +16,21 @@
268 // MythTV headers
269 #include "mythtvexp.h"
270 
271-typedef QMap<uint, uint64_t> event_map_t;
272+
273+typedef struct __attribute__((__packed__)) event_map_entry
274+{
275+    event_map_entry();
276+    event_map_entry(uchar _tableid, uchar _version, uint _starttime, uint _endtime, bool _modified)
277+            : tableid(_tableid), version(_version), starttime(_starttime), endtime(_endtime), modified(_modified) {}
278+    uchar tableid;
279+    uchar version;
280+    uint starttime;
281+    uint endtime;
282+    bool modified;
283+} event_map_entry_t;
284+
285+typedef QMap<uint, event_map_entry_t> event_map_t;
286+//typedef QMap<uint, uint64_t> event_map_t;
287 typedef QMap<uint, event_map_t*> key_map_t;
288 
289 class EITCache
290@@ -25,8 +39,13 @@ class EITCache
291     EITCache();
292    ~EITCache();
293 
294+    static const uchar kVersionMax;
295+    static const uchar kVersionInvalid;
296+    static const uint kTimeInvalid;
297+    static const uchar kTableidInvalid;
298+
299     bool IsNewEIT(uint chanid, uint tableid,   uint version,
300-                  uint eventid,   uint endtime);
301+                  uint eventid, uint starttime, uint endtime, bool &bEventMayCauseReschedule);
302 
303     uint PruneOldEntries(uint utc_timestamp);
304     void WriteToDB(void);
305@@ -54,8 +73,6 @@ class EITCache
306     uint        prunedHitCnt;
307     uint        wrongChannelHitCnt;
308 
309-    static const uint kVersionMax;
310-
311   public:
312     static MTV_PUBLIC void ClearChannelLocks(void);
313 };
314diff --git a/mythtv/libs/libmythtv/eithelper.cpp b/mythtv/libs/libmythtv/eithelper.cpp
315index 9ee2cc8..ef20ba0 100644
316--- a/mythtv/libs/libmythtv/eithelper.cpp
317+++ b/mythtv/libs/libmythtv/eithelper.cpp
318@@ -61,7 +61,7 @@ uint EITHelper::GetListSize(void) const
319  *
320  *  \return Returns number of events inserted into DB.
321  */
322-uint EITHelper::ProcessEvents(void)
323+uint EITHelper::ProcessEvents(uint &rescheduleRequiredCount)
324 {
325     QMutexLocker locker(&eitList_lock);
326     uint insertCount = 0;
327@@ -77,7 +77,12 @@ uint EITHelper::ProcessEvents(void)
328 
329         eitfixup->Fix(*event);
330 
331-        insertCount += event->UpdateDB(query, 1000);
332+           bool rescheduleRequired;
333+
334+        insertCount += event->UpdateDB(query, 1000, rescheduleRequired);
335+
336+        if (rescheduleRequired)
337+            rescheduleRequiredCount++;
338 
339         delete event;
340         eitList_lock.lock();
341@@ -90,14 +95,14 @@ uint EITHelper::ProcessEvents(void)
342     {
343         LOG(VB_EIT, LOG_INFO,
344             LOC + QString("Added %1 events -- complete(%2) "
345-                          "incomplete(%3) unmatched(%4)")
346+                          "incomplete(%3) unmatched(%4) reschedule(%5)")
347                 .arg(insertCount).arg(db_events.size())
348-                .arg(incomplete_events.size()).arg(unmatched_etts.size()));
349+                .arg(incomplete_events.size()).arg(unmatched_etts.size()).arg(rescheduleRequiredCount));
350     }
351     else
352     {
353         LOG(VB_EIT, LOG_INFO,
354-            LOC + QString("Added %1 events").arg(insertCount));
355+            LOC + QString("Added %1 events - reschedule %2").arg(insertCount).arg(rescheduleRequiredCount));
356     }
357 
358     return insertCount;
359@@ -285,6 +290,9 @@ static inline void parse_dvb_component_descriptors(desc_list_t list,
360 
361 void EITHelper::AddEIT(const DVBEventInformationTable *eit)
362 {
363+    // Skip if not current
364+    if (!eit->IsCurrent())
365+        return;
366     uint descCompression = (eit->TableID() > 0x80) ? 2 : 1;
367     uint fix = fixup.value(eit->OriginalNetworkID() << 16);
368     fix |= fixup.value((((uint64_t)eit->TSID()) << 32) |
369@@ -305,8 +313,10 @@ void EITHelper::AddEIT(const DVBEventInformationTable *eit)
370     for (uint i = 0; i < eit->EventCount(); i++)
371     {
372         // Skip event if we have already processed it before...
373+           bool bEventMayCauseReschedule;
374         if (!eitcache->IsNewEIT(chanid, tableid, version, eit->EventID(i),
375-                              eit->EndTimeUnixUTC(i)))
376+                                eit->StartTimeUnixUTC(i), eit->EndTimeUnixUTC(i),
377+                                bEventMayCauseReschedule))
378         {
379             continue;
380         }
381@@ -473,8 +483,33 @@ void EITHelper::AddEIT(const DVBEventInformationTable *eit)
382             subtitle_type,
383             audio_props,
384             video_props, stars,
385-            seriesId,  programId);
386-
387+            seriesId,  programId, bEventMayCauseReschedule);
388+
389+/*     // If the event is from the now next table and the seriesId and programId are present
390+       // then test whether any recording rules match the seriesId amd programId. If not
391+       // then discard the event.
392+        // For a less argressive discard policy swap the following two lines
393+       //if (((0x4e == tableid) || (0x4f == tableid)) && (!seriesId.isEmpty() || !programId.isEmpty()))
394+       if ((0x4e == tableid) || (0x4f == tableid))
395+        {
396+            // Fix up the seriesId and programId
397+            DBEventEIT tempEvent(*event);
398+            tempEvent.fixup = EITFixUp::kFixGenericDVB;
399+            eitfixup->Fix(tempEvent);
400+            MSqlQuery query(MSqlQuery::InitCon());
401+            query.prepare("SELECT EXISTS(SELECT * FROM record WHERE seriesid = :SERIESID AND programid = :PROGRAMID)");
402+            query.bindValue(":SERIESID", tempEvent.seriesId);
403+            query.bindValue(":PROGRAMID", tempEvent.programId);
404+            if (!query.exec())
405+                MythDB::DBError("AddEIT", query);
406+            if (query.next())
407+                if (!query.value(0).toBool())
408+                {
409+                    LOG(VB_EIT, LOG_INFO, LOC + QString("Discarding now next event - eventid %1").arg(eit->EventID(i)));
410+                    continue;
411+                }
412+            LOG(VB_EIT, LOG_INFO, LOC + QString("Adding now next event to queue - eventid %1").arg(eit->EventID(i)));
413+        }*/
414         db_events.enqueue(event);
415     }
416 }
417@@ -559,7 +594,8 @@ void EITHelper::AddEIT(const PremiereContentInformationTable *cit)
418         }
419 
420         // Skip event if we have already processed it before...
421-        if (!eitcache->IsNewEIT(chanid, tableid, version, contentid, endtime))
422+           bool bEventMayCauseReschedule;
423+        if (!eitcache->IsNewEIT(chanid, tableid, version, contentid, EITCache::kTimeInvalid, endtime, bEventMayCauseReschedule))
424         {
425             continue;
426         }
427@@ -580,7 +616,7 @@ void EITHelper::AddEIT(const PremiereContentInformationTable *cit)
428                 subtitle_type,
429                 audio_props,
430                 video_props, 0.0,
431-                "",  "");
432+                "",  "", bEventMayCauseReschedule);
433 
434             db_events.enqueue(event);
435         }
436@@ -982,4 +1018,4 @@ static void init_fixup(QMap<uint64_t,uint> &fix)
437         fix[ 1094LL << 32 | 1 << 16 | 17028 ] = // NT1
438         fix[ 1100LL << 32 | 1 << 16 |  8710 ] = // NRJ 12
439         EITFixUp::kEFixForceISO8859_15;
440-}
441+}
442\ No newline at end of file
443diff --git a/mythtv/libs/libmythtv/eithelper.h b/mythtv/libs/libmythtv/eithelper.h
444index 790d86e..3a11c86 100644
445--- a/mythtv/libs/libmythtv/eithelper.h
446+++ b/mythtv/libs/libmythtv/eithelper.h
447@@ -62,7 +62,7 @@ class EITHelper
448     virtual ~EITHelper();
449 
450     uint GetListSize(void) const;
451-    uint ProcessEvents(void);
452+    uint ProcessEvents(uint &rescheduleRequiredCount);
453 
454     uint GetGPSOffset(void) const { return (uint) (0 - gps_offset); }
455 
456diff --git a/mythtv/libs/libmythtv/eitscanner.cpp b/mythtv/libs/libmythtv/eitscanner.cpp
457index 0c2a70e..6301d06 100644
458--- a/mythtv/libs/libmythtv/eitscanner.cpp
459+++ b/mythtv/libs/libmythtv/eitscanner.cpp
460@@ -79,6 +79,7 @@ void EITScanner::run(void)
461 
462     MythTimer t;
463     uint eitCount = 0;
464+    uint rescheduleRequiredCount = 0;
465 
466     while (!exitThread)
467     {
468@@ -102,7 +103,7 @@ void EITScanner::run(void)
469 
470         if (list_size)
471         {
472-            eitCount += eitHelper->ProcessEvents();
473+            eitCount += eitHelper->ProcessEvents(rescheduleRequiredCount);
474             t.start();
475         }
476 
477@@ -113,7 +114,12 @@ void EITScanner::run(void)
478             LOG(VB_EIT, LOG_INFO,
479                 LOC_ID + QString("Added %1 EIT Events").arg(eitCount));
480             eitCount = 0;
481-            RescheduleRecordings();
482+
483+            if (rescheduleRequiredCount)
484+            {
485+                rescheduleRequiredCount = 0;
486+                RescheduleRecordings();
487+            }
488         }
489 
490         if (activeScan && (MythDate::current() > activeScanNextTrig))
491@@ -124,7 +130,11 @@ void EITScanner::run(void)
492                 LOG(VB_EIT, LOG_INFO,
493                     LOC_ID + QString("Added %1 EIT Events").arg(eitCount));
494                 eitCount = 0;
495-                RescheduleRecordings();
496+                if (rescheduleRequiredCount)
497+                {
498+                    rescheduleRequiredCount = 0;
499+                    RescheduleRecordings();
500+                }
501             }
502 
503             if (activeScanNextChan == activeScanChannels.end())
504@@ -187,7 +197,7 @@ void EITScanner::RescheduleRecordings(void)
505         MythDate::current().addSecs(kMinRescheduleInterval);
506     resched_lock.unlock();
507 
508-    ScheduledRecording::RescheduleMatch(0, 0, 0, QDateTime(), "EITScanner");
509+    ScheduledRecording::RescheduleMatch(0, 0, 0, QDateTime(), "Requested by EIT Scanner ");
510 }
511 
512 /** \fn EITScanner::StartPassiveScan(ChannelBase*, EITSource*, bool)
513diff --git a/mythtv/libs/libmythtv/programdata.cpp b/mythtv/libs/libmythtv/programdata.cpp
514index 06e822f..77d20ae 100644
515--- a/mythtv/libs/libmythtv/programdata.cpp
516+++ b/mythtv/libs/libmythtv/programdata.cpp
517@@ -750,6 +750,33 @@ uint DBEvent::InsertDB(MSqlQuery &query, uint chanid) const
518     return 1;
519 }
520 
521+uint  DBEventEIT::UpdateDB(MSqlQuery &query, int match_threshold, bool &RescheduleRequired) const
522+{
523+    RescheduleRequired = false;
524+    if (!DBEvent::UpdateDB(query, chanid, match_threshold))
525+        return 0;
526+
527+    if (eventMayCauseReschedule)
528+    {
529+        MSqlQuery localquery(MSqlQuery::InitCon());
530+        localquery.prepare("SELECT EXISTS(SELECT * FROM record WHERE seriesid = :SERIESID AND programid = :PROGRAMID)");
531+        localquery.bindValue(":SERIESID", seriesId);
532+        localquery.bindValue(":PROGRAMID", programId);
533+        if (!localquery.exec())
534+           MythDB::DBError("AddEIT", query);
535+        if (query.next())
536+            if (!query.value(0).toBool())
537+            {
538+                RescheduleRequired = true;
539+                LOG(VB_GENERAL, LOG_INFO, LOC +
540+                    QString("EIT scanner requesting reschedule for - %1 - seriesId %2 programId %3")
541+                    .arg(title).arg(seriesId).arg(programId));
542+            }
543+    }
544+
545+    return 1;
546+}
547+
548 ProgInfo::ProgInfo(const ProgInfo &other) :
549     DBEvent(other.listingsource)
550 {
551diff --git a/mythtv/libs/libmythtv/programdata.h b/mythtv/libs/libmythtv/programdata.h
552index 9c484e6..d8e3583 100644
553--- a/mythtv/libs/libmythtv/programdata.h
554+++ b/mythtv/libs/libmythtv/programdata.h
555@@ -184,11 +184,13 @@ class MTV_PUBLIC DBEventEIT : public DBEvent
556                unsigned char    _audioProps,
557                unsigned char    _videoProps,
558                float            _stars,
559-               const QString   &_seriesId,  const QString   &_programId) :
560+               const QString   &_seriesId,
561+               const QString   &_programId,
562+               bool _eventMayCauseReschedule) :
563         DBEvent(_title, _subtitle, _desc, _category, _category_type,
564                 _start, _end, _subtitleType, _audioProps, _videoProps,
565                 _stars, _seriesId, _programId, kListingSourceEIT),
566-        chanid(_chanid), fixup(_fixup)
567+        chanid(_chanid), fixup(_fixup), eventMayCauseReschedule(_eventMayCauseReschedule)
568     {
569     }
570 
571@@ -206,14 +208,12 @@ class MTV_PUBLIC DBEventEIT : public DBEvent
572     {
573     }
574 
575-    uint UpdateDB(MSqlQuery &query, int match_threshold) const
576-    {
577-        return DBEvent::UpdateDB(query, chanid, match_threshold);
578-    }
579+    uint UpdateDB(MSqlQuery &query, int match_threshold, bool &RescheduleRequired) const;
580 
581   public:
582     uint32_t      chanid;
583     uint32_t      fixup;
584+    bool eventMayCauseReschedule;
585 };
586 
587 class MTV_PUBLIC ProgInfo : public DBEvent