Ticket #7731: delay_unlink_fix_bookmark.patch

File delay_unlink_fix_bookmark.patch, 9.2 KB (added by stichnot@…, 12 years ago)
  • programs/mythtranscode/main.cpp

     
    2828                       ProgramInfo *pginfo);
    2929int BuildKeyframeIndex(MPEG2fixup *m2f, QString &infile,
    3030                       QMap <long long, long long> &posMap, int jobID);
    31 void CompleteJob(int jobID, ProgramInfo *pginfo,
    32                  bool useCutlist, int &resultCode);
     31void CompleteJob(int jobID, ProgramInfo *pginfo, bool useCutlist,
     32                 QMap<long long, int> *deleteMap, int &resultCode);
    3333void UpdateJobQueue(float percent_done);
    3434int CheckJobQueue();
    3535static int glbl_jobID = -1;
     
    674674    }
    675675
    676676    if (jobID >= 0)
    677         CompleteJob(jobID, pginfo, useCutlist, exitcode);
     677        CompleteJob(jobID, pginfo, useCutlist, &deleteMap, exitcode);
    678678
    679679    transcode->deleteLater();
    680680
     
    816816    return unlink(filename.toLocal8Bit().constData());
    817817}
    818818
    819 void CompleteJob(int jobID, ProgramInfo *pginfo, bool useCutlist, int &resultCode)
     819long long ComputeNewBookmark(long long oldBookmark,
     820                             QMap<long long, int> *deleteMap)
    820821{
     822    if (deleteMap == NULL)
     823        return oldBookmark;
     824    long long subtraction = 0;
     825    long long startOfCutRegion = 0;
     826    QMap<long long, int> delMap = *deleteMap;
     827    bool withinCut = false;
     828    while (delMap.count() && delMap.begin().key() <= oldBookmark)
     829    {
     830        if (delMap.begin().data() == MARK_CUT_START && !withinCut)
     831        {
     832            withinCut = true;
     833            startOfCutRegion = delMap.begin().key();
     834        }
     835        else if (delMap.begin().data() == MARK_CUT_END && withinCut)
     836        {
     837            withinCut = false;
     838            subtraction += (delMap.begin().key() - startOfCutRegion);
     839        }
     840        delMap.remove(delMap.begin());
     841    }
     842    if (withinCut)
     843        subtraction += (oldBookmark - startOfCutRegion);
     844    return oldBookmark - subtraction;
     845}
     846
     847long long ReloadBookmark(ProgramInfo *pginfo)
     848{
     849    MSqlQuery query(MSqlQuery::InitCon());
     850    long long currentBookmark = 0;
     851    query.prepare("SELECT DISTINCT mark FROM recordedmarkup "
     852                  "WHERE chanid = :CHANID "
     853                  "AND starttime = :STARTIME "
     854                  "AND type = :MARKTYPE ;");
     855    query.bindValue(":CHANID", pginfo->chanid);
     856    query.bindValue(":STARTTIME", pginfo->recstartts);
     857    query.bindValue(":MARKTYPE", MARK_BOOKMARK);
     858    if (query.exec() && query.next())
     859    {
     860        currentBookmark = query.value(0).toLongLong();
     861    }
     862    return currentBookmark;
     863}
     864
     865void WaitToDelete(ProgramInfo *pginfo, QMap<long long, int> *deleteMap)
     866{
     867    // Reload the latest bookmark, translate it, and write it back so
     868    // that new playback instances get the correct bookmark.
     869    long long previousBookmark = ComputeNewBookmark(ReloadBookmark(pginfo), deleteMap);
     870    pginfo->SetBookmark(previousBookmark);
     871    QDateTime startOfWaiting = mythCurrentDateTime();
     872
     873    VERBOSE(VB_GENERAL,
     874            "Transcode: delete old file: "
     875            "waiting while program is in use.");
     876    bool inUse = true;
     877    MSqlQuery query(MSqlQuery::InitCon());
     878    while (inUse)
     879    {
     880        query.prepare("SELECT count(*) FROM inuseprograms "
     881                      "WHERE chanid = :CHANID "
     882                      "AND starttime = :STARTTIME "
     883                      "AND lastupdatetime < :LASTUPDATETIME "
     884                      "AND recusage = 'player' ;");
     885        query.bindValue(":CHANID", pginfo->chanid);
     886        query.bindValue(":STARTTIME", pginfo->recstartts);
     887        query.bindValue(":LASTUPDATETIME", startOfWaiting);
     888        if (!query.exec() || !query.next())
     889        {
     890            VERBOSE(VB_GENERAL,
     891                    "Transcode: delete old file: in-use query failed;");
     892            inUse = false;
     893        }
     894        else
     895        {
     896            inUse = (query.value(0).toUInt() != 0);
     897        }
     898
     899        if (inUse)
     900        {
     901            unsigned secondsToWait = 10;
     902            VERBOSE(VB_GENERAL,
     903                    QString("Transcode: program in use, "
     904                            "rechecking in %1 seconds.").arg(secondsToWait));
     905            sleep(secondsToWait);
     906        }
     907    }
     908    long long currentBookmark = ReloadBookmark(pginfo);
     909    if (currentBookmark != previousBookmark)
     910    {
     911        pginfo->SetBookmark(ComputeNewBookmark(currentBookmark, deleteMap));
     912    }
     913    VERBOSE(VB_GENERAL, "Transcode: program is no longer in use.");
     914}
     915
     916void CompleteJob(int jobID, ProgramInfo *pginfo, bool useCutlist,
     917                 QMap<long long, int> *deleteMap, int &resultCode)
     918{
    821919    int status = JobQueue::GetJobStatus(jobID);
    822920
    823921    if (!pginfo)
     
    869967                    .arg(tmpfile).arg(newfile) + ENO);
    870968        }
    871969
     970        MSqlQuery query(MSqlQuery::InitCon());
     971
     972        if (useCutlist)
     973        {
     974            query.prepare("DELETE FROM recordedmarkup "
     975                          "WHERE chanid = :CHANID "
     976                          "AND starttime = :STARTTIME "
     977                          "AND type != :BOOKMARK ");
     978            query.bindValue(":CHANID", pginfo->chanid);
     979            query.bindValue(":STARTTIME", pginfo->recstartts);
     980            query.bindValue(":BOOKMARK", MARK_BOOKMARK);
     981
     982            if (!query.exec())
     983                MythDB::DBError("Error in mythtranscode", query);
     984
     985            query.prepare("UPDATE recorded "
     986                          "SET cutlist = :CUTLIST,  "
     987                          "watched = :WATCHED WHERE chanid = :CHANID "
     988                          "AND starttime = :STARTTIME ;");
     989            query.bindValue(":CUTLIST", "0");
     990            query.bindValue(":WATCHED", "0");
     991            query.bindValue(":CHANID", pginfo->chanid);
     992            query.bindValue(":STARTTIME", pginfo->recstartts);
     993
     994            if (!query.exec())
     995                MythDB::DBError("Error in mythtranscode", query);
     996
     997            pginfo->SetCommFlagged(COMM_FLAG_NOT_FLAGGED);
     998        }
     999        else
     1000        {
     1001            query.prepare("DELETE FROM recordedmarkup "
     1002                          "WHERE chanid = :CHANID "
     1003                          "AND starttime = :STARTTIME "
     1004                          "AND type not in ( :COMM_START, "
     1005                          "    :COMM_END, :BOOKMARK, "
     1006                          "    :CUTLIST_START, :CUTLIST_END) ;");
     1007            query.bindValue(":CHANID", pginfo->chanid);
     1008            query.bindValue(":STARTTIME", pginfo->recstartts);
     1009            query.bindValue(":COMM_START", MARK_COMM_START);
     1010            query.bindValue(":COMM_END", MARK_COMM_END);
     1011            query.bindValue(":BOOKMARK", MARK_BOOKMARK);
     1012            query.bindValue(":CUTLIST_START", MARK_CUT_START);
     1013            query.bindValue(":CUTLIST_END", MARK_CUT_END);
     1014
     1015            if (!query.exec())
     1016                MythDB::DBError("Error in mythtranscode", query);
     1017        }
     1018
    8721019        if (!gContext->GetNumSetting("SaveTranscoding", 0))
    8731020        {
     1021            WaitToDelete(pginfo, deleteMap);
    8741022            int err;
    8751023            bool followLinks = gContext->GetNumSetting("DeletesFollowLinks", 0);
    8761024
     
    9711119            }
    9721120        }
    9731121
    974         MSqlQuery query(MSqlQuery::InitCon());
    975 
    976         if (useCutlist)
    977         {
    978             query.prepare("DELETE FROM recordedmarkup "
    979                           "WHERE chanid = :CHANID "
    980                           "AND starttime = :STARTTIME ");
    981             query.bindValue(":CHANID", pginfo->chanid);
    982             query.bindValue(":STARTTIME", pginfo->recstartts);
    983 
    984             if (!query.exec())
    985                 MythDB::DBError("Error in mythtranscode", query);
    986 
    987             query.prepare("UPDATE recorded "
    988                           "SET cutlist = :CUTLIST, bookmark = :BOOKMARK, "
    989                           "watched = :WATCHED WHERE chanid = :CHANID "
    990                           "AND starttime = :STARTTIME ;");
    991             query.bindValue(":CUTLIST", "0");
    992             query.bindValue(":BOOKMARK", "0");
    993             query.bindValue(":WATCHED", "0");
    994             query.bindValue(":CHANID", pginfo->chanid);
    995             query.bindValue(":STARTTIME", pginfo->recstartts);
    996 
    997             if (!query.exec())
    998                 MythDB::DBError("Error in mythtranscode", query);
    999 
    1000             pginfo->SetCommFlagged(COMM_FLAG_NOT_FLAGGED);
    1001         }
    1002         else
    1003         {
    1004             query.prepare("DELETE FROM recordedmarkup "
    1005                           "WHERE chanid = :CHANID "
    1006                           "AND starttime = :STARTTIME "
    1007                           "AND type not in ( :COMM_START, "
    1008                           "    :COMM_END, :BOOKMARK, "
    1009                           "    :CUTLIST_START, :CUTLIST_END) ;");
    1010             query.bindValue(":CHANID", pginfo->chanid);
    1011             query.bindValue(":STARTTIME", pginfo->recstartts);
    1012             query.bindValue(":COMM_START", MARK_COMM_START);
    1013             query.bindValue(":COMM_END", MARK_COMM_END);
    1014             query.bindValue(":BOOKMARK", MARK_BOOKMARK);
    1015             query.bindValue(":CUTLIST_START", MARK_CUT_START);
    1016             query.bindValue(":CUTLIST_END", MARK_CUT_END);
    1017 
    1018             if (!query.exec())
    1019                 MythDB::DBError("Error in mythtranscode", query);
    1020         }
    1021 
    10221122        JobQueue::ChangeJobStatus(jobID, JOB_FINISHED);
    10231123
    10241124    } else {