Ticket #6478: program-timestamp.3.patch

File program-timestamp.3.patch, 25.8 KB (added by chasedouglas@…, 16 years ago)

Modified patch with a few sql query accuracy changes

  • libs/libmythtv/eit.cpp

     
    55using namespace std;
    66
    77// MythTV includes
     8#include "listingsources.h"
    89#include "mythdb.h"
    910#include "mythverbose.h"
    1011#include "eit.h"
     
    388389    query.bindValue(":SYNDICATENO", lsyndicatedepisodenumber);
    389390    query.bindValue(":AIRDATE",     lairdate.isEmpty() ? "0000" : lairdate);
    390391    query.bindValue(":ORIGAIRDATE", loriginalairdate);
    391     query.bindValue(":LSOURCE",     1);
     392    query.bindValue(":LSOURCE",     kEIT);
    392393    query.bindValue(":SERIESID",    lseriesId);
    393394    query.bindValue(":PROGRAMID",   lprogramId);
    394395    query.bindValue(":PREVSHOWN",   lpreviouslyshown);
     
    553554    query.bindValue(":SYNDICATENO", syndicatedepisodenumber);
    554555    query.bindValue(":AIRDATE",     airdate.isEmpty() ? "0000" : airdate);
    555556    query.bindValue(":ORIGAIRDATE", originalairdate);
    556     query.bindValue(":LSOURCE",     1);
     557    query.bindValue(":LSOURCE",     kEIT);
    557558    query.bindValue(":SERIESID",    lseriesId);
    558559    query.bindValue(":PROGRAMID",   lprogramId);
    559560    query.bindValue(":PREVSHOWN",   previouslyshown);
  • libs/libmythtv/libmythtv.pro

     
    161161HEADERS += viewschdiff.h            livetvchain.h
    162162HEADERS += playgroup.h              progdetails.h
    163163HEADERS += channelsettings.h        previewgenerator.h
    164 HEADERS += transporteditor.h
     164HEADERS += transporteditor.h        listingsources.h
    165165HEADERS += myth_imgconvert.h
    166166
    167167# Remove when everything is switched to MythUI
  • libs/libmythtv/dbox2epg.cpp

     
    99
    1010#include "dbox2channel.h"
    1111#include "dbox2epg.h"
     12#include "listingsources.h"
    1213#include "mythdb.h"
    1314#include "mythverbose.h"
    1415#include "tv_rec.h"
     
    183184    query.prepare("INSERT INTO program "
    184185                  "    (chanid,   starttime,  endtime,      "
    185186                  "     title,    subtitle,   description,  "
    186                   "     category, airdate,    stars)        "
     187                  "     category, airdate,    stars,        "
     188                  "     listingsource)"
    187189                  "VALUES "
    188190                  "    (:CHANID,  :STARTTIME, :ENDTIME,     "
    189191                  "     :TITLE,   :SUBTITLE,  :DESCRIPTION, "
    190                   "     :CATEGORY,:AIRDATE,   :STARS)");
     192                  "     :CATEGORY,:AIRDATE,   :STARS,       "
     193                  "     :LSOURCE);");
    191194
    192195    query.bindValue(":CHANID",      chanid);
    193196    query.bindValue(":STARTTIME",   startTime);
     
    198201    query.bindValue(":CATEGORY",    category);
    199202    query.bindValue(":AIRDATE",     "0");
    200203    query.bindValue(":STARS",       "0");
     204    query.bindValue(":LSOURCE",     kDBox2EPG);
    201205
    202206    if (!query.exec())
    203207        MythDB::DBError("Saving new program", query);
  • libs/libmythtv/dbcheck.cpp

     
    1818#define MINIMUM_DBMS_VERSION 5,0,15
    1919
    2020/// This is the DB schema version expected by the running MythTV instance.
    21 const QString currentDatabaseVersion = "1232";
     21const QString currentDatabaseVersion = "1233";
    2222
    2323static bool UpdateDBVersionNumber(const QString &newnumber);
    2424static bool performActualUpdate(
     
    44584458        if (!performActualUpdate(updates, "1232", dbver)) 
    44594459            return false; 
    44604460    }   
     4461    if (dbver == "1232")
     4462    {
     4463        const char *updates[] = {
     4464"ALTER TABLE program"
     4465"    ADD COLUMN lastupdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP "
     4466"        ON UPDATE CURRENT_TIMESTAMP, "
     4467"    ADD INDEX program_lastupdate (lastupdate);",
     4468NULL
     4469};
     4470        if (!performActualUpdate(updates, "1233", dbver))
     4471            return false;
     4472    }
    44614473
    44624474    return true;
    44634475}
  • libs/libmythtv/datadirect.h

     
    327327        uint sourceid, bool insert_channels, bool filter_new_channels);
    328328    static bool UpdateChannelsUnsafe(
    329329        uint sourceid, bool filter_new_channels);
    330     static void DataDirectProgramUpdate(void);
     330    static void DataDirectProgramUpdate(int sourceid, const QDateTime &from, const QDateTime &to);
    331331
    332332    // static command, makes Labs and Schedules Direct ProgramIDs compatible.
    333333    static void FixProgramIDs(void);
  • libs/libmythtv/datadirect.cpp

     
    1313#include "sourceutil.h"
    1414#include "channelutil.h"
    1515#include "frequencytables.h"
     16#include "listingsources.h"
    1617#include "mythwidgets.h"
    1718#include "mythcontext.h"
    1819#include "mythdb.h"
     
    824825    return true;
    825826}
    826827
    827 void DataDirectProcessor::DataDirectProgramUpdate(void)
     828void DataDirectProcessor::DataDirectProgramUpdate(int sourceid, const QDateTime &from, const QDateTime &to)
    828829{
    829830    MSqlQuery query(MSqlQuery::DDCon());
    830831
     832    QString queryString("DELETE program FROM program"
     833                        " LEFT JOIN channel"
     834                        "  ON program.chanid = channel.chanid"
     835                        " LEFT JOIN dd_genre"
     836                        "  ON program.programid = dd_genre.programid"
     837                        "  AND program.category = dd_genre.class"
     838                        "  AND dd_genre.relevance = '0'"
     839                        " LEFT JOIN dd_v_program"
     840                        "  ON program.chanid = dd_v_program.chanid"
     841                        "  AND program.starttime = DATE_ADD(dd_v_program.starttime, INTERVAL channel.tmoffset MINUTE)"
     842                        "  AND program.endtime = DATE_ADD(dd_v_program.endtime, INTERVAL channel.tmoffset MINUTE)"
     843                        "  AND program.title = dd_v_program.title"
     844                        "  AND program.subtitle = dd_v_program.subtitle"
     845                        "  AND program.description = dd_v_program.description"
     846                        "  AND program.showtype = dd_v_program.showtype"
     847                        "  AND program.category_type = dd_v_program.category_type"
     848                        "  AND program.airdate = dd_v_program.airdate"
     849                        "  AND program.stars = dd_v_program.stars"
     850                        "  AND program.stereo = dd_v_program.stereo"
     851                        "  AND program.subtitled = dd_v_program.subtitled"
     852                        "  AND program.subtitletypes = (dd_v_program.subtitled << 1) | dd_v_program.closecaptioned"
     853                        "  AND program.videoprop = dd_v_program.hdtv"
     854                        "  AND program.audioprop = (dd_v_program.dolby << 3) | dd_v_program.stereo"
     855                        "  AND program.hdtv = dd_v_program.hdtv"
     856                        "  AND program.closecaptioned = dd_v_program.closecaptioned"
     857                        "  AND program.partnumber = dd_v_program.partnumber"
     858                        "  AND program.parttotal = dd_v_program.parttotal"
     859                        "  AND program.seriesid = dd_v_program.seriesid"
     860                        "  AND program.originalairdate <=> dd_v_program.originalairdate"
     861                        "  AND program.colorcode = dd_v_program.colorcode"
     862                        "  AND program.syndicatedepisodenumber = dd_v_program.syndicatedepisodenumber"
     863                        "  AND program.programid = dd_v_program.programid"
     864                        " WHERE"
     865                        "  (channel.chanid is NULL"
     866                        "   OR (dd_genre.programid is NULL"
     867                        "       AND (SELECT COUNT(*) FROM dd_genre"
     868                        "             WHERE programid = program.programid))"
     869                        "   OR dd_v_program.chanid is NULL)"
     870                        "  AND program.starttime >= DATE_ADD(:FROM, INTERVAL channel.tmoffset MINUTE)"
     871                        "  AND program.starttime < DATE_ADD(:TO, INTERVAL channel.tmoffset MINUTE)"
     872                        "  AND channel.sourceid = :SOURCEID");
     873
     874    QString preferredSource(gContext->GetSetting("PreferredListingsSource"));
     875    if (!preferredSource.isEmpty() && preferredSource != "datadirect")
     876        queryString += "  AND program.listingsource = " + QString::number(kDataDirect);
     877
     878    queryString += ';';
     879
     880    query.prepare(queryString);
     881    query.bindValue(":FROM", from);
     882    query.bindValue(":TO", to);
     883    query.bindValue(":SOURCEID", sourceid);
     884    if (!query.exec())
     885        MythDB::DBError("Deleting changed entries from program table", query);
     886
     887    query.prepare("DELETE dd_v_program FROM dd_v_program"
     888                  " INNER JOIN channel"
     889                  "  ON dd_v_program.chanid = channel.chanid"
     890                  " LEFT JOIN dd_genre"
     891                  "  ON dd_v_program.programid = dd_genre.programid"
     892                  "  AND dd_genre.relevance = '0'"
     893                  " INNER JOIN program"
     894                  "  ON (program.chanid = dd_v_program.chanid"
     895                  "   AND program.starttime = DATE_ADD(dd_v_program.starttime, INTERVAL channel.tmoffset MINUTE)"
     896                  "   AND program.endtime = DATE_ADD(dd_v_program.endtime, INTERVAL channel.tmoffset MINUTE)"
     897                  "   AND program.title = dd_v_program.title"
     898                  "   AND program.subtitle = dd_v_program.subtitle"
     899                  "   AND program.description = dd_v_program.description"
     900                  "   AND program.showtype = dd_v_program.showtype"
     901                  "   AND program.category = dd_genre.class"
     902                  "   AND program.category_type = dd_v_program.category_type"
     903                  "   AND program.airdate = dd_v_program.airdate"
     904                  "   AND program.stars = dd_v_program.stars"
     905                  "   AND program.stereo = dd_v_program.stereo"
     906                  "   AND program.subtitled = dd_v_program.subtitled"
     907                  "   AND program.subtitletypes = (dd_v_program.subtitled << 1) | dd_v_program.closecaptioned"
     908                  "   AND program.videoprop = dd_v_program.hdtv"
     909                  "   AND program.audioprop = (dd_v_program.dolby << 3) | dd_v_program.stereo"
     910                  "   AND program.hdtv = dd_v_program.hdtv"
     911                  "   AND program.closecaptioned = dd_v_program.closecaptioned"
     912                  "   AND program.partnumber = dd_v_program.partnumber"
     913                  "   AND program.parttotal = dd_v_program.parttotal"
     914                  "   AND program.seriesid = dd_v_program.seriesid"
     915                  "   AND program.originalairdate <=> dd_v_program.originalairdate"
     916                  "   AND program.colorcode = dd_v_program.colorcode"
     917                  "   AND program.syndicatedepisodenumber = dd_v_program.syndicatedepisodenumber"
     918                  "   AND program.programid = dd_v_program.programid"
     919                  " WHERE dd_genre.programid IS NOT NULL"
     920                  "  OR program.category = ''"
     921                  ";");
     922
     923    if (!query.exec("DELETE dd_v_program FROM dd_v_program"
     924                    " INNER JOIN program"
     925                    "  ON dd_v_program.chanid = program.chanid"
     926                    "   AND ((dd_v_program.endtime > program.starttime"
     927                    "     AND dd_v_program.endtime <= program.endtime)"
     928                    "    OR (dd_v_program.starttime >= program.starttime"
     929                    "     AND dd_v_program.starttime < program.endtime)"
     930                    "    OR (dd_v_program.starttime < program.starttime"
     931                    "     AND dd_v_program.endtime > program.endtime));"))
     932        MythDB::DBError("Deleting up-to-date entries from listings source data", query);
     933
    831934    //cerr << "Adding rows to main program table from view table..\n";
    832     if (!query.exec("INSERT IGNORE INTO program (chanid, starttime, endtime, "
    833                     "title, subtitle, description, "
    834                     "showtype, category, category_type, "
    835                     "airdate, stars, previouslyshown, stereo, subtitled, "
    836                     "subtitletypes, videoprop, audioprop, "
    837                     "hdtv, closecaptioned, partnumber, parttotal, seriesid, "
    838                     "originalairdate, colorcode, syndicatedepisodenumber, "
    839                     "programid) "
    840                     "SELECT dd_v_program.chanid, "
    841                     "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
    842                     "DATE_ADD(endtime, INTERVAL channel.tmoffset MINUTE), "
    843                     "title, subtitle, description, "
    844                     "showtype, dd_genre.class, category_type, "
    845                     "airdate, stars, previouslyshown, stereo, subtitled, "
    846                     "(subtitled << 1 ) | closecaptioned, hdtv, "
    847                     "(dolby << 3) | stereo, "
    848                     "hdtv, closecaptioned, partnumber, parttotal, seriesid, "
    849                     "originalairdate, colorcode, syndicatedepisodenumber, "
    850                     "dd_v_program.programid FROM (dd_v_program, channel) "
    851                     "LEFT JOIN dd_genre ON ("
    852                     "dd_v_program.programid = dd_genre.programid AND "
    853                     "dd_genre.relevance = '0') "
    854                     "WHERE dd_v_program.chanid = channel.chanid;"))
     935    query.prepare("INSERT IGNORE INTO program (chanid, starttime, endtime, "
     936                  "title, subtitle, description, "
     937                  "showtype, category, category_type, "
     938                  "airdate, stars, previouslyshown, stereo, subtitled, "
     939                  "subtitletypes, videoprop, audioprop, "
     940                  "hdtv, closecaptioned, partnumber, parttotal, seriesid, "
     941                  "originalairdate, colorcode, syndicatedepisodenumber, "
     942                  "programid, listingsource) "
     943                  "SELECT dd_v_program.chanid, "
     944                  "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
     945                  "DATE_ADD(endtime, INTERVAL channel.tmoffset MINUTE), "
     946                  "title, subtitle, description, "
     947                  "showtype, dd_genre.class, category_type, "
     948                  "airdate, stars, previouslyshown, stereo, subtitled, "
     949                  "(subtitled << 1 ) | closecaptioned, hdtv, "
     950                  "(dolby << 3) | stereo, "
     951                  "hdtv, closecaptioned, partnumber, parttotal, seriesid, "
     952                  "originalairdate, colorcode, syndicatedepisodenumber, "
     953                  "dd_v_program.programid, :LSOURCE "
     954                  "FROM (dd_v_program, channel) "
     955                  "LEFT JOIN dd_genre ON ("
     956                  "dd_v_program.programid = dd_genre.programid AND "
     957                  "dd_genre.relevance = '0') "
     958                  "WHERE dd_v_program.chanid = channel.chanid;");
     959    query.bindValue(":LSOURCE", kDataDirect);
     960    if (!query.exec())
    855961        MythDB::DBError("Inserting into program table", query);
    856962
    857963    //cerr << "Finished adding rows to main program table...\n";
  • libs/libmythtv/programdata.cpp

     
    11// MythTV headers
     2#include "listingsources.h"
    23#include "mythdb.h"
    34#include "mythverbose.h"
    45#include "programinfo.h"
     
    2728    return false;
    2829}
    2930
    30 void ProgramData::clearDataByChannel(int chanid, QDateTime from, QDateTime to)
     31void ProgramData::clearDataByChannel(int chanid, QDateTime from, QDateTime to, bool clearprogram)
    3132{
    3233    int secs;
    3334    QDateTime newFrom, newTo;
     
    4950    newFrom = from.addSecs(secs);
    5051    newTo = to.addSecs(secs);
    5152
    52     query.prepare("DELETE FROM program "
    53                   "WHERE starttime >= :FROM AND starttime < :TO "
    54                   "AND chanid = :CHANID ;");
    55     query.bindValue(":FROM", newFrom);
    56     query.bindValue(":TO", newTo);
    57     query.bindValue(":CHANID", chanid);
    58     query.exec();
     53    if (clearprogram) {
     54        query.prepare("DELETE FROM program "
     55                      "WHERE starttime >= :FROM AND starttime < :TO "
     56                      "AND chanid = :CHANID ;");
     57        query.bindValue(":FROM", newFrom);
     58        query.bindValue(":TO", newTo);
     59        query.bindValue(":CHANID", chanid);
     60        query.exec();
     61    }
    5962
    6063    query.prepare("DELETE FROM programrating "
    6164                  "WHERE starttime >= :FROM AND starttime < :TO "
     
    8285    query.exec();
    8386}
    8487
    85 void ProgramData::clearDataBySource(int sourceid, QDateTime from, QDateTime to)
     88void ProgramData::clearDataBySource(int sourceid, QDateTime from, QDateTime to, bool clearprogram)
    8689{
    8790    MSqlQuery query(MSqlQuery::InitCon());
    8891    query.prepare("SELECT chanid FROM channel WHERE "
     
    97100        while (query.next())
    98101        {
    99102            int chanid = query.value(0).toInt();
    100             clearDataByChannel(chanid, from, to);
     103            clearDataByChannel(chanid, from, to, clearprogram);
    101104        }
    102105    }
    103106}
     
    347350                              "audioprop,videoprop,subtitletypes,subtitled,"
    348351                              "closecaptioned,partnumber,parttotal,"
    349352                              "seriesid,originalairdate,showtype,colorcode,"
    350                               "syndicatedepisodenumber,programid) "
     353                              "syndicatedepisodenumber,programid,"
     354                              "listingsource) "
    351355                              "VALUES(:CHANID,:STARTTIME,:ENDTIME,:TITLE,"
    352356                              ":SUBTITLE,:DESCRIPTION,:CATEGORY,:CATEGORY_TYPE,"
    353357                              ":AIRDATE,:STARS,:PREVIOUSLYSHOWN,"
     
    355359                              ":AUDIOPROP,:VIDEOPROP,:SUBTYPES,:SUBTITLED,"
    356360                              ":CLOSECAPTIONED,:PARTNUMBER,:PARTTOTAL,"
    357361                              ":SERIESID,:ORIGINALAIRDATE,:SHOWTYPE,:COLORCODE,"
    358                               ":SYNDICATEDEPISODENUMBER,:PROGRAMID);");
     362                              ":SYNDICATEDEPISODENUMBER,:PROGRAMID,:LSOURCE);");
    359363                query.bindValue(":CHANID", chanid);
    360364                query.bindValue(":STARTTIME", (*i).start);
    361365                query.bindValue(":ENDTIME", (*i).end);
     
    383387                query.bindValue(":COLORCODE", (*i).colorcode);
    384388                query.bindValue(":SYNDICATEDEPISODENUMBER", (*i).syndicatedepisodenumber);
    385389                query.bindValue(":PROGRAMID", (*i).programid);
     390                query.bindValue(":LSOURCE", kXMLTV);
    386391                if (!query.exec())
    387392                    MythDB::DBError("program insert", query);
    388393
  • libs/libmythtv/programdata.h

     
    104104                        QMap<QString, QList<ProgInfo> > *proglist);
    105105
    106106    static int  fix_end_times(void);
    107     static void clearDataByChannel(int chanid, QDateTime from, QDateTime to);
    108     static void clearDataBySource(int sourceid, QDateTime from, QDateTime to);
     107    static void clearDataByChannel(int chanid, QDateTime from, QDateTime to,
     108                                   bool clearprogram = FALSE);
     109    static void clearDataBySource(int sourceid, QDateTime from, QDateTime to,
     110                                  bool clearprogram = FALSE);
    109111
    110112  private:
    111113    void fixProgramList(QList<ProgInfo> *fixlist);
  • programs/mythfilldatabase/filldata.cpp

     
    308308    VERBOSE(VB_GENERAL, "Data for source cleared.");
    309309
    310310    VERBOSE(VB_GENERAL, "Updating programs.");
    311     DataDirectProcessor::DataDirectProgramUpdate();
     311    DataDirectProcessor::DataDirectProgramUpdate(source.id, fromlocaldt,
     312                                                 tolocaldt);
    312313    VERBOSE(VB_GENERAL, "Program table update complete.");
    313314
    314315    return true;
  • programs/mythfilldatabase/main.cpp

     
    713713        query.prepare("UPDATE program SET generic = 1 WHERE "
    714714            "((programid = '' AND subtitle = '' AND description = '') OR "
    715715            " (programid <> '' AND category_type = 'series' AND "
    716             "  program.programid LIKE '%0000'));");
     716            "  program.programid LIKE '%0000') AND generic <> 1);");
    717717
    718718        if (!query.exec())
    719719            MythDB::DBError("mark generic", query);
     
    814814    if (grab_data)
    815815    {
    816816        MSqlQuery updt(MSqlQuery::InitCon());
    817         updt.exec("UPDATE program SET first = 0, last = 0;");
    818817
    819818        VERBOSE(VB_GENERAL, "Marking episode first showings.");
    820819
     
    828827            {
    829828                updt.prepare("UPDATE program set first = 1 "
    830829                             "WHERE starttime = :STARTTIME "
    831                              "  AND programid = :PROGRAMID;");
     830                             "  AND programid = :PROGRAMID "
     831                             "  AND first <> 1;");
    832832                updt.bindValue(":STARTTIME", query.value(0).toDateTime());
    833833                updt.bindValue(":PROGRAMID", query.value(1).toString());
    834834                updt.exec();
     835
     836                updt.prepare("UPDATE program set first = 0 "
     837                             "WHERE starttime <> :STARTTIME "
     838                             "  AND programid = :PROGRAMID "
     839                             "  AND first <> 0;");
     840                updt.bindValue(":STARTTIME", query.value(0).toDateTime());
     841                updt.bindValue(":PROGRAMID", query.value(1).toString());
     842                updt.exec();
    835843            }
    836844        }
    837845        int found = query.size();
     
    848856                             "WHERE starttime = :STARTTIME "
    849857                             "  AND title = :TITLE "
    850858                             "  AND subtitle = :SUBTITLE "
    851                              "  AND description = :DESCRIPTION");
     859                             "  AND description = :DESCRIPTION "
     860                             "  AND first <> 1;");
    852861                updt.bindValue(":STARTTIME", query.value(0).toDateTime());
    853862                updt.bindValue(":TITLE", query.value(1).toString());
    854863                updt.bindValue(":SUBTITLE", query.value(2).toString());
    855864                updt.bindValue(":DESCRIPTION", query.value(3).toString());
    856865                updt.exec();
     866
     867                updt.prepare("UPDATE program set first = 0 "
     868                             "WHERE starttime <> :STARTTIME "
     869                             "  AND title = :TITLE "
     870                             "  AND subtitle = :SUBTITLE "
     871                             "  AND description = :DESCRIPTION "
     872                             "  AND first <> 0;");
     873                updt.bindValue(":STARTTIME", query.value(0).toDateTime());
     874                updt.bindValue(":TITLE", query.value(1).toString());
     875                updt.bindValue(":SUBTITLE", query.value(2).toString());
     876                updt.bindValue(":DESCRIPTION", query.value(3).toString());
     877                updt.exec();
    857878            }
    858879        }
    859880        found += query.size();
     
    870891            {
    871892                updt.prepare("UPDATE program set last = 1 "
    872893                             "WHERE starttime = :STARTTIME "
    873                              "  AND programid = :PROGRAMID;");
     894                             "  AND programid = :PROGRAMID "
     895                             "  AND last <> 1;");
    874896                updt.bindValue(":STARTTIME", query.value(0).toDateTime());
    875897                updt.bindValue(":PROGRAMID", query.value(1).toString());
    876898                updt.exec();
     899
     900                updt.prepare("UPDATE program set last = 0 "
     901                             "WHERE starttime <> :STARTTIME "
     902                             "  AND programid = :PROGRAMID "
     903                             "  AND last <> 0;");
     904                updt.bindValue(":STARTTIME", query.value(0).toDateTime());
     905                updt.bindValue(":PROGRAMID", query.value(1).toString());
     906                updt.exec();
    877907            }
    878908        }
    879909        found = query.size();
     
    890920                             "WHERE starttime = :STARTTIME "
    891921                             "  AND title = :TITLE "
    892922                             "  AND subtitle = :SUBTITLE "
    893                              "  AND description = :DESCRIPTION");
     923                             "  AND description = :DESCRIPTION "
     924                             "  AND last <> 1;");
    894925                updt.bindValue(":STARTTIME", query.value(0).toDateTime());
    895926                updt.bindValue(":TITLE", query.value(1).toString());
    896927                updt.bindValue(":SUBTITLE", query.value(2).toString());
    897928                updt.bindValue(":DESCRIPTION", query.value(3).toString());
    898929                updt.exec();
     930
     931                updt.prepare("UPDATE program set last = 0 "
     932                             "WHERE starttime <> :STARTTIME "
     933                             "  AND title = :TITLE "
     934                             "  AND subtitle = :SUBTITLE "
     935                             "  AND description = :DESCRIPTION "
     936                             "  AND last <> 0;");
     937                updt.bindValue(":STARTTIME", query.value(0).toDateTime());
     938                updt.bindValue(":TITLE", query.value(1).toString());
     939                updt.bindValue(":SUBTITLE", query.value(2).toString());
     940                updt.bindValue(":DESCRIPTION", query.value(3).toString());
     941                updt.exec();
    899942            }
    900943        }
    901944        found += query.size();