Ticket #10482: mark_episode_showings.patch

File mark_episode_showings.patch, 7.2 KB (added by sfkoch@…, 12 years ago)

Patch to improve episode marking performance

  • mythtv/programs/mythfilldatabase/main.cpp

    diff --git a/mythtv/programs/mythfilldatabase/main.cpp b/mythtv/programs/mythfilldatabase/main.cpp
    index 57d4709..8ceeb9a 100644
    a b int main(int argc, char *argv[]) 
    648648            MythDB::DBError("Clearing first and last showings", updt);
    649649
    650650        LOG(VB_GENERAL, LOG_INFO, "Marking episode first showings.");
    651 
    652         MSqlQuery query(MSqlQuery::InitCon());
    653         query.prepare("SELECT MIN(starttime),programid FROM program "
    654                       "WHERE programid > '' GROUP BY programid;");
    655         if (query.exec())
    656         {
    657             updt.prepare("UPDATE program set first = 1 "
    658                          "WHERE starttime = :STARTTIME "
    659                          "  AND programid = :PROGRAMID;");
    660             while(query.next())
    661             {
    662                 updt.bindValue(":STARTTIME", query.value(0).toDateTime());
    663                 updt.bindValue(":PROGRAMID", query.value(1).toString());
    664                 if (!updt.exec())
    665                     MythDB::DBError("Marking first showings by id", updt);
    666             }
    667         }
    668         int found = query.size();
    669         query.prepare("SELECT MIN(starttime),title,subtitle,"
    670                       "       LEFT(description, 1024) AS partdesc "
    671                       "FROM program WHERE programid = '' "
    672                       "GROUP BY title,subtitle,partdesc;");
    673         if (query.exec())
    674         {
    675             updt.prepare("UPDATE program set first = 1 "
    676                          "WHERE starttime = :STARTTIME "
    677                          "  AND title = :TITLE "
    678                          "  AND subtitle = :SUBTITLE "
    679                          "  AND LEFT(description, 1024) = :PARTDESC");
    680             while(query.next())
    681             {
    682                 updt.bindValue(":STARTTIME", query.value(0).toDateTime());
    683                 updt.bindValue(":TITLE", query.value(1).toString());
    684                 updt.bindValue(":SUBTITLE", query.value(2).toString());
    685                 updt.bindValue(":PARTDESC", query.value(3).toString());
    686                 if (!updt.exec())
    687                     MythDB::DBError("Marking first showings", updt);
    688             }
    689         }
    690         found += query.size();
     651        updt.prepare("UPDATE program "
     652                     "JOIN (SELECT MIN(starttime) AS starttime, programid "
     653                     "      FROM program "
     654                     "      WHERE programid <> '' "
     655                     "      GROUP BY programid "
     656                     "     ) AS firsts "
     657                     "ON program.programid = firsts.programid "
     658                     "  AND program.starttime = firsts.starttime "
     659                     "SET program.first=1;");
     660        if (!updt.exec())
     661            MythDB::DBError("Marking first showings by id", updt);
     662        int found = updt.numRowsAffected();
     663
     664        updt.prepare("UPDATE program "
     665                      "JOIN (SELECT MIN(starttime) AS starttime, title, subtitle,"
     666                      "           LEFT(description, 1024) AS partdesc "
     667                      "      FROM program "
     668                      "      WHERE programid = '' "
     669                      "      GROUP BY title, subtitle, partdesc "
     670                      "     ) AS firsts "
     671                      "ON program.starttime = firsts.starttime "
     672                      "  AND program.title = firsts.title "
     673                      "  AND program.subtitle = firsts.subtitle "
     674                      "  AND LEFT(program.description, 1024) = firsts.partdesc "
     675                      "SET program.first = 1 "
     676                      "WHERE program.programid = '';");
     677        if (!updt.exec())
     678            MythDB::DBError("Marking first showings", updt);
     679        found += updt.numRowsAffected();
    691680        LOG(VB_GENERAL, LOG_INFO, QString("    Found %1").arg(found));
    692681
    693682        LOG(VB_GENERAL, LOG_INFO, "Marking episode last showings.");
    694         query.prepare("SELECT MAX(starttime),programid FROM program "
    695                       "WHERE programid > '' GROUP BY programid;");
    696         if (query.exec())
    697         {
    698             updt.prepare("UPDATE program set last = 1 "
    699                          "WHERE starttime = :STARTTIME "
    700                          "  AND programid = :PROGRAMID;");
    701             while(query.next())
    702             {
    703                 updt.bindValue(":STARTTIME", query.value(0).toDateTime());
    704                 updt.bindValue(":PROGRAMID", query.value(1).toString());
    705                 if (!updt.exec())
    706                     MythDB::DBError("Marking last showings by id", updt);
    707             }
    708         }
    709         found = query.size();
    710         query.prepare("SELECT MAX(starttime),title,subtitle,"
    711                       "       LEFT(description, 1024) AS partdesc "
    712                       "FROM program WHERE programid = '' "
    713                       "GROUP BY title,subtitle,partdesc;");
    714         if (query.exec())
    715         {
    716             updt.prepare("UPDATE program set last = 1 "
    717                          "WHERE starttime = :STARTTIME "
    718                          "  AND title = :TITLE "
    719                          "  AND subtitle = :SUBTITLE "
    720                          "  AND LEFT(description, 1024) = :PARTDESC");
    721             while(query.next())
    722             {
    723                 updt.bindValue(":STARTTIME", query.value(0).toDateTime());
    724                 updt.bindValue(":TITLE", query.value(1).toString());
    725                 updt.bindValue(":SUBTITLE", query.value(2).toString());
    726                 updt.bindValue(":PARTDESC", query.value(3).toString());
    727                 if (!updt.exec())
    728                     MythDB::DBError("Marking last showings", updt);
    729             }
    730         }
    731         found += query.size();
     683        updt.prepare("UPDATE program "
     684                     "JOIN (SELECT MAX(starttime) AS starttime, programid "
     685                     "      FROM program "
     686                     "      WHERE programid <> '' "
     687                     "      GROUP BY programid "
     688                     "     ) AS lasts "
     689                     "ON program.programid = lasts.programid "
     690                     "  AND program.starttime = lasts.starttime "
     691                     "SET program.last=1;");
     692        if (!updt.exec())
     693            MythDB::DBError("Marking last showings by id", updt);
     694        found = updt.numRowsAffected();
     695
     696        updt.prepare("UPDATE program "
     697                      "JOIN (SELECT MAX(starttime) AS starttime, title, subtitle,"
     698                      "           LEFT(description, 1024) AS partdesc "
     699                      "      FROM program "
     700                      "      WHERE programid = '' "
     701                      "      GROUP BY title, subtitle, partdesc "
     702                      "     ) AS lasts "
     703                      "ON program.starttime = lasts.starttime "
     704                      "  AND program.title = lasts.title "
     705                      "  AND program.subtitle = lasts.subtitle "
     706                      "  AND LEFT(program.description, 1024) = lasts.partdesc "
     707                      "SET program.last = 1 "
     708                      "WHERE program.programid = '';");
     709        if (!updt.exec())
     710            MythDB::DBError("Marking last showings", updt);
     711        found += updt.numRowsAffected();
    732712        LOG(VB_GENERAL, LOG_INFO, QString("    Found %1").arg(found));
    733713    }
    734714