Ticket #602: viewscheddiff4.patch

File viewscheddiff4.patch, 53.0 KB (added by mythtv@…, 18 years ago)

improved version

  • themes/G.A.N.T./ui.xml

     
    550550
    551551  </window>
    552552
     553  <window name="schdiff">
     554
     555    <font name="active_font" face="Arial">
     556      <color>#ffffff</color>
     557      <size>16</size>
     558      <size:small>11</size:small>
     559      <bold>yes</bold>
     560    </font>
     561
     562    <font name="inactive_font" face="Arial">
     563      <color>#9999cc</color>
     564      <size>16</size>
     565      <size:small>11</size:small>
     566      <bold>yes</bold>
     567    </font>
     568
     569    <font name="record_font" face="Arial">
     570      <color>#F7862B</color>
     571      <size>16</size>
     572      <size:small>11</size:small>
     573      <bold>yes</bold>
     574    </font>
     575
     576    <font name="recording_font" face="Arial">
     577      <color>#FF33FF</color>
     578      <size>16</size>
     579      <size:small>11</size:small>
     580      <bold>yes</bold>
     581    </font>
     582
     583    <font name="norecordfnt" face="Arial">
     584      <color>#999999</color>
     585      <size>16</size>
     586      <size:small>11</size:small>
     587      <bold>yes</bold>
     588    </font>
     589
     590    <font name="conflictfnt" face="Arial">
     591      <color>#ffff33</color>
     592      <size>16</size>
     593      <size:small>11</size:small>
     594      <bold>yes</bold>
     595    </font>
     596
     597    <font name="currenttitle" face="Arial">
     598      <color>#ffff33</color>
     599      <size>18</size>
     600      <size:small>12</size:small>
     601      <bold>yes</bold>
     602    </font>
     603
     604    <font name="title" face="Arial">
     605      <color>#ffffff</color>
     606      <dropcolor>#000000</dropcolor>
     607      <size>27</size>
     608      <size:small>13</size:small>
     609      <shadow>3,3</shadow>
     610      <bold>yes</bold>
     611    </font>
     612
     613    <font name="info" face="Arial">
     614      <color>#ffffff</color>
     615      <size>17</size>
     616      <size:small>8</size:small>
     617      <shadow>1,1</shadow>
     618      <bold>yes</bold>
     619    </font>
     620
     621    <font name="message" face="Arial">
     622      <color>#ffffff</color>
     623      <size>16</size>
     624      <size:small>10</size:small>
     625      <shadow>1,1</shadow>
     626      <bold>yes</bold>
     627    </font>
     628
     629    <font name="messagegray" face="Arial">
     630      <color>#999999</color>
     631      <size>16</size>
     632      <size:small>10</size:small>
     633      <shadow>1,1</shadow>
     634      <bold>yes</bold>
     635    </font>
     636
     637    <font name="messageyellow" face="Arial">
     638      <color>#ffff33</color>
     639      <size>16</size>
     640      <size:small>10</size:small>
     641      <shadow>1,1</shadow>
     642      <bold>yes</bold>
     643    </font>
     644
     645    <container name="background">
     646      <textarea name="sched" draworder="0">
     647        <area>20,10,800,40</area>
     648        <font>info</font>
     649        <value>Scheduled Recordings:</value>
     650      </textarea>
     651      <image name="filler" draworder="0" fleximage="yes">
     652        <filename>cr-background.png</filename>
     653        <position>0,39</position>
     654      </image>
     655    </container>
     656
     657    <container name="conflict_info">
     658      <area>400,10,380,30</area>
     659      <textarea name="status" align="right" draworder="4">
     660        <area>0,0,380,30</area>
     661        <font>info</font>
     662      </textarea>
     663    </container>
     664
     665    <container name="showlevel_info">
     666      <area>10,330,280,30</area>
     667      <textarea name="showing" draworder="4">
     668        <area>0,0,105,30</area>
     669        <font>message</font>
     670        <value>Showing:</value>
     671      </textarea>
     672      <textarea name="showlevel" draworder="4">
     673        <area>110,0,150,30</area>
     674        <font>message</font>
     675      </textarea>
     676    </container>
     677
     678    <container name="selector">
     679      <area>0,39,800,290</area>
     680      <listarea name="conflictlist" draworder="4">
     681        <area>20,12,760,265</area>
     682        <fcnfont name="conflictfnt" function="conflictingrecording"></fcnfont>
     683        <fcnfont name="norecordfnt" function="disabledrecording"></fcnfont>
     684        <fcnfont name="active_font" function="active"></fcnfont>
     685        <fcnfont name="inactive_font" function="inactive"></fcnfont>
     686        <fcnfont name="record_font" function="record"></fcnfont>
     687        <fcnfont name="recording_font" function="recording"></fcnfont>
     688        <fcnfont name="active_font" function="selected"></fcnfont>
     689        <columnpadding>10</columnpadding>
     690        <column number="1" width="160" context="-1"></column>
     691        <column number="2" width="120" context="-1"></column>
     692        <column number="3" width="370" context="-1"></column>
     693        <column number="4" width="20" context="-1"></column>
     694        <column number="5" width="20" context="-1"></column>
     695        <items>9</items>
     696        <image function="selectionbar" filename="cr-selectbar.png" location="-14,-5"></image>
     697        <image function="uparrow" filename="uparrow.png" location="755,22"></image>
     698        <image function="downarrow" filename="downarrow.png" location="755,230"></image>
     699      </listarea>
     700      <image name="showinglines" draworder="5" fleximage="no">
     701        <filename>cr-lines.png</filename>
     702        <position>0,0</position>
     703      </image>
     704    </container>
     705
     706    <container name="program_info">
     707      <area>0,360,800,210</area>
     708      <textarea name="title" draworder="6">
     709        <area>20,0,800,40</area>
     710        <font>title</font>
     711      </textarea>
     712      <textarea name="channel" draworder="6">
     713        <area>20,40,160,30</area>
     714        <font>info</font>
     715      </textarea>
     716      <textarea name="timedate" draworder="6">
     717        <area>200,40,420,30</area>
     718        <font>info</font>
     719      </textarea>
     720      <textarea name="subdescr" draworder="6">
     721        <area>20,70,720,140</area>
     722        <font>info</font>
     723        <multiline>yes</multiline>
     724        <value>%SUBTITLE|"|"
     725%%STARS%%DESCRIPTION%</value>
     726      </textarea>
     727    </container>
     728
     729    <container name="status_info">
     730      <area>300,330,480,30</area>
     731      <textarea name="recordingstatus" align="right" draworder="6">
     732        <area>0,0,480,30</area>
     733        <font>message</font>
     734      </textarea>
     735    </container>
     736 
     737
     738   <container name="norecordings_list">
     739      <textarea name="msg" align="center" draworder="8">
     740         <area>0,110,800,70</area>
     741         <font>info</font>
     742         <value>No changes to the recording schedule to show</value>
     743         <multiline>yes</multiline>
     744      </textarea>
     745    </container>
     746
     747  </window>
     748
    553749  <window name="recprioritychannels">
    554750
    555751    <font name="active_font" face="Arial">
  • themes/blue/ui.xml

     
    365365
    366366  </window>
    367367
     368  <window name="schdiff">
     369
     370
     371    <container name="background">
     372      <area> 0, 0, 800, 600</area>
     373      <textarea name="sched" draworder="0">
     374        <area>20,10,800,40</area>
     375        <font>info</font>
     376        <value>Scheduled Recording Changes:</value>
     377      </textarea>
     378      <image name="filler" draworder="0" fleximage="no">
     379        <filename>cr-background.png</filename>
     380        <position>0,0</position>
     381      </image>
     382    </container>
     383
     384    <container name="conflict_info">
     385      <area>400,10,380,30</area>
     386      <textarea name="status" align="right" draworder="4">
     387        <area>0,0,380,30</area>
     388        <font>info</font>
     389      </textarea>
     390    </container>
     391
     392    <container name="showlevel_info">
     393      <area>25,345,280,30</area>
     394      <textarea name="showing" draworder="7">
     395        <area>0,0,105,30</area>
     396        <font>info</font>
     397        <value>Showing:</value>
     398      </textarea>
     399      <textarea name="showlevel" draworder="7">
     400        <area>110,0,150,30</area>
     401        <font>info</font>
     402      </textarea>
     403    </container>
     404
     405    <container name="selector">
     406      <area>0,39,800,290</area>
     407      <listarea name="conflictlist" draworder="4">
     408        <area>20,12,760,265</area>
     409        <fcnfont name="list-conflict" function="conflictingrecording"></fcnfont>
     410        <fcnfont name="list-norecord" function="disabledrecording"></fcnfont>
     411        <fcnfont name="list-active" function="active"></fcnfont>
     412        <fcnfont name="list-inactive" function="inactive"></fcnfont>
     413        <fcnfont name="list-record" function="record"></fcnfont>
     414        <fcnfont name="list-recording" function="recording"></fcnfont>
     415        <fcnfont name="list-selected" function="selected"></fcnfont>
     416        <columnpadding>10</columnpadding>
     417        <column number="1" width="165" context="-1"></column>
     418        <column number="2" width="110" context="-1"></column>
     419        <column number="3" width="390" context="-1"></column>
     420        <column number="4" width="20" context="-1"></column>
     421        <column number="5" width="20" context="-1"></column>
     422        <items>9</items>
     423        <image function="selectionbar" filename="cr-selectbar.png" location="-10,-2"></image>
     424        <image function="uparrow" filename="uparrow.png" location="745,12"></image>
     425        <image function="downarrow" filename="downarrow.png" location="745,244"></image>
     426      </listarea>
     427      <image name="showinglines" draworder="5" fleximage="no">
     428        <filename>cr-lines.png</filename>
     429        <position>0,0</position>
     430      </image>
     431    </container>
     432
     433    <container name="program_info">
     434      <area>25,365,775,210</area>
     435      <textarea name="title" draworder="6">
     436        <area>0,0,730,40</area>
     437        <font>title</font>
     438      </textarea>
     439      <textarea name="channel" draworder="6">
     440        <area>0,45,160,30</area>
     441        <font>info</font>
     442      </textarea>
     443      <textarea name="timedate" draworder="6">
     444        <area>175,45,420,30</area>
     445        <font>info</font>
     446      </textarea>
     447      <textarea name="subdescr" draworder="6">
     448        <area>0,75,720,140</area>
     449        <font>metadata</font>
     450        <multiline>yes</multiline>
     451        <value>%SUBTITLE|"|"
     452%%REPEAT%%STARS%%DESCRIPTION%</value>
     453      </textarea>
     454    </container>
     455
     456    <container name="status_info">
     457      <area>300,345,480,30</area>
     458      <textarea name="recordingstatus" align="right" draworder="6">
     459        <area>0,0,480,30</area>
     460        <font>recstatus</font>
     461      </textarea>
     462    </container>
     463
     464
     465   <container name="norecordings_list">
     466      <textarea name="msg" align="center" draworder="8">
     467         <area>0,110,800,70</area>
     468         <font>info</font>
     469         <value>No changes to the recording schedule to show</value>
     470         <multiline>yes</multiline>
     471      </textarea>
     472    </container>
     473
     474  </window>
     475
    368476  <window name="recprioritychannels">
    369477
    370478    <container name="background">
  • libs/libmythtv/channeleditor.cpp

     
    190190    };
    191191
    192192    void save() {};
     193    void save(QString) {};
    193194    void load()
    194195    {
    195196        MSqlQuery query(MSqlQuery::InitCon());
  • libs/libmythtv/scheduledrecording.h

     
    9191
    9292   
    9393    virtual void save();
     94    virtual void save(QString);
    9495
    9596    virtual void loadByID(int id);
    9697    virtual void loadByProgram(const ProgramInfo* proginfo);
     
    168169
    169170public slots:
    170171    void runProgList();
     172    void testRecording();
    171173
    172174protected slots:
    173175    void runShowDetails();
     
    253255    virtual int exec();
    254256    virtual void load();
    255257    virtual void save() { };
     258    virtual void save(QString) { };
    256259
    257260protected slots:
    258261    void open(int id);
  • libs/libmythtv/recordingprofile.h

     
    113113    virtual int exec();
    114114    virtual void load();
    115115    virtual void save() { };
     116    virtual void save(QString) { };
    116117
    117118protected slots:
    118119    void open(int id);
  • libs/libmythtv/dvbtransporteditor.h

     
    8787    DVBTransportList() {}
    8888
    8989    void save() { };
     90    void save(QString) { };
    9091    void load()
    9192    {
    9293        fillSelections();
  • libs/libmythtv/dvbtransporteditor.cpp

     
    6969    };
    7070
    7171    void save() { };
     72    void save(QString) { };
    7273    void load()
    7374    {
    7475        MSqlQuery query(MSqlQuery::InitCon());
  • libs/libmythtv/videosource.h

     
    167167    XMLTV_generic_config(const VideoSource& _parent, QString _grabber);
    168168
    169169    virtual void save();
     170    virtual void save(QString) { save(); }
    170171
    171172protected:
    172173    const VideoSource& parent;
     
    178179public:
    179180    EITOnly_config(const VideoSource& _parent);
    180181    virtual void save();
     182    virtual void save(QString) { save(); }
     183
    181184protected:
    182185    UseEIT *useeit;
    183186};
     
    205208        if (name)
    206209            ConfigurationWizard::save();
    207210    };
     211    virtual void save(QString destination) {
     212        if (name)
     213            ConfigurationWizard::save(destination);
     214    };
    208215
    209216private:
    210217    class ID: virtual public IntegerSetting,
     
    281288        settingValue = "";
    282289        SimpleDBStorage::save();
    283290    };
     291    void save(QString destination) {
     292        changed = true;
     293        settingValue = "";
     294        SimpleDBStorage::save(destination);
     295    };
    284296};
    285297
    286298class DVBVbiDevice: public LineEditSetting, public CCSetting {
     
    295307        settingValue = "";
    296308        SimpleDBStorage::save();
    297309    };
     310    void save(QString destination) {
     311        changed = true;
     312        settingValue = "";
     313        SimpleDBStorage::save(destination);
     314    };
    298315};
    299316
    300317class DVBDiseqcInputList
     
    439456    virtual int exec();
    440457    virtual void load();
    441458    virtual void save() { };
     459    virtual void save(QString) { };
    442460
    443461public slots:
    444462    void menu();
     
    464482    virtual int exec();
    465483    virtual void load();
    466484    virtual void save() { };
     485    virtual void save(QString) { };
    467486
    468487public slots:
    469488    void menu();
     
    483502    virtual int exec();
    484503    virtual void load();
    485504    virtual void save() { };
     505    virtual void save(QString) { };
    486506
    487507protected:
    488508    vector<CardInput*> cardinputs;
     
    530550    void fillDiseqcSettingsInput(QString _pos, QString _port);
    531551
    532552    virtual void save();
     553    virtual void save(QString destination) { save(); }
    533554
    534555  public slots:
    535556    void channelScanner();
  • libs/libmythtv/libmythtv.pro

     
    9393HEADERS += sr_items.h               scheduledrecording.h
    9494HEADERS += signalmonitorvalue.h
    9595HEADERS += mpeg/iso639.h
     96HEADERS += viewschdiff.h
    9697HEADERS += livetvchain.h
    9798
    9899SOURCES += programinfo.cpp          proglist.cpp
     
    106107SOURCES += sr_items.cpp             scheduledrecording.cpp
    107108SOURCES += signalmonitorvalue.cpp
    108109SOURCES += mpeg/iso639.cpp
     110SOURCES += viewschdiff.cpp
    109111SOURCES += livetvchain.cpp
    110112
    111113using_frontend {
  • libs/libmythtv/scanwizardhelpers.h

     
    120120        { setLabel(QObject::tr("Video Source")); }
    121121    virtual void load();
    122122    virtual void save() {}
     123    virtual void save(QString) {}
    123124  private:
    124125    int sourceid;
    125126};
     
    135136        { setLabel(QObject::tr("Transport")); }
    136137    virtual void load() { refresh(); }
    137138    virtual void save() { ; }
     139    virtual void save(QString) { ; }
    138140
    139141    void refresh();
    140142  public slots:
     
    165167        { setLabel(QObject::tr("Capture Card")); }
    166168    virtual void load() { refresh(); }
    167169    virtual void save() { ; }
     170    virtual void save(QString) { ; }
    168171    void refresh();
    169172
    170173  public slots:
  • libs/libmythtv/programinfo.h

     
    320320        return at(index);
    321321    };
    322322
    323     bool FromScheduler(bool &hasConflicts);
     323    bool FromScheduler(bool &hasConflicts, QString altTable = "", int recordid=-1);
    324324    bool FromScheduler(void) {
    325325        bool dummyConflicts;
    326326        return FromScheduler(dummyConflicts);
  • libs/libmythtv/programinfo.cpp

     
    34783478 *                                                                           *
    34793479 * ************************************************************************* */
    34803480
    3481 bool ProgramList::FromScheduler(bool &hasConflicts)
     3481bool ProgramList::FromScheduler(bool &hasConflicts, QString database, int recordid)
    34823482{
    34833483    clear();
    34843484    hasConflicts = false;
    34853485
    3486     QStringList slist = QString("QUERY_GETALLPENDING");
     3486    QString query;
     3487    if (database != "")
     3488    {
     3489        query = QString("QUERY_GETALLPENDING %1 %2").arg(database).arg(recordid);
     3490    } else {
     3491        query = QString("QUERY_GETALLPENDING");
     3492    }
     3493
     3494    QStringList slist = query;
     3495
    34873496    if (!gContext->SendReceiveStringList(slist) || slist.size() < 2)
    34883497    {
    34893498        VERBOSE(VB_IMPORTANT,
  • libs/libmythtv/sr_root.h

     
    2727         DialogDoneListItem* cancelItem;
    2828         DialogDoneListItem* recordAsShownItem;
    2929         ManagedListItem* upcomingButton;         
     30         ManagedListItem* testButton;         
    3031         ManagedListItem* detailsButton;
    3132
    3233         class SRSchedOptionsGroup* schedOptions;
  • libs/libmythtv/scheduledrecording.cpp

     
    88#include "sr_dialog.h"
    99#include "jobqueue.h"
    1010#include "mythdbcon.h"
     11#include "viewschdiff.h"
    1112
    1213#include <qlayout.h>
    1314#include <qlabel.h>
    1415#include <qapplication.h>
    1516#include <qregexp.h>
     17#include <qsqlquery.h>
    1618
    1719// NOTE: if this changes, you _MUST_ update the RecTypePriority function
    1820// in recordingtypes.cpp.
     
    435437    signalChange(getRecordID());
    436438}
    437439
     440void ScheduledRecording::save(QString destination)
     441{
     442    if (type->isChanged() && getRecordingType() == kNotRecording)
     443    {
     444        remove();
     445    }
     446    else
     447    {
     448        ConfigurationGroup::save(destination);
     449    }
     450}
     451
    438452void ScheduledRecording::remove()
    439453{
    440454    int rid = getRecordID();
     
    813827    recgroup->setChanged();
    814828}
    815829
     830void
     831ScheduledRecording::testRecording()
     832{
     833
     834    QString ttable = "record_tmp";
     835
     836    MSqlQueryInfo dbcon = MSqlQuery::SchedCon();
     837    MSqlQuery query(dbcon);
     838    QString thequery;
     839
     840    thequery ="SELECT GET_LOCK(:LOCK, 2);";
     841    query.prepare(thequery);
     842    query.bindValue(":LOCK", "DiffSchedule");
     843    query.exec();
     844    if (query.lastError().type() != QSqlError::None)
     845    {
     846        QString msg =
     847            QString("DB Error (Obtaining lock in testRecording): \n"
     848                    "Query was: %1 \nError was: %2 \n")
     849            .arg(thequery)
     850            .arg(MythContext::DBErrorMessage(query.lastError()));
     851        VERBOSE(VB_IMPORTANT, msg);
     852        return;
     853    }
     854
     855
     856    thequery = QString("DROP TABLE IF EXISTS %1;").arg(ttable);
     857    query.prepare(thequery);
     858    query.exec();
     859    if (query.lastError().type() != QSqlError::None)
     860    {
     861        QString msg =
     862            QString("DB Error (deleting old table in testRecording): \n"
     863                    "Query was: %1 \nError was: %2 \n")
     864            .arg(thequery)
     865            .arg(MythContext::DBErrorMessage(query.lastError()));
     866        VERBOSE(VB_IMPORTANT, msg);
     867        return;
     868    }
     869
     870    thequery = QString("CREATE TABLE %1 SELECT * FROM record;").arg(ttable);
     871    query.prepare(thequery);
     872    query.exec();
     873    if (query.lastError().type() != QSqlError::None)
     874    {
     875        QString msg =
     876            QString("DB Error (create new table): \n"
     877                    "Query was: %1 \nError was: %2 \n")
     878            .arg(thequery)
     879            .arg(MythContext::DBErrorMessage(query.lastError()));
     880        VERBOSE(VB_IMPORTANT, msg);
     881        return;
     882    }
     883
     884    thequery = QString("SHOW COLUMNS FROM %1;").arg(ttable);
     885    query.prepare(thequery);
     886    query.exec();
     887    if (query.lastError().type() != QSqlError::None)
     888    {
     889        QString msg =
     890            QString("DB Error (query columns): \n"
     891                    "Query was: %1 \nError was: %2 \n")
     892            .arg(thequery)
     893            .arg(MythContext::DBErrorMessage(query.lastError()));
     894        VERBOSE(VB_IMPORTANT, msg);
     895        return;
     896    }
     897
     898    QStringList cols;
     899    QStringList coltype;
     900    while (query.next()) {
     901        cols.push_back(query.value(0).toString());
     902        coltype.push_back(query.value(1).toString());
     903    }
     904
     905    QDict<QVariant> newvals;
     906    newvals.setAutoDelete(true);
     907
     908
     909    if (getRecordID() == 0)
     910        thequery = QString("INSERT INTO %1 SET").arg(ttable);
     911    else
     912        thequery = QString("UPDATE %1 SET").arg(ttable);
     913
     914    char pref = ' ';
     915
     916    Setting *s;
     917    for (unsigned int i = 0; i < cols.count(); i++) {
     918        if (cols[i] == "recordid") continue;
     919        int c = coltype[i].find('(');
     920        QString ctype = coltype[i];
     921        if (c != -1) ctype.truncate(c);
     922
     923        s = byName(cols[i]);
     924        if (!s) continue;
     925        if (!s->isChanged()) continue;
     926
     927        QVariant *v = NULL;
     928        if (ctype == "tinyint" || ctype == "int")
     929            v = new QVariant(s->getValue().toInt());
     930        else if (ctype == "varchar" || ctype == "text" ||
     931                 ctype == "date" || ctype == "time")
     932            v = new QVariant(s->getValue().utf8());
     933        else if (ctype == "float")
     934            v = new QVariant(s->getValue().toFloat());
     935        else
     936        {
     937            QString msg =
     938                QString("Unknown column type %1 for field %2")
     939                .arg(ctype).arg(cols[i]);
     940            VERBOSE(VB_IMPORTANT, msg);
     941            continue;
     942        }
     943
     944        newvals.insert(cols[i],  v);
     945        thequery += pref;
     946        thequery += ' ';
     947        pref = ',';
     948        thequery += QString("%1 = :%2").arg(cols[i]).arg(cols[i]);
     949    }
     950    if (getRecordID() != 0) thequery += QString(" WHERE recordid = :RECORDID");
     951    query.prepare(thequery);
     952    if (getRecordID() != 0) query.bindValue(":RECORDID", getRecordID());
     953    for (unsigned int i = 0; i < cols.count(); i++) {
     954        QVariant *v = newvals[cols[i]];
     955        if (v) query.bindValue(":" + cols[i], *v);
     956    }
     957    query.exec();
     958    if (query.lastError().type() != QSqlError::None)
     959    {
     960        QString msg =
     961            QString("DB Error (query columns): \n"
     962                    "Query was: %1 \nError was: %2 \n")
     963            .arg(thequery)
     964            .arg(MythContext::DBErrorMessage(query.lastError()));
     965        VERBOSE(VB_IMPORTANT, msg);
     966        return;
     967    }
     968
     969    ViewScheduleDiff vsd(gContext->GetMainWindow(), "Recording Changes", ttable, getRecordID());
     970
     971//    query2.prepare(QString("DROP TABLE %1;").arg(ttable));
     972//    query2.exec();
     973//fprintf (stderr, "drop2\n");
     974
     975    thequery = "SELECT RELEASE_LOCK(:LOCK);";
     976    query.prepare(thequery);
     977    query.bindValue(":LOCK", "DiffSchedule");
     978    query.exec();
     979    if (query.lastError().type() != QSqlError::None)
     980    {
     981        QString msg =
     982            QString("DB Error (free lock): \n"
     983                    "Query was: %1 \nError was: %2 \n")
     984            .arg(thequery)
     985            .arg(MythContext::DBErrorMessage(query.lastError()));
     986        VERBOSE(VB_IMPORTANT, msg);
     987        return;
     988    }
     989
     990    vsd.exec();
     991}
     992
    816993/* vim: set expandtab tabstop=4 shiftwidth=4: */
  • libs/libmythtv/sr_root.cpp

     
    1010    cancelItem->setState(MLS_BOLD);
    1111    addItem(cancelItem);
    1212
    13 
    1413    recType = new SRRecordingType(schedRec, _parentList, this);
    1514    addItem(recType->getItem(), -1);
    1615    connect(recType->getItem(), SIGNAL(changed(ManagedListItem*)), this, SLOT(itemChanged(ManagedListItem*)));
     
    3433    addItem(upcomingButton, -1);
    3534    connect(upcomingButton, SIGNAL(selected(ManagedListItem*)), _rec, SLOT(runProgList()));
    3635
     36    testButton = new ManagedListItem(QObject::tr("Display recording changes"),
     37                                         _parentList, this, "test");
     38    addItem(testButton, -1);
     39    connect(testButton, SIGNAL(selected(ManagedListItem*)), _rec, SLOT(testRecording()));
     40
    3741    recordAsShownItem = new DialogDoneListItem(QString("[ %1 ]").arg(QObject::tr("Save these settings")),
    3842                                               MythDialog::Accepted, NULL, _parentList, this, "recordAsShown");
    3943    recordAsShownItem->setState(MLS_BOLD);
  • libs/libmythtv/channelsettings.h

     
    2626    };
    2727
    2828    void load() { };
    29     void save()
     29    void save(QString table)
    3030    {
    3131        if (intValue() == 0) {
    3232            setValue(findHighest());
     
    5353            if (query.numRowsAffected() != 1)
    5454                cerr << "ChannelID:Failed to insert into: " << table << endl;
    5555        }
    56     };
     56    }
     57    void save()
     58    {
     59        save(table);
     60    }
    5761
    5862    int findHighest(int floor = 1000)
    5963    {
  • libs/libmythtv/profilegroup.h

     
    114114    virtual int exec();
    115115    virtual void load();
    116116    virtual void save() {};
     117    virtual void save(QString) {};
    117118
    118119protected slots:
    119120    void open(int id);
  • libs/libmythtv/channeleditor.h

     
    5757    };
    5858
    5959    void save() {};
     60    void save(QString) {};
    6061    void load() {
    6162        fillSelections();
    6263    };
  • libs/libmyth/settings.cpp

     
    109109        (*i)->save();
    110110}
    111111
     112void ConfigurationGroup::save(QString destination) {
     113    for(childList::iterator i = children.begin() ;
     114        i != children.end() ;
     115        ++i )
     116        (*i)->save(destination);
     117}
     118
    112119QWidget* VerticalConfigurationGroup::configWidget(ConfigurationGroup *cg,
    113120                                                  QWidget* parent,
    114121                                                  const char* widgetName)
     
    350357        children[top]->save();
    351358}
    352359
     360void StackedConfigurationGroup::save(QString destination) {
     361    if (saveAll)
     362        ConfigurationGroup::save(destination);
     363    else if (top < children.size())
     364        children[top]->save(destination);
     365}
     366
    353367void TriggeredConfigurationGroup::setTrigger(Configurable* _trigger) {
    354368    trigger = _trigger;
    355369    // Make sure the stack is after the trigger
     
    981995    }
    982996}
    983997
    984 void SimpleDBStorage::save()
     998void SimpleDBStorage::save(QString table)
    985999{
    9861000    if (!isChanged())
    9871001        return;
     
    10111025    }
    10121026}
    10131027
    1014 void AutoIncrementStorage::save() {
     1028void SimpleDBStorage::save()
     1029{
     1030    save(table);
     1031}
     1032
     1033void AutoIncrementStorage::save(QString table) {
    10151034    if (intValue() == 0)
    10161035    {
    10171036        // Generate a new, unique ID
     
    10381057    }
    10391058}
    10401059
     1060void AutoIncrementStorage::save()
     1061{
     1062    save(table);
     1063}
     1064
    10411065void ListBoxSetting::setEnabled(bool b)
    10421066{
    10431067    Configurable::setEnabled(b);
  • libs/libmyth/langsettings.cpp

     
    2525        gContext->SaveSetting("Language", getValue());
    2626        LanguageSettings::reload();
    2727    };
     28    virtual void save(QString destination) { }
    2829};
    2930
    3031
  • libs/libmyth/settings.h

     
    3030
    3131    virtual void load() = 0;
    3232    virtual void save() = 0;
     33    virtual void save(QString destination) = 0;
    3334
    3435    // A name for looking up the setting
    3536    void setName(QString str) {
     
    123124    virtual void load();
    124125
    125126    virtual void save();
     127    virtual void save(QString destination);
    126128
    127129    void setUseLabel(bool useit) { uselabel = useit; }
    128130    void setUseFrame(bool useit) { useframe = useit; }
     
    183185
    184186    void raise(Configurable* child);
    185187    virtual void save();
     188    virtual void save(QString destination);
    186189
    187190    // save all children, or only the top?
    188191    void setSaveAll(bool b) { saveAll = b; };
     
    597600
    598601    virtual void load() = 0;
    599602    virtual void save() = 0;
     603    virtual void save(QString destination) = 0;
    600604
    601605protected:
    602606    QString getColumn(void) const { return column; };
     
    615619
    616620    virtual void load();
    617621    virtual void save();
     622    virtual void save(QString destination);
    618623
    619624protected:
    620625
     
    628633public:
    629634    virtual void load() {  }
    630635    virtual void save() {  }
     636    virtual void save(QString) {  }
    631637};
    632638
    633639class AutoIncrementStorage: virtual public IntegerSetting, public DBStorage {
     
    639645
    640646    virtual void load() { };
    641647    virtual void save();
     648    virtual void save(QString destination);
    642649};
    643650
    644651class ButtonSetting: virtual public Setting {
  • programs/mythfrontend/main.cpp

     
    2323#include "previousbox.h"
    2424#include "customrecord.h"
    2525#include "viewscheduled.h"
     26#include "viewschdiff.h"
    2627#include "programrecpriority.h"
    2728#include "channelrecpriority.h"
    2829#include "globalsettings.h"
  • programs/mythbackend/mainserver.cpp

     
    379379    }
    380380    else if (command == "QUERY_GETALLPENDING")
    381381    {
    382         HandleGetPendingRecordings(pbs);
     382        if (tokens.size() == 1)
     383            HandleGetPendingRecordings(pbs);
     384        else if (tokens.size() == 2)
     385            HandleGetPendingRecordings(pbs, tokens[1]);
     386        else
     387            HandleGetPendingRecordings(pbs, tokens[1], tokens[2].toInt());
    383388    }
    384389    else if (command == "QUERY_GETALLSCHEDULED")
    385390    {
     
    19371942    SendResponse(pbssock, strlist);
    19381943}
    19391944
    1940 void MainServer::HandleGetPendingRecordings(PlaybackSock *pbs)
     1945void MainServer::HandleGetPendingRecordings(PlaybackSock *pbs, QString table, int recordid)
    19411946{
    19421947    QSocket *pbssock = pbs->getSocket();
    19431948
    19441949    QStringList strList;
    19451950
    1946     if (m_sched)
    1947         m_sched->getAllPending(strList);
     1951    if (m_sched) {
     1952        if (table == "") m_sched->getAllPending(strList);
     1953        else {
     1954            // We need a different connection from the scheduler proper
     1955            // DDCon exists, although it's designed for other purposes.
     1956            MSqlQueryInfo dbconn = MSqlQuery::DDCon();
     1957            Scheduler *sched = new Scheduler(false, encoderList, table, &dbconn);
     1958            sched->FillRecordListFromDB(recordid);
     1959            sched->getAllPending(strList);
     1960            delete sched;
     1961        }
     1962    }
    19481963    else
    19491964    {
    19501965        strList << QString::number(0);
  • programs/mythbackend/scheduler.cpp

     
    3131#include "libmythtv/programinfo.h"
    3232#include "libmythtv/scheduledrecording.h"
    3333
    34 Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList)
     34Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList, QString recordTbl, MSqlQueryInfo *databaseConnection)
    3535{
    3636    hasconflicts = false;
    3737    m_tvList = tvList;
    3838
     39    if (databaseConnection) dbConn = *databaseConnection;
     40    else dbConn = MSqlQuery::SchedCon();
     41
     42    recordTable = recordTbl;
     43
    3944    m_mainServer = NULL;
    4045
    4146    m_isShuttingDown = false;
     
    7782{
    7883    QString thequery;
    7984
    80     MSqlQuery query(MSqlQuery::SchedCon());
     85    MSqlQuery query(dbConn);
    8186    query.prepare("SELECT NULL FROM capturecard;");
    8287
    8388    int numcards = -1;
     
    103108        while (query.next())
    104109        {
    105110            source = query.value(0).toInt();
    106             MSqlQuery subquery(MSqlQuery::SchedCon());
     111            MSqlQuery subquery(dbConn);
    107112
    108113            subquery.prepare("SELECT cardinputid FROM cardinput WHERE "
    109114                             "sourceid = :SOURCEID ORDER BY cardinputid;");
     
    275280    return hasconflicts;
    276281}
    277282
    278 void Scheduler::FillRecordListFromDB(void)
     283void Scheduler::FillRecordListFromDB(int recordid)
    279284{
    280     MSqlQuery query(MSqlQuery::SchedCon());
    281     query.prepare("CREATE TEMPORARY TABLE recordmatch "
     285    struct timeval fillstart, fillend;
     286
     287    gettimeofday(&fillstart, NULL);
     288   
     289    MSqlQuery query(dbConn);
     290    QString thequery;
     291    if (recordid == -1)
     292    {
     293            thequery = "CREATE TEMPORARY TABLE recordmatch "
    282294                  "(recordid int unsigned, chanid int unsigned, "
    283295                  " starttime datetime, manualid int unsigned, "
    284                   " INDEX (recordid));");
     296                  " INDEX (recordid));";
     297    } else {
     298            thequery = "CREATE TEMPORARY TABLE recordmatch "
     299                  "(recordid int unsigned, chanid int unsigned, "
     300                  " starttime datetime, manualid int unsigned, "
     301                  " INDEX (recordid)) SELECT * from recordmatch;";
     302    }
     303
     304    query.prepare(thequery);
    285305    query.exec();
    286306    if (!query.isActive())
    287307    {
     
    289309        return;
    290310    }
    291311
    292     UpdateMatches(-1);
     312    UpdateMatches(recordid);
    293313    FillRecordList();
     314
     315    MSqlQuery queryDrop(dbConn);
     316    queryDrop.prepare("DROP TEMPORARY TABLE recordmatch;");
     317    queryDrop.exec();
     318    if (!queryDrop.isActive())
     319    {
     320        MythContext::DBError("FillRecordListFromDB", queryDrop);
     321        return;
     322    }
     323
     324    gettimeofday(&fillend, NULL);
     325
     326    double schedTime = (fillend.tv_sec - fillstart.tv_sec ) +
     327                         (fillend.tv_usec - fillstart.tv_usec) / 1000000.0;
     328    QString msg;
     329    msg.sprintf("Speculative scheduled %d items in "
     330                "%.2f", (int)reclist.size(),
     331                schedTime);
     332    VERBOSE(VB_GENERAL, msg);
    294333}
    295334
    296335void Scheduler::FillRecordListFromMaster(void)
     
    9801019
    9811020    // Mark anything that was recording as aborted.  We'll fix it up.
    9821021    // if possible, after the slaves connect and we start scheduling.
    983     MSqlQuery query(MSqlQuery::SchedCon());
     1022    MSqlQuery query(dbConn);
    9841023    query.prepare("UPDATE oldrecorded SET recstatus = :RSABORTED "
    9851024                  "  WHERE recstatus = :RSRECORDING");
    9861025    query.bindValue(":RSABORTED", rsAborted);
     
    14251464
    14261465void Scheduler::UpdateManuals(int recordid)
    14271466{
    1428     MSqlQuery query(MSqlQuery::SchedCon());
     1467    MSqlQuery query(dbConn);
    14291468
    1430     query.prepare("SELECT type,title,station,startdate,starttime, "
     1469    query.prepare(QString("SELECT type,title,station,startdate,starttime, "
    14311470                  " enddate,endtime "
    1432                   "FROM record WHERE recordid = :RECORDID");
     1471                  "FROM %1 WHERE recordid = :RECORDID").arg(recordTable));
    14331472    query.bindValue(":RECORDID", recordid);
    14341473    query.exec();
    14351474    if (!query.isActive() || query.size() != 1)
     
    15291568                                       QStringList &where,
    15301569                                       MSqlBindings &bindings)
    15311570{
    1532     MSqlQuery result(MSqlQuery::SchedCon());
     1571    MSqlQuery result(dbConn);
    15331572    QString query;
    15341573    QString qphrase;
    15351574
    15361575    query = QString("SELECT recordid,search,subtitle,description "
    1537                     "FROM record WHERE search <> %1 AND "
    1538                     "(recordid = %2 OR %3 = -1) ")
    1539         .arg(kNoSearch).arg(recordid).arg(recordid);
     1576                    "FROM %1 WHERE search <> %2 AND "
     1577                    "(recordid = %3 OR %4 = -1) ")
     1578        .arg(recordTable).arg(kNoSearch).arg(recordid).arg(recordid);
    15401579
    15411580    result.prepare(query);
    15421581
     
    15741613        case kPowerSearch:
    15751614            qphrase.remove(QRegExp("^\\s*AND\\s+", false));
    15761615            from << result.value(2).toString();
    1577             where << (QString("record.recordid = ") + bindrecid +
     1616            where << (QString("%1.recordid = ").arg(recordTable) + bindrecid +
    15781617                      QString(" AND program.manualid = 0 AND ( %2 )")
    15791618                      .arg(qphrase));
    15801619            break;
    15811620        case kTitleSearch:
    15821621            from << "";
    1583             where << (QString("record.recordid = ") + bindrecid + " AND "
     1622            where << (QString("%1.recordid = ").arg(recordTable) + bindrecid + " AND "
    15841623                      "program.manualid = 0 AND "
    15851624                      "program.title LIKE " + bindlikephrase);
    15861625            break;
    15871626        case kKeywordSearch:
    15881627            from << "";
    1589             where << (QString("record.recordid = ") + bindrecid +
     1628            where << (QString("%1.recordid = ").arg(recordTable) + bindrecid +
    15901629                      " AND program.manualid = 0"
    15911630                      " AND (program.title LIKE " + bindlikephrase +
    15921631                      " OR program.subtitle LIKE " + bindlikephrase +
     
    15941633            break;
    15951634        case kPeopleSearch:
    15961635            from << ", people, credits";
    1597             where << (QString("record.recordid = ") + bindrecid + " AND "
     1636            where << (QString("%1.recordid = ").arg(recordTable) + bindrecid + " AND "
    15981637                      "program.manualid = 0 AND "
    15991638                      "people.name LIKE " + bindphrase + " AND "
    16001639                      "credits.person = people.person AND "
     
    16041643        case kManualSearch:
    16051644            UpdateManuals(result.value(0).toInt());
    16061645            from << "";
    1607             where << (QString("record.recordid = ") + bindrecid + " AND "
    1608                               "program.manualid = record.recordid ");
     1646            where << ((QString("%1.recordid = ").arg(recordTable)) + bindrecid + " AND " +
     1647                              QString("program.manualid = %1.recordid ").arg(recordTable));
    16091648            break;
    16101649        default:
    16111650            VERBOSE(VB_IMPORTANT, QString("Unknown RecSearchType "
     
    16211660    if (recordid == -1 || from.count() == 0)
    16221661    {
    16231662        from << "";
    1624         where << "record.search = :NRST AND "
    1625                  "(record.recordid = :NRRECORDID OR :NRRECORDID = -1) AND "
     1663        QString s("DATABASE.search = :NRST AND "
     1664                 "(DATABASE.recordid = :NRRECORDID OR :NRRECORDID = -1) AND "
    16261665                 "program.manualid = 0 AND "
    1627                  "program.title = record.title ";
     1666                 "program.title = DATABASE.title ");
     1667
     1668        while (1)
     1669        {
     1670            int i = s.find("DATABASE");
     1671            if (i == -1) break;
     1672            s = s.replace(i, strlen("DATABASE"), recordTable);
     1673        }
     1674
     1675        where << s;
    16281676        bindings[":NRST"] = kNoSearch;
    16291677        bindings[":NRRECORDID"] = recordid;
    16301678    }
     
    16331681void Scheduler::UpdateMatches(int recordid) {
    16341682    struct timeval dbstart, dbend;
    16351683
    1636     MSqlQuery query(MSqlQuery::SchedCon());
     1684    MSqlQuery query(dbConn);
    16371685    query.prepare("DELETE FROM recordmatch "
    16381686                  "WHERE recordid = :RECORDID OR :RECORDID = -1;");
    16391687
     
    16731721    {
    16741722        QString query = QString(
    16751723"INSERT INTO recordmatch (recordid, chanid, starttime, manualid) "
    1676 "SELECT record.recordid, program.chanid, program.starttime, "
     1724"SELECT DATABASE.recordid, program.chanid, program.starttime, "
    16771725" IF(search = %1, recordid, 0) "
    1678 "FROM record, program ").arg(kManualSearch) + fromclauses[clause] + QString(
     1726"FROM DATABASE, program ").arg(kManualSearch) + fromclauses[clause] + QString(
    16791727" INNER JOIN channel ON (channel.chanid = program.chanid) "
    16801728"WHERE ") + whereclauses[clause] + QString(" AND channel.visible = 1 AND "
    1681 "((record.type = %1 " // allrecord
    1682 "OR record.type = %2 " // findonerecord
    1683 "OR record.type = %3 " // finddailyrecord
    1684 "OR record.type = %4) " // findweeklyrecord
     1729"((DATABASE.type = %1 " // allrecord
     1730"OR DATABASE.type = %2 " // findonerecord
     1731"OR DATABASE.type = %3 " // finddailyrecord
     1732"OR DATABASE.type = %4) " // findweeklyrecord
    16851733" OR "
    1686 " ((record.station = channel.callsign) " // channel matches
     1734" ((DATABASE.station = channel.callsign) " // channel matches
    16871735"  AND "
    1688 "  ((record.type = %5) " // channelrecord
     1736"  ((DATABASE.type = %5) " // channelrecord
    16891737"   OR"
    1690 "   ((TIME_TO_SEC(record.starttime) = TIME_TO_SEC(program.starttime)) " // timeslot matches
     1738"   ((TIME_TO_SEC(DATABASE.starttime) = TIME_TO_SEC(program.starttime)) " // timeslot matches
    16911739"    AND "
    1692 "    ((record.type = %6) " // timeslotrecord
     1740"    ((DATABASE.type = %6) " // timeslotrecord
    16931741"     OR"
    1694 "     ((DAYOFWEEK(record.startdate) = DAYOFWEEK(program.starttime) "
     1742"     ((DAYOFWEEK(DATABASE.startdate) = DAYOFWEEK(program.starttime) "
    16951743"      AND "
    1696 "      ((record.type = %7) " // weekslotrecord
     1744"      ((DATABASE.type = %7) " // weekslotrecord
    16971745"       OR"
    1698 "       ((TO_DAYS(record.startdate) = TO_DAYS(program.starttime)) " // date matches
     1746"       ((TO_DAYS(DATABASE.startdate) = TO_DAYS(program.starttime)) " // date matches
    16991747"        )"
    17001748"       )"
    17011749"      )"
     
    17131761            .arg(kTimeslotRecord)
    17141762            .arg(kWeekslotRecord);
    17151763
     1764        while (1)
     1765        {
     1766            int i = query.find("DATABASE");
     1767            if (i == -1) break;
     1768            query = query.replace(i, strlen("DATABASE"), recordTable);
     1769        }
     1770
    17161771        VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query %1...").arg(clause));
    17171772
    17181773        gettimeofday(&dbstart, NULL);
    1719         MSqlQuery result(MSqlQuery::SchedCon());
     1774        MSqlQuery result(dbConn);
    17201775        result.prepare(query);
    17211776        result.bindValues(bindings);
    17221777        result.exec();
     
    17571812    QMap<int, bool> tooManyMap;
    17581813    bool checkTooMany = false;
    17591814
    1760     MSqlQuery rlist(MSqlQuery::SchedCon());
    1761     rlist.prepare("SELECT recordid,title,maxepisodes,maxnewest FROM record;");
     1815    MSqlQuery rlist(dbConn);
     1816    rlist.prepare(QString("SELECT recordid,title,maxepisodes,maxnewest FROM %1;").arg(recordTable));
    17621817
    17631818    rlist.exec();
    17641819
     
    17791834
    17801835        if (maxEpisodes && !maxNewest)
    17811836        {
    1782             MSqlQuery epicnt(MSqlQuery::SchedCon());
     1837            MSqlQuery epicnt(dbConn);
    17831838
    17841839            epicnt.prepare("SELECT count(*) FROM recorded "
    17851840                           "WHERE title = :TITLE;");
     
    18011856    }
    18021857
    18031858    QString progfindid = QString(
    1804 "(CASE record.type "
     1859"(CASE DATABASE.type "
    18051860"  WHEN %1 "
    1806 "   THEN record.findid "
     1861"   THEN DATABASE.findid "
    18071862"  WHEN %2 "
    18081863"   THEN to_days(date_sub(program.starttime, interval "
    1809 "                time_format(record.findtime, '%H:%i') hour_minute)) "
     1864"                time_format(DATABASE.findtime, '%H:%i') hour_minute)) "
    18101865"  WHEN %3 "
    18111866"   THEN floor((to_days(date_sub(program.starttime, interval "
    1812 "               time_format(record.findtime, '%H:%i') hour_minute)) - "
    1813 "               record.findday)/7) * 7 + record.findday "
     1867"               time_format(DATABASE.findtime, '%H:%i') hour_minute)) - "
     1868"               DATABASE.findday)/7) * 7 + DATABASE.findday "
    18141869"  WHEN %4 "
    1815 "   THEN record.findid "
     1870"   THEN DATABASE.findid "
    18161871"  ELSE 0 "
    18171872" END) ")
    18181873        .arg(kFindOneRecord)
     
    18261881"program.title, program.subtitle, program.description, "
    18271882"channel.channum, channel.callsign, channel.name, "
    18281883"oldrecorded.endtime IS NOT NULL AS oldrecduplicate, program.category, "
    1829 "record.recpriority, "
    1830 "record.dupin, "
     1884"DATABASE.recpriority, "
     1885"DATABASE.dupin, "
    18311886"recorded.endtime IS NOT NULL AND recorded.endtime < NOW() AS recduplicate, "
    18321887"oldfind.findid IS NOT NULL AS findduplicate, "
    1833 "record.type, record.recordid, "
    1834 "program.starttime - INTERVAL record.startoffset minute AS recstartts, "
    1835 "program.endtime + INTERVAL record.endoffset minute AS recendts, "
    1836 "program.previouslyshown, record.recgroup, record.dupmethod, "
     1888"DATABASE.type, DATABASE.recordid, "
     1889"program.starttime - INTERVAL DATABASE.startoffset minute AS recstartts, "
     1890"program.endtime + INTERVAL DATABASE.endoffset minute AS recendts, "
     1891"program.previouslyshown, DATABASE.recgroup, DATABASE.dupmethod, "
    18371892"channel.commfree, capturecard.cardid, "
    18381893"cardinput.cardinputid, UPPER(cardinput.shareable) = 'Y' AS shareable, "
    18391894"program.seriesid, program.programid, program.category_type, "
    1840 "program.airdate, program.stars, program.originalairdate, record.inactive, "
    1841 "record.parentid, ") + progfindid + ", record.tsdefault, "
     1895"program.airdate, program.stars, program.originalairdate, DATABASE.inactive, "
     1896"DATABASE.parentid, ") + progfindid + ", DATABASE.tsdefault, "
    18421897"oldrecstatus.recstatus, oldrecstatus.reactivate, "
    18431898"channel.recpriority + cardinput.preference "
    18441899+ QString(
    18451900"FROM recordmatch "
    18461901
    1847 " INNER JOIN record ON (recordmatch.recordid = record.recordid) "
     1902" INNER JOIN DATABASE ON (recordmatch.recordid = DATABASE.recordid) "
    18481903" INNER JOIN program ON (recordmatch.chanid = program.chanid AND "
    18491904"                        recordmatch.starttime = program.starttime AND "
    18501905"                        recordmatch.manualid = program.manualid) "
     
    18571912"    oldrecstatus.title = program.title ) "
    18581913" LEFT JOIN oldrecorded ON "
    18591914"  ( "
    1860 "    record.dupmethod > 1 AND "
     1915"    DATABASE.dupmethod > 1 AND "
    18611916"    oldrecorded.duplicate <> 0 AND "
    18621917"    program.title = oldrecorded.title "
    18631918"     AND "
     
    18721927"      ( "
    18731928"       (program.programid = '' OR oldrecorded.programid = '') "
    18741929"       AND "
    1875 "       (((record.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
     1930"       (((DATABASE.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
    18761931"          AND program.subtitle = oldrecorded.subtitle)) "
    18771932"       AND "
    1878 "       (((record.dupmethod & 0x04) = 0) OR (program.description <> '' "
     1933"       (((DATABASE.dupmethod & 0x04) = 0) OR (program.description <> '' "
    18791934"          AND program.description = oldrecorded.description)) "
    18801935"      ) "
    18811936"     ) "
    18821937"  ) "
    18831938" LEFT JOIN recorded ON "
    18841939"  ( "
    1885 "    record.dupmethod > 1 AND "
     1940"    DATABASE.dupmethod > 1 AND "
    18861941"    program.title = recorded.title "
    18871942"     AND "
    18881943"     ( "
     
    18961951"      ( "
    18971952"       (program.programid = '' OR recorded.programid = '') "
    18981953"       AND "
    1899 "       (((record.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
     1954"       (((DATABASE.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
    19001955"          AND program.subtitle = recorded.subtitle)) "
    19011956"       AND "
    1902 "       (((record.dupmethod & 0x04) = 0) OR (program.description <> '' "
     1957"       (((DATABASE.dupmethod & 0x04) = 0) OR (program.description <> '' "
    19031958"          AND program.description = recorded.description)) "
    19041959"      ) "
    19051960"     ) "
     
    19071962" LEFT JOIN oldfind ON "
    19081963"  (oldfind.recordid = recordmatch.recordid AND "
    19091964"   oldfind.findid = ") + progfindid + QString(") "
    1910 " ORDER BY record.recordid DESC "
     1965" ORDER BY DATABASE.recordid DESC "
    19111966);
    19121967
     1968    while (1)
     1969    {
     1970        int i = query.find("DATABASE");
     1971        if (i == -1) break;
     1972        query = query.replace(i, strlen("DATABASE"), recordTable);
     1973    }
     1974
    19131975    VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query..."));
    19141976
    19151977    gettimeofday(&dbstart, NULL);
    1916     MSqlQuery result(MSqlQuery::SchedCon());
     1978    MSqlQuery result(dbConn);
    19171979    result.prepare(query);
    19181980    result.exec();
    19191981    gettimeofday(&dbend, NULL);
     
    19762038        p->year = result.value(30).toString();
    19772039        p->stars =  result.value(31).toDouble();
    19782040
     2041
    19792042        if (result.value(32).isNull())
    19802043        {
    19812044            p->originalAirDate = p->startts.date();
     
    20812144    RecList tmpList;
    20822145
    20832146    QString query = QString(
    2084 "SELECT record.recordid, record.type, record.chanid, "
    2085 "record.starttime, record.startdate, record.endtime, record.enddate, "
    2086 "record.startoffset, record.endoffset, "
    2087 "record.title, record.subtitle, record.description, "
     2147"SELECT DATABASE.recordid, DATABASE.type, DATABASE.chanid, "
     2148"DATABASE.starttime, DATABASE.startdate, DATABASE.endtime, DATABASE.enddate, "
     2149"DATABASE.startoffset, DATABASE.endoffset, "
     2150"DATABASE.title, DATABASE.subtitle, DATABASE.description, "
    20882151"channel.channum, channel.callsign, channel.name "
    2089 "FROM record "
    2090 " INNER JOIN channel ON (channel.chanid = record.chanid) "
    2091 " LEFT JOIN recordmatch on record.recordid = recordmatch.recordid "
     2152"FROM DATABASE "
     2153" INNER JOIN channel ON (channel.chanid = DATABASE.chanid) "
     2154" LEFT JOIN recordmatch on DATABASE.recordid = recordmatch.recordid "
    20922155"WHERE (type = %1 OR type = %2) AND recordmatch.chanid IS NULL")
    20932156        .arg(kSingleRecord)
    20942157        .arg(kOverrideRecord);
    20952158
     2159    while (1)
     2160    {
     2161        int i = query.find("DATABASE");
     2162        if (i == -1) break;
     2163        query = query.replace(i, strlen("DATABASE"), recordTable);
     2164    }
     2165
    20962166    VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query..."));
    20972167
    20982168    gettimeofday(&dbstart, NULL);
    2099     MSqlQuery result(MSqlQuery::SchedCon());
     2169    MSqlQuery result(dbConn);
    21002170    result.prepare(query);
    21012171    result.exec();
    21022172    gettimeofday(&dbend, NULL);
     
    21662236void Scheduler::findAllScheduledPrograms(list<ProgramInfo *> &proglist)
    21672237{
    21682238    QString temptime, tempdate;
    2169     QString query = QString("SELECT record.chanid, record.starttime, "
    2170 "record.startdate, record.endtime, record.enddate, record.title, "
    2171 "record.subtitle, record.description, record.recpriority, record.type, "
    2172 "channel.name, record.recordid, record.recgroup, record.dupin, "
    2173 "record.dupmethod, channel.commfree, channel.channum, record.station, "
    2174 "record.seriesid, record.programid, record.category, record.findid, "
    2175 "record.tsdefault "
    2176 "FROM record "
    2177 "LEFT JOIN channel ON channel.callsign = record.station "
     2239    QString query = QString("SELECT DATABASE.chanid, DATABASE.starttime, "
     2240"DATABASE.startdate, DATABASE.endtime, DATABASE.enddate, DATABASE.title, "
     2241"DATABASE.subtitle, DATABASE.description, DATABASE.recpriority, DATABASE.type, "
     2242"channel.name, DATABASE.recordid, DATABASE.recgroup, DATABASE.dupin, "
     2243"DATABASE.dupmethod, channel.commfree, channel.channum, DATABASE.station, "
     2244"DATABASE.seriesid, DATABASE.programid, DATABASE.category, DATABASE.findid, "
     2245"DATABASE.tsdefault "
     2246"FROM DATABASE "
     2247"LEFT JOIN channel ON channel.callsign = DATABASE.station "
    21782248"GROUP BY recordid "
    21792249"ORDER BY title ASC;");
    21802250
     2251    while (1)
     2252    {
     2253        int i = query.find("DATABASE");
     2254        if (i == -1) break;
     2255        query = query.replace(i, strlen("DATABASE"), recordTable);
     2256    }
     2257
    21812258    MSqlQuery result(MSqlQuery::InitCon());
    21822259    result.prepare(query);
    21832260    result.exec();
  • programs/mythbackend/mainserver.h

     
    8383    void HandleQueryFreeSpace(PlaybackSock *pbs, bool allBackends);
    8484    void HandleQueryCheckFile(QStringList &slist, PlaybackSock *pbs);
    8585    void HandleQueryGuideDataThrough(PlaybackSock *pbs);
    86     void HandleGetPendingRecordings(PlaybackSock *pbs);
     86    void HandleGetPendingRecordings(PlaybackSock *pbs, QString table = "", int recordid=-1);
    8787    void HandleGetScheduledRecordings(PlaybackSock *pbs);
    8888    void HandleGetConflictingRecordings(QStringList &slist, PlaybackSock *pbs);
    8989    void HandleGetNextFreeRecorder(QStringList &slist, PlaybackSock *pbs);
  • programs/mythbackend/scheduler.h

     
    2222class Scheduler : public QObject
    2323{
    2424  public:
    25     Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList);
     25    Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList, QString recordTbl = "record", MSqlQueryInfo *dbConnUse = NULL);
    2626    ~Scheduler();
    2727
    2828    void Reschedule(int recordid);
    29     void FillRecordListFromDB(void);
     29    /// @param[in] recordID changed from master (-1 == everything changed)
     30    void FillRecordListFromDB(int recordid = -1);
    3031    void FillRecordListFromMaster(void);
    3132
    3233    void FillEncoderFreeSpaceCache(void);
     
    6162    static void *SchedulerThread(void *param);
    6263
    6364  private:
     65    QString recordTable;
     66
    6467    void verifyCards(void);
    6568
    6669    bool FillRecordList(void);
     
    117120    MainServer *m_mainServer;
    118121
    119122    bool m_isShuttingDown;
     123    MSqlQueryInfo dbConn;
    120124
    121125};
    122126