Ticket #6478: program-timestamp.5.patch

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

New patch based against revision 20676

  • 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 = "1235";
     21const QString currentDatabaseVersion = "1236";
    2222
    2323static bool UpdateDBVersionNumber(const QString &newnumber);
    2424static bool performActualUpdate(
     
    45424542        if (!performActualUpdate(updates, "1235", dbver))
    45434543            return false;
    45444544    }
     4545    if (dbver == "1235")
     4546    {
     4547        const char *updates[] = {
     4548"ALTER TABLE program"
     4549"    ADD COLUMN lastupdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP "
     4550"        ON UPDATE CURRENT_TIMESTAMP, "
     4551"    ADD INDEX program_lastupdate (lastupdate);",
     4552NULL
     4553};
     4554        if (!performActualUpdate(updates, "1236", dbver))
     4555            return false;
     4556    }
    45454557
    4546 
    45474558    return true;
    45484559}
    45494560
  • 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

     
    825825    return true;
    826826}
    827827
    828 void DataDirectProcessor::DataDirectProgramUpdate(void)
     828void DataDirectProcessor::DataDirectProgramUpdate(int sourceid, const QDateTime &from, const QDateTime &to)
    829829{
    830830    MSqlQuery query(MSqlQuery::DDCon());
    831831
     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 dd_genre.relevance = '0'"
     838                        " LEFT JOIN dd_v_program"
     839                        "  ON program.chanid = dd_v_program.chanid"
     840                        "  AND program.starttime = DATE_ADD(dd_v_program.starttime, INTERVAL channel.tmoffset MINUTE)"
     841                        "  AND program.endtime = DATE_ADD(dd_v_program.endtime, INTERVAL channel.tmoffset MINUTE)"
     842                        "  AND program.title = dd_v_program.title"
     843                        "  AND program.subtitle = dd_v_program.subtitle"
     844                        "  AND program.description = dd_v_program.description"
     845                        "  AND program.showtype = dd_v_program.showtype"
     846                        "  AND program.category_type = dd_v_program.category_type"
     847                        "  AND program.airdate = dd_v_program.airdate"
     848                        "  AND program.stars = dd_v_program.stars"
     849                        "  AND program.stereo = dd_v_program.stereo"
     850                        "  AND program.subtitled = dd_v_program.subtitled"
     851                        "  AND program.subtitletypes = (dd_v_program.subtitled << 1) | dd_v_program.closecaptioned"
     852                        "  AND program.videoprop = dd_v_program.hdtv"
     853                        "  AND program.audioprop = (dd_v_program.dolby << 3) | dd_v_program.stereo"
     854                        "  AND program.hdtv = dd_v_program.hdtv"
     855                        "  AND program.closecaptioned = dd_v_program.closecaptioned"
     856                        "  AND program.partnumber = dd_v_program.partnumber"
     857                        "  AND program.parttotal = dd_v_program.parttotal"
     858                        "  AND program.seriesid = dd_v_program.seriesid"
     859                        "  AND program.originalairdate <=> dd_v_program.originalairdate"
     860                        "  AND program.colorcode = dd_v_program.colorcode"
     861                        "  AND program.syndicatedepisodenumber = dd_v_program.syndicatedepisodenumber"
     862                        "  AND program.programid = dd_v_program.programid"
     863                        " WHERE"
     864                        "  (channel.chanid is NULL"
     865                        "   OR (dd_genre.programid is NOT NULL"
     866                        "       AND program.category <> dd_genre.class)"
     867                        "   OR dd_v_program.chanid is NULL)"
     868                        "  AND program.starttime >= DATE_ADD(:FROM, INTERVAL channel.tmoffset MINUTE)"
     869                        "  AND program.starttime < DATE_ADD(:TO, INTERVAL channel.tmoffset MINUTE)"
     870                        "  AND channel.sourceid = :SOURCEID");
     871
     872    QString preferredSource(gContext->GetSetting("PreferredListingsSource"));
     873    if (!preferredSource.isEmpty() && preferredSource != "datadirect")
     874        queryString += "  AND program.listingsource = " + QString::number(kListingSourceDDSchedulesDirect);
     875
     876    queryString += ';';
     877
     878    query.prepare(queryString);
     879    query.bindValue(":FROM", from);
     880    query.bindValue(":TO", to);
     881    query.bindValue(":SOURCEID", sourceid);
     882    if (!query.exec())
     883        MythDB::DBError("Deleting changed entries from program table", query);
     884
     885    if (!query.exec("DELETE dd_v_program FROM dd_v_program"
     886                    " INNER JOIN program"
     887                    "  ON dd_v_program.chanid = program.chanid"
     888                    "   AND ((dd_v_program.endtime > program.starttime"
     889                    "     AND dd_v_program.endtime <= program.endtime)"
     890                    "    OR (dd_v_program.starttime >= program.starttime"
     891                    "     AND dd_v_program.starttime < program.endtime)"
     892                    "    OR (dd_v_program.starttime < program.starttime"
     893                    "     AND dd_v_program.endtime > program.endtime));"))
     894        MythDB::DBError("Deleting up-to-date entries from listings source data", query);
     895       
    832896    //cerr << "Adding rows to main program table from view table..\n";
    833897    query.prepare(
    834898        "INSERT IGNORE INTO program "
     
    860924        "  ( dd_v_program.programid = dd_genre.programid AND  "
    861925        "    dd_genre.relevance     = '0' ) "
    862926        "WHERE dd_v_program.chanid = channel.chanid");
    863 
    864927    query.bindValue(":LSOURCE", kListingSourceDDSchedulesDirect);
    865928
    866929    if (!query.exec())
  • libs/libmythtv/programdata.cpp

     
    916916
    917917bool ProgramData::ClearDataByChannel(
    918918    uint chanid, const QDateTime &from, const QDateTime &to,
    919     bool use_channel_time_offset)
     919    bool use_channel_time_offset, bool clear_program)
    920920{
    921921    int secs = 0;
    922922    if (use_channel_time_offset)
     
    926926    QDateTime newTo   = to.addSecs(secs);
    927927
    928928    MSqlQuery query(MSqlQuery::InitCon());
    929     query.prepare("DELETE FROM program "
    930                   "WHERE starttime >= :FROM AND starttime < :TO "
    931                   "AND chanid = :CHANID ;");
    932     query.bindValue(":FROM", newFrom);
    933     query.bindValue(":TO", newTo);
    934     query.bindValue(":CHANID", chanid);
    935     bool ok = query.exec();
     929    bool ok;
    936930
     931    if (clear_program) {
     932        query.prepare("DELETE FROM program "
     933                      "WHERE starttime >= :FROM AND starttime < :TO "
     934                      "AND chanid = :CHANID ;");
     935        query.bindValue(":FROM", newFrom);
     936        query.bindValue(":TO", newTo);
     937        query.bindValue(":CHANID", chanid);
     938        ok = query.exec();
     939    }
     940
    937941    query.prepare("DELETE FROM programrating "
    938942                  "WHERE starttime >= :FROM AND starttime < :TO "
    939943                  "AND chanid = :CHANID ;");
  • libs/libmythtv/programdata.h

     
    261261        uint chanid,
    262262        const QDateTime &from,
    263263        const QDateTime &to,
    264         bool use_channel_time_offset);
     264        bool use_channel_time_offset,
     265        bool clear_program = FALSE);
    265266    static bool ClearDataBySource(
    266267        uint sourceid,
    267268        const QDateTime &from,
  • 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();