[mythtv] [PATCH] better playbackbox interactivity

Jason Rosson etiam at pacbell.net
Wed Dec 17 03:21:02 EST 2003


Attached is a patch to speed up the playbackbox
interactivity when using a theme which has the
program status icons used (the ones in the bottom
left corner on GANT).  Instead of making 5 different
calls to the db for each flag it makes one.

Also, the most expensive db call (for commflag) is
replaced altogether with an added commflagged
column in the recorded table.  NuppelVideoPlayer.cpp
is patched to set the commflagged column in the db
when commercial flagging is done.  dbcheck has been
patched to up the DBSchemeVersion and to do a one time
population of the commflagged column for all existing
recorded programs.

I think interactivity on my machine was so slow
because I have a bunch of programs recorded
and so my recordedmarkup table is huge.  Holding the
remote button down to scroll through a list of
recordings would jump and pause, now it's quite
smooth.

I had another version of this same idea where i cached
all program flags upon entering the playbackbox
and so was even faster as there were no db hits at
all.

If this patch gets accepted and you like the other idea
better, or if you find any things I missed let me know.

thanks.

  - jason
-------------- next part --------------
Index: mythtv/libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/NuppelVideoPlayer.cpp,v
retrieving revision 1.300
diff -u -r1.300 NuppelVideoPlayer.cpp
--- mythtv/libs/libmythtv/NuppelVideoPlayer.cpp	6 Dec 2003 00:01:45 -0000	1.300
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.cpp	17 Dec 2003 08:03:32 -0000
@@ -3360,6 +3360,7 @@
         decoder->SetPositionMap();
 
     m_playbackinfo->SetMarkupFlag(MARK_PROCESSING, false, m_db);
+    m_playbackinfo->SetCommFlagged(true, m_db); 
     db_lock.unlock();
 
     return(comms_found);
Index: mythtv/libs/libmythtv/dbcheck.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/dbcheck.cpp,v
retrieving revision 1.22
diff -u -r1.22 dbcheck.cpp
--- mythtv/libs/libmythtv/dbcheck.cpp	14 Dec 2003 23:56:41 -0000	1.22
+++ mythtv/libs/libmythtv/dbcheck.cpp	17 Dec 2003 08:03:33 -0000
@@ -8,7 +8,7 @@
 
 #include "mythcontext.h"
 
-const QString currentDatabaseVersion = "1021";
+const QString currentDatabaseVersion = "1022";
 
 void UpdateDBVersionNumber(const QString &newnumber)
 {
@@ -460,6 +460,67 @@
 
         performActualUpdate(updates, "1021", dbver);
     }
+
+    if (dbver == "1021")
+    {
+        const QString updates[] = {
+"ALTER TABLE recorded ADD COLUMN commflagged int(10) unsigned NOT NULL default '0';",
+""
+};
+
+        performActualUpdate(updates, "1022", dbver);
+
+        VERBOSE(VB_ALL, QString("This could take a few minutes."));
+
+        QSqlDatabase *db = QSqlDatabase::database();
+
+        QString thequery, chanid, startts;
+        QSqlQuery query;
+        QDateTime recstartts;
+
+        thequery = QString("SELECT recorded.chanid, recorded.starttime "
+                           "FROM recorded, recordedmarkup "
+                           "WHERE recorded.chanid = recordedmarkup.chanid AND "
+                           "recorded.starttime = recordedmarkup.starttime AND "
+                           "(type = 4 OR type = 5) "
+                           "GROUP BY chanid, starttime");
+        query = db->exec(thequery);
+
+        vector<QString*> cfList;
+
+        if (query.isActive() && query.numRowsAffected() > 0)
+        {
+            while (query.next())
+            {
+                chanid  = query.value(0).toString();
+                recstartts = query.value(1).toDateTime();
+                startts = recstartts.toString("yyyyMMddhhmm");
+                startts += "00";
+
+                QString *tmp = new QString[2];
+                tmp[0] = chanid;
+                tmp[1] = startts;
+                cfList.push_back(tmp);
+            }
+        }
+
+        for (unsigned int i = 0; i < cfList.size(); i++)
+        {
+            chanid = cfList[i][0];
+            startts = cfList[i][1];
+
+            thequery = QString("UPDATE recorded "
+                               "SET commflagged = 1, starttime = %2 "
+                               "WHERE chanid = '%1' AND "
+                               "      starttime = '%3';").arg(chanid)
+                                                         .arg(startts)
+                                                         .arg(startts);
+
+            db->exec(thequery);
+            delete cfList[i];
+        }
+    }
+
 }
 
 void InitializeDatabase(void)
Index: mythtv/libs/libmythtv/programinfo.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/programinfo.cpp,v
retrieving revision 1.92
diff -u -r1.92 programinfo.cpp
--- mythtv/libs/libmythtv/programinfo.cpp	16 Dec 2003 22:58:54 -0000	1.92
+++ mythtv/libs/libmythtv/programinfo.cpp	17 Dec 2003 08:03:33 -0000
@@ -949,6 +949,46 @@
         MythContext::DBError("Edit status update", querystr);
 }
 
+bool ProgramInfo::IsCommFlagged(QSqlDatabase *db)
+{
+    MythContext::KickDatabase(db);
+
+    bool result = false;
+
+    QString starts = recstartts.toString("yyyyMMddhhmm");
+    starts += "00";
+
+    QString querystr = QString("SELECT commflagged FROM recorded WHERE "
+                               "chanid = '%1' AND starttime = '%2';")
+                              .arg(chanid).arg(starts);
+
+    QSqlQuery query = db->exec(querystr);
+    if (query.isActive() && query.numRowsAffected() > 0)
+    {
+        query.next();
+
+        result = query.value(0).toInt();
+    }
+
+    return result;
+}
+
+void ProgramInfo::SetCommFlagged(bool flagged, QSqlDatabase *db)
+{
+    MythContext::KickDatabase(db);
+
+    QString starts = recstartts.toString("yyyyMMddhhmm");
+    starts += "00";
+
+    QString querystr = QString("UPDATE recorded SET commflagged = '%1', "
+                               "starttime = '%2' WHERE chanid = '%3' AND "
+                               "starttime = '%4';").arg(flagged).arg(starts)
+                                                   .arg(chanid).arg(starts);
+    QSqlQuery query = db->exec(querystr);
+    if (!query.isActive())
+        MythContext::DBError("Commercial Flagged status update", querystr);
+}
+
 void ProgramInfo::SetAutoExpire(bool autoExpire, QSqlDatabase *db)
 {
     MythContext::KickDatabase(db);
@@ -1704,6 +1744,35 @@
     ScheduledRecording::signalChange(db);
 }
 
+char ProgramInfo::getProgramFlags(QSqlDatabase *db)
+{
+    char flags = 0;
+
+    MythContext::KickDatabase(db);
+        
+    QString starts = recstartts.toString("yyyyMMddhhmm");
+    starts += "00";
+    
+    QString querystr = QString("SELECT commflagged, cutlist, autoexpire, "
+                               "editing, bookmark FROM recorded WHERE "
+                               "chanid = '%1' AND starttime = '%2';")
+                              .arg(chanid).arg(starts);
+    
+    QSqlQuery query = db->exec(querystr);
+    if (query.isActive() && query.numRowsAffected() > 0)
+    {
+        query.next();
+
+        flags |= query.value(0).toInt() ? FL_COMMFLAG : 0;
+        flags |= query.value(1).toString().length() > 1 ? FL_CUTLIST : 0;
+        flags |= query.value(2).toInt() ? FL_AUTOEXP : 0;
+        flags |= query.value(3).toInt() ? FL_EDITING : 0;
+        flags |= query.value(4).toString() != QString::null ? FL_BOOKMARK : 0;
+    }
+
+    return flags;
+}
+
 void ProgramInfo::handleRecording(QSqlDatabase *db)
 {
     QString message = title;
Index: mythtv/libs/libmythtv/programinfo.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/programinfo.h,v
retrieving revision 1.60
diff -u -r1.60 programinfo.h
--- mythtv/libs/libmythtv/programinfo.h	16 Dec 2003 22:58:55 -0000	1.60
+++ mythtv/libs/libmythtv/programinfo.h	17 Dec 2003 08:03:33 -0000
@@ -37,6 +37,14 @@
     TRANSCODE_FLAGS       = 0xF0
 };
 
+enum FlagMask {
+    FL_COMMFLAG  = 0x01,
+    FL_CUTLIST   = 0x02,
+    FL_AUTOEXP   = 0x04,
+    FL_EDITING   = 0x08,
+    FL_BOOKMARK  = 0x10,
+};
+
 enum NoRecordType {
     nrUnknown = 0,
     nrManualOverride = 1,
@@ -113,6 +121,8 @@
     long long GetBookmark(QSqlDatabase *db);
     bool IsEditing(QSqlDatabase *db);
     void SetEditing(bool edit, QSqlDatabase *db);
+    bool IsCommFlagged(QSqlDatabase *db);
+    void SetCommFlagged(bool edit, QSqlDatabase *db);
     void SetAutoExpire(bool autoExpire, QSqlDatabase *db);
     bool GetAutoExpireFromRecorded(QSqlDatabase *db);
 
@@ -150,6 +160,8 @@
     void EditScheduled(QSqlDatabase *db);
     void EditRecording(QSqlDatabase *db);
 
+    char getProgramFlags(QSqlDatabase *db);
+
     static void GetProgramListByQuery(QSqlDatabase *db,
                                         QPtrList<ProgramInfo> *proglist,
                                         const QString &where);
Index: mythtv/programs/mythfrontend/playbackbox.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/programs/mythfrontend/playbackbox.cpp,v
retrieving revision 1.110
diff -u -r1.110 playbackbox.cpp
--- mythtv/programs/mythfrontend/playbackbox.cpp	16 Dec 2003 05:23:40 -0000	1.110
+++ mythtv/programs/mythfrontend/playbackbox.cpp	17 Dec 2003 08:03:34 -0000
@@ -346,13 +346,13 @@
             container->ClearAllText();
             container->SetTextByRegexp(regexpMap);
 
+            char flags = curitem->getProgramFlags(m_db);
+
             UIImageType *itype;
             itype = (UIImageType *)container->GetType("commflagged");
             if (itype)
             {
-                QMap<long long, int> commbreaks;
-                curitem->GetCommBreakList(commbreaks, m_db);
-                if (commbreaks.size())
+                if (flags & FL_COMMFLAG)
                     itype->ResetFilename();
                 else
                     itype->SetImage("blank.png");
@@ -362,9 +362,7 @@
             itype = (UIImageType *)container->GetType("cutlist");
             if (itype)
             {
-                QMap<long long, int> cutlist;
-                curitem->GetCutList(cutlist, m_db);
-                if (cutlist.size())
+                if (flags & FL_CUTLIST)
                     itype->ResetFilename();
                 else
                     itype->SetImage("blank.png");
@@ -374,7 +372,7 @@
             itype = (UIImageType *)container->GetType("autoexpire");
             if (itype)
             {
-                if (curitem->GetAutoExpireFromRecorded(m_db))
+                if (flags & FL_AUTOEXP)
                     itype->ResetFilename();
                 else
                     itype->SetImage("blank.png");
@@ -384,8 +382,8 @@
             itype = (UIImageType *)container->GetType("processing");
             if (itype)
             {
-                if ((curitem->IsEditing(m_db)) ||
-                    (curitem->CheckMarkupFlag(MARK_PROCESSING, m_db)))
+                if ((flags & FL_EDITING) ||
+                    curitem->CheckMarkupFlag(MARK_PROCESSING, m_db))
                     itype->ResetFilename();
                 else
                     itype->SetImage("blank.png");
@@ -395,7 +393,7 @@
             itype = (UIImageType *)container->GetType("bookmark");
             if (itype)
             {
-                if (curitem->GetBookmark(m_db))
+                if (flags & FL_BOOKMARK)
                     itype->ResetFilename();
                 else
                     itype->SetImage("blank.png");


More information about the mythtv-dev mailing list