Index: themes/G.A.N.T./ui.xml
===================================================================
--- themes/G.A.N.T./ui.xml (revision 7738)
+++ themes/G.A.N.T./ui.xml (working copy)
@@ -550,6 +550,202 @@
+
+
+
+ #ffffff
+ 16
+ 11
+ yes
+
+
+
+ #9999cc
+ 16
+ 11
+ yes
+
+
+
+ #F7862B
+ 16
+ 11
+ yes
+
+
+
+ #FF33FF
+ 16
+ 11
+ yes
+
+
+
+ #999999
+ 16
+ 11
+ yes
+
+
+
+ #ffff33
+ 16
+ 11
+ yes
+
+
+
+ #ffff33
+ 18
+ 12
+ yes
+
+
+
+ #ffffff
+ #000000
+ 27
+ 13
+ 3,3
+ yes
+
+
+
+ #ffffff
+ 17
+ 8
+ 1,1
+ yes
+
+
+
+ #ffffff
+ 16
+ 10
+ 1,1
+ yes
+
+
+
+ #999999
+ 16
+ 10
+ 1,1
+ yes
+
+
+
+ #ffff33
+ 16
+ 10
+ 1,1
+ yes
+
+
+
+
+
+ cr-background.png
+ 0,39
+
+
+
+
+ 400,10,380,30
+
+
+
+
+ 10,330,280,30
+
+
+
+
+
+ 0,39,800,290
+
+ 20,12,760,265
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+ 9
+
+
+
+
+
+ cr-lines.png
+ 0,0
+
+
+
+
+ 0,360,800,210
+
+
+
+
+
+
+
+ 300,330,480,30
+
+
+
+
+
+
+
+
+
+
Index: themes/blue/ui.xml
===================================================================
--- themes/blue/ui.xml (revision 7738)
+++ themes/blue/ui.xml (working copy)
@@ -365,6 +365,114 @@
+
+
+
+
+ 0, 0, 800, 600
+
+
+ cr-background.png
+ 0,0
+
+
+
+
+ 400,10,380,30
+
+
+
+
+ 25,345,280,30
+
+
+
+
+
+ 0,39,800,290
+
+ 20,12,760,265
+
+
+
+
+
+
+
+ 10
+
+
+
+
+
+ 9
+
+
+
+
+
+ cr-lines.png
+ 0,0
+
+
+
+
+ 25,365,775,210
+
+
+
+
+
+
+
+ 300,345,480,30
+
+
+
+
+
+
+
+
+
+
Index: libs/libmythtv/channeleditor.cpp
===================================================================
--- libs/libmythtv/channeleditor.cpp (revision 7738)
+++ libs/libmythtv/channeleditor.cpp (working copy)
@@ -190,6 +190,7 @@
};
void save() {};
+ void save(QString) {};
void load()
{
MSqlQuery query(MSqlQuery::InitCon());
Index: libs/libmythtv/scheduledrecording.h
===================================================================
--- libs/libmythtv/scheduledrecording.h (revision 7738)
+++ libs/libmythtv/scheduledrecording.h (working copy)
@@ -91,6 +91,7 @@
virtual void save();
+ virtual void save(QString);
virtual void loadByID(int id);
virtual void loadByProgram(const ProgramInfo* proginfo);
@@ -168,6 +169,7 @@
public slots:
void runProgList();
+ void testRecording();
protected slots:
void runShowDetails();
@@ -253,6 +255,7 @@
virtual int exec();
virtual void load();
virtual void save() { };
+ virtual void save(QString) { };
protected slots:
void open(int id);
Index: libs/libmythtv/recordingprofile.h
===================================================================
--- libs/libmythtv/recordingprofile.h (revision 7738)
+++ libs/libmythtv/recordingprofile.h (working copy)
@@ -113,6 +113,7 @@
virtual int exec();
virtual void load();
virtual void save() { };
+ virtual void save(QString) { };
protected slots:
void open(int id);
Index: libs/libmythtv/dvbtransporteditor.h
===================================================================
--- libs/libmythtv/dvbtransporteditor.h (revision 7738)
+++ libs/libmythtv/dvbtransporteditor.h (working copy)
@@ -87,6 +87,7 @@
DVBTransportList() {}
void save() { };
+ void save(QString) { };
void load()
{
fillSelections();
Index: libs/libmythtv/dvbtransporteditor.cpp
===================================================================
--- libs/libmythtv/dvbtransporteditor.cpp (revision 7738)
+++ libs/libmythtv/dvbtransporteditor.cpp (working copy)
@@ -69,6 +69,7 @@
};
void save() { };
+ void save(QString) { };
void load()
{
MSqlQuery query(MSqlQuery::InitCon());
Index: libs/libmythtv/videosource.h
===================================================================
--- libs/libmythtv/videosource.h (revision 7738)
+++ libs/libmythtv/videosource.h (working copy)
@@ -167,6 +167,7 @@
XMLTV_generic_config(const VideoSource& _parent, QString _grabber);
virtual void save();
+ virtual void save(QString) { save(); }
protected:
const VideoSource& parent;
@@ -178,6 +179,8 @@
public:
EITOnly_config(const VideoSource& _parent);
virtual void save();
+ virtual void save(QString) { save(); }
+
protected:
UseEIT *useeit;
};
@@ -205,6 +208,10 @@
if (name)
ConfigurationWizard::save();
};
+ virtual void save(QString destination) {
+ if (name)
+ ConfigurationWizard::save(destination);
+ };
private:
class ID: virtual public IntegerSetting,
@@ -281,6 +288,11 @@
settingValue = "";
SimpleDBStorage::save();
};
+ void save(QString destination) {
+ changed = true;
+ settingValue = "";
+ SimpleDBStorage::save(destination);
+ };
};
class DVBVbiDevice: public LineEditSetting, public CCSetting {
@@ -295,6 +307,11 @@
settingValue = "";
SimpleDBStorage::save();
};
+ void save(QString destination) {
+ changed = true;
+ settingValue = "";
+ SimpleDBStorage::save(destination);
+ };
};
class DVBDiseqcInputList
@@ -439,6 +456,7 @@
virtual int exec();
virtual void load();
virtual void save() { };
+ virtual void save(QString) { };
public slots:
void menu();
@@ -464,6 +482,7 @@
virtual int exec();
virtual void load();
virtual void save() { };
+ virtual void save(QString) { };
public slots:
void menu();
@@ -483,6 +502,7 @@
virtual int exec();
virtual void load();
virtual void save() { };
+ virtual void save(QString) { };
protected:
vector cardinputs;
@@ -530,6 +550,7 @@
void fillDiseqcSettingsInput(QString _pos, QString _port);
virtual void save();
+ virtual void save(QString destination) { save(); }
public slots:
void channelScanner();
Index: libs/libmythtv/libmythtv.pro
===================================================================
--- libs/libmythtv/libmythtv.pro (revision 7738)
+++ libs/libmythtv/libmythtv.pro (working copy)
@@ -93,6 +93,7 @@
HEADERS += sr_items.h scheduledrecording.h
HEADERS += signalmonitorvalue.h
HEADERS += mpeg/iso639.h
+HEADERS += viewschdiff.h
HEADERS += livetvchain.h
SOURCES += programinfo.cpp proglist.cpp
@@ -106,6 +107,7 @@
SOURCES += sr_items.cpp scheduledrecording.cpp
SOURCES += signalmonitorvalue.cpp
SOURCES += mpeg/iso639.cpp
+SOURCES += viewschdiff.cpp
SOURCES += livetvchain.cpp
using_frontend {
Index: libs/libmythtv/scanwizardhelpers.h
===================================================================
--- libs/libmythtv/scanwizardhelpers.h (revision 7738)
+++ libs/libmythtv/scanwizardhelpers.h (working copy)
@@ -120,6 +120,7 @@
{ setLabel(QObject::tr("Video Source")); }
virtual void load();
virtual void save() {}
+ virtual void save(QString) {}
private:
int sourceid;
};
@@ -135,6 +136,7 @@
{ setLabel(QObject::tr("Transport")); }
virtual void load() { refresh(); }
virtual void save() { ; }
+ virtual void save(QString) { ; }
void refresh();
public slots:
@@ -165,6 +167,7 @@
{ setLabel(QObject::tr("Capture Card")); }
virtual void load() { refresh(); }
virtual void save() { ; }
+ virtual void save(QString) { ; }
void refresh();
public slots:
Index: libs/libmythtv/programinfo.h
===================================================================
--- libs/libmythtv/programinfo.h (revision 7738)
+++ libs/libmythtv/programinfo.h (working copy)
@@ -320,7 +320,7 @@
return at(index);
};
- bool FromScheduler(bool &hasConflicts);
+ bool FromScheduler(bool &hasConflicts, QString altTable = "", int recordid=-1);
bool FromScheduler(void) {
bool dummyConflicts;
return FromScheduler(dummyConflicts);
Index: libs/libmythtv/programinfo.cpp
===================================================================
--- libs/libmythtv/programinfo.cpp (revision 7738)
+++ libs/libmythtv/programinfo.cpp (working copy)
@@ -3478,12 +3478,21 @@
* *
* ************************************************************************* */
-bool ProgramList::FromScheduler(bool &hasConflicts)
+bool ProgramList::FromScheduler(bool &hasConflicts, QString database, int recordid)
{
clear();
hasConflicts = false;
- QStringList slist = QString("QUERY_GETALLPENDING");
+ QString query;
+ if (database != "")
+ {
+ query = QString("QUERY_GETALLPENDING %1 %2").arg(database).arg(recordid);
+ } else {
+ query = QString("QUERY_GETALLPENDING");
+ }
+
+ QStringList slist = query;
+
if (!gContext->SendReceiveStringList(slist) || slist.size() < 2)
{
VERBOSE(VB_IMPORTANT,
Index: libs/libmythtv/sr_root.h
===================================================================
--- libs/libmythtv/sr_root.h (revision 7738)
+++ libs/libmythtv/sr_root.h (working copy)
@@ -27,6 +27,7 @@
DialogDoneListItem* cancelItem;
DialogDoneListItem* recordAsShownItem;
ManagedListItem* upcomingButton;
+ ManagedListItem* testButton;
ManagedListItem* detailsButton;
class SRSchedOptionsGroup* schedOptions;
Index: libs/libmythtv/scheduledrecording.cpp
===================================================================
--- libs/libmythtv/scheduledrecording.cpp (revision 7738)
+++ libs/libmythtv/scheduledrecording.cpp (working copy)
@@ -8,11 +8,13 @@
#include "sr_dialog.h"
#include "jobqueue.h"
#include "mythdbcon.h"
+#include "viewschdiff.h"
#include
#include
#include
#include
+#include
// NOTE: if this changes, you _MUST_ update the RecTypePriority function
// in recordingtypes.cpp.
@@ -435,6 +437,18 @@
signalChange(getRecordID());
}
+void ScheduledRecording::save(QString destination)
+{
+ if (type->isChanged() && getRecordingType() == kNotRecording)
+ {
+ remove();
+ }
+ else
+ {
+ ConfigurationGroup::save(destination);
+ }
+}
+
void ScheduledRecording::remove()
{
int rid = getRecordID();
@@ -813,4 +827,201 @@
recgroup->setChanged();
}
+void
+ScheduledRecording::testRecording()
+{
+
+ QString ttable = "record_tmp";
+
+ MSqlQueryInfo dbcon = MSqlQuery::SchedCon();
+ MSqlQuery query(dbcon);
+ QString thequery;
+
+ thequery ="SELECT GET_LOCK(:LOCK, 2);";
+ query.prepare(thequery);
+ query.bindValue(":LOCK", "DiffSchedule");
+ query.exec();
+ if (query.lastError().type() != QSqlError::None)
+ {
+ QString msg =
+ QString("DB Error (Obtaining lock in testRecording): \n"
+ "Query was: %1 \nError was: %2 \n")
+ .arg(thequery)
+ .arg(MythContext::DBErrorMessage(query.lastError()));
+ VERBOSE(VB_IMPORTANT, msg);
+ return;
+ }
+
+
+ thequery = QString("DROP TABLE IF EXISTS %1;").arg(ttable);
+ query.prepare(thequery);
+ query.exec();
+ if (query.lastError().type() != QSqlError::None)
+ {
+ QString msg =
+ QString("DB Error (deleting old table in testRecording): \n"
+ "Query was: %1 \nError was: %2 \n")
+ .arg(thequery)
+ .arg(MythContext::DBErrorMessage(query.lastError()));
+ VERBOSE(VB_IMPORTANT, msg);
+ return;
+ }
+
+ thequery = QString("CREATE TABLE %1 SELECT * FROM record;").arg(ttable);
+ query.prepare(thequery);
+ query.exec();
+ if (query.lastError().type() != QSqlError::None)
+ {
+ QString msg =
+ QString("DB Error (create new table): \n"
+ "Query was: %1 \nError was: %2 \n")
+ .arg(thequery)
+ .arg(MythContext::DBErrorMessage(query.lastError()));
+ VERBOSE(VB_IMPORTANT, msg);
+ return;
+ }
+
+ int id = getRecordID();
+ if (id == 0) {
+ thequery = QString("SELECT recordid FROM %1 ORDER BY recordid;").arg(ttable);
+ query.prepare(thequery);
+ query.exec();
+ if (query.lastError().type() != QSqlError::None)
+ {
+ QString msg =
+ QString("DB Error (query columns): \n"
+ "Query was: %1 \nError was: %2 \n")
+ .arg(thequery)
+ .arg(MythContext::DBErrorMessage(query.lastError()));
+ VERBOSE(VB_IMPORTANT, msg);
+ return;
+ }
+ id = 1;
+ while (query.next())
+ {
+ if (id != query.value(0).toString())
+ break;
+ id++;
+ }
+ }
+
+ thequery = QString("SHOW COLUMNS FROM %1;").arg(ttable);
+ query.prepare(thequery);
+ query.exec();
+ if (query.lastError().type() != QSqlError::None)
+ {
+ QString msg =
+ QString("DB Error (query columns): \n"
+ "Query was: %1 \nError was: %2 \n")
+ .arg(thequery)
+ .arg(MythContext::DBErrorMessage(query.lastError()));
+ VERBOSE(VB_IMPORTANT, msg);
+ return;
+ }
+
+ QStringList cols;
+ QStringList coltype;
+ while (query.next())
+ {
+ cols.push_back(query.value(0).toString());
+ coltype.push_back(query.value(1).toString());
+ }
+
+ QDict newvals;
+ newvals.setAutoDelete(true);
+
+
+ if (getRecordID() == 0)
+ thequery = QString("INSERT INTO %1 SET").arg(ttable);
+ else
+ thequery = QString("UPDATE %1 SET").arg(ttable);
+
+ char pref = ' ';
+
+ Setting *s;
+ for (unsigned int i = 0; i < cols.count(); i++)
+ {
+ if (cols[i] == "recordid") continue;
+ int c = coltype[i].find('(');
+ QString ctype = coltype[i];
+ if (c != -1) ctype.truncate(c);
+
+ s = byName(cols[i]);
+ if (!s) continue;
+ if (!s->isChanged()) continue;
+
+ QVariant *v = NULL;
+ if (ctype == "tinyint" || ctype == "int")
+ v = new QVariant(s->getValue().toInt());
+ else if (ctype == "varchar" || ctype == "text" ||
+ ctype == "date" || ctype == "time")
+ v = new QVariant(s->getValue().utf8());
+ else if (ctype == "float")
+ v = new QVariant(s->getValue().toFloat());
+ else
+ {
+ QString msg =
+ QString("Unknown column type %1 for field %2")
+ .arg(ctype).arg(cols[i]);
+ VERBOSE(VB_IMPORTANT, msg);
+ continue;
+ }
+
+ newvals.insert(cols[i], v);
+ thequery += pref;
+ thequery += ' ';
+ pref = ',';
+ thequery += QString("%1 = :%2").arg(cols[i]).arg(cols[i]);
+ }
+ if (getRecordID() != 0) thequery += QString(" WHERE recordid = :RECORDID");
+ else
+ {
+ thequery += pref;
+ thequery += ' ';
+ thequery += QString("recordid = :RECORDID");
+ }
+ query.prepare(thequery);
+ query.bindValue(":RECORDID", id);
+ for (unsigned int i = 0; i < cols.count(); i++)
+ {
+ QVariant *v = newvals[cols[i]];
+ if (v) query.bindValue(":" + cols[i], *v);
+ }
+ query.exec();
+ if (query.lastError().type() != QSqlError::None)
+ {
+ QString msg =
+ QString("DB Error (query columns): \n"
+ "Query was: %1 \nError was: %2 \n")
+ .arg(thequery)
+ .arg(MythContext::DBErrorMessage(query.lastError()));
+ VERBOSE(VB_IMPORTANT, msg);
+ return;
+ }
+
+
+ ViewScheduleDiff vsd(gContext->GetMainWindow(), "Recording Changes", ttable, id);
+
+// query2.prepare(QString("DROP TABLE %1;").arg(ttable));
+// query2.exec();
+//fprintf (stderr, "drop2\n");
+
+ thequery = "SELECT RELEASE_LOCK(:LOCK);";
+ query.prepare(thequery);
+ query.bindValue(":LOCK", "DiffSchedule");
+ query.exec();
+ if (query.lastError().type() != QSqlError::None)
+ {
+ QString msg =
+ QString("DB Error (free lock): \n"
+ "Query was: %1 \nError was: %2 \n")
+ .arg(thequery)
+ .arg(MythContext::DBErrorMessage(query.lastError()));
+ VERBOSE(VB_IMPORTANT, msg);
+ return;
+ }
+
+ vsd.exec();
+}
+
/* vim: set expandtab tabstop=4 shiftwidth=4: */
Index: libs/libmythtv/sr_root.cpp
===================================================================
--- libs/libmythtv/sr_root.cpp (revision 7738)
+++ libs/libmythtv/sr_root.cpp (working copy)
@@ -10,7 +10,6 @@
cancelItem->setState(MLS_BOLD);
addItem(cancelItem);
-
recType = new SRRecordingType(schedRec, _parentList, this);
addItem(recType->getItem(), -1);
connect(recType->getItem(), SIGNAL(changed(ManagedListItem*)), this, SLOT(itemChanged(ManagedListItem*)));
@@ -34,6 +33,11 @@
addItem(upcomingButton, -1);
connect(upcomingButton, SIGNAL(selected(ManagedListItem*)), _rec, SLOT(runProgList()));
+ testButton = new ManagedListItem(QObject::tr("Display recording changes"),
+ _parentList, this, "test");
+ addItem(testButton, -1);
+ connect(testButton, SIGNAL(selected(ManagedListItem*)), _rec, SLOT(testRecording()));
+
recordAsShownItem = new DialogDoneListItem(QString("[ %1 ]").arg(QObject::tr("Save these settings")),
MythDialog::Accepted, NULL, _parentList, this, "recordAsShown");
recordAsShownItem->setState(MLS_BOLD);
Index: libs/libmythtv/channelsettings.h
===================================================================
--- libs/libmythtv/channelsettings.h (revision 7738)
+++ libs/libmythtv/channelsettings.h (working copy)
@@ -26,7 +26,7 @@
};
void load() { };
- void save()
+ void save(QString table)
{
if (intValue() == 0) {
setValue(findHighest());
@@ -53,7 +53,11 @@
if (query.numRowsAffected() != 1)
cerr << "ChannelID:Failed to insert into: " << table << endl;
}
- };
+ }
+ void save()
+ {
+ save(table);
+ }
int findHighest(int floor = 1000)
{
Index: libs/libmythtv/profilegroup.h
===================================================================
--- libs/libmythtv/profilegroup.h (revision 7738)
+++ libs/libmythtv/profilegroup.h (working copy)
@@ -114,6 +114,7 @@
virtual int exec();
virtual void load();
virtual void save() {};
+ virtual void save(QString) {};
protected slots:
void open(int id);
Index: libs/libmythtv/channeleditor.h
===================================================================
--- libs/libmythtv/channeleditor.h (revision 7738)
+++ libs/libmythtv/channeleditor.h (working copy)
@@ -57,6 +57,7 @@
};
void save() {};
+ void save(QString) {};
void load() {
fillSelections();
};
Index: libs/libmyth/settings.cpp
===================================================================
--- libs/libmyth/settings.cpp (revision 7738)
+++ libs/libmyth/settings.cpp (working copy)
@@ -109,6 +109,13 @@
(*i)->save();
}
+void ConfigurationGroup::save(QString destination) {
+ for(childList::iterator i = children.begin() ;
+ i != children.end() ;
+ ++i )
+ (*i)->save(destination);
+}
+
QWidget* VerticalConfigurationGroup::configWidget(ConfigurationGroup *cg,
QWidget* parent,
const char* widgetName)
@@ -350,6 +357,13 @@
children[top]->save();
}
+void StackedConfigurationGroup::save(QString destination) {
+ if (saveAll)
+ ConfigurationGroup::save(destination);
+ else if (top < children.size())
+ children[top]->save(destination);
+}
+
void TriggeredConfigurationGroup::setTrigger(Configurable* _trigger) {
trigger = _trigger;
// Make sure the stack is after the trigger
@@ -981,7 +995,7 @@
}
}
-void SimpleDBStorage::save()
+void SimpleDBStorage::save(QString table)
{
if (!isChanged())
return;
@@ -1011,7 +1025,12 @@
}
}
-void AutoIncrementStorage::save() {
+void SimpleDBStorage::save()
+{
+ save(table);
+}
+
+void AutoIncrementStorage::save(QString table) {
if (intValue() == 0)
{
// Generate a new, unique ID
@@ -1038,6 +1057,11 @@
}
}
+void AutoIncrementStorage::save()
+{
+ save(table);
+}
+
void ListBoxSetting::setEnabled(bool b)
{
Configurable::setEnabled(b);
Index: libs/libmyth/langsettings.cpp
===================================================================
--- libs/libmyth/langsettings.cpp (revision 7738)
+++ libs/libmyth/langsettings.cpp (working copy)
@@ -25,6 +25,7 @@
gContext->SaveSetting("Language", getValue());
LanguageSettings::reload();
};
+ virtual void save(QString destination) { }
};
Index: libs/libmyth/settings.h
===================================================================
--- libs/libmyth/settings.h (revision 7738)
+++ libs/libmyth/settings.h (working copy)
@@ -30,6 +30,7 @@
virtual void load() = 0;
virtual void save() = 0;
+ virtual void save(QString destination) = 0;
// A name for looking up the setting
void setName(QString str) {
@@ -123,6 +124,7 @@
virtual void load();
virtual void save();
+ virtual void save(QString destination);
void setUseLabel(bool useit) { uselabel = useit; }
void setUseFrame(bool useit) { useframe = useit; }
@@ -183,6 +185,7 @@
void raise(Configurable* child);
virtual void save();
+ virtual void save(QString destination);
// save all children, or only the top?
void setSaveAll(bool b) { saveAll = b; };
@@ -597,6 +600,7 @@
virtual void load() = 0;
virtual void save() = 0;
+ virtual void save(QString destination) = 0;
protected:
QString getColumn(void) const { return column; };
@@ -615,6 +619,7 @@
virtual void load();
virtual void save();
+ virtual void save(QString destination);
protected:
@@ -628,6 +633,7 @@
public:
virtual void load() { }
virtual void save() { }
+ virtual void save(QString) { }
};
class AutoIncrementStorage: virtual public IntegerSetting, public DBStorage {
@@ -639,6 +645,7 @@
virtual void load() { };
virtual void save();
+ virtual void save(QString destination);
};
class ButtonSetting: virtual public Setting {
Index: programs/mythfrontend/main.cpp
===================================================================
--- programs/mythfrontend/main.cpp (revision 7738)
+++ programs/mythfrontend/main.cpp (working copy)
@@ -23,6 +23,7 @@
#include "previousbox.h"
#include "customrecord.h"
#include "viewscheduled.h"
+#include "viewschdiff.h"
#include "programrecpriority.h"
#include "channelrecpriority.h"
#include "globalsettings.h"
Index: programs/mythbackend/mainserver.cpp
===================================================================
--- programs/mythbackend/mainserver.cpp (revision 7738)
+++ programs/mythbackend/mainserver.cpp (working copy)
@@ -379,7 +379,12 @@
}
else if (command == "QUERY_GETALLPENDING")
{
- HandleGetPendingRecordings(pbs);
+ if (tokens.size() == 1)
+ HandleGetPendingRecordings(pbs);
+ else if (tokens.size() == 2)
+ HandleGetPendingRecordings(pbs, tokens[1]);
+ else
+ HandleGetPendingRecordings(pbs, tokens[1], tokens[2].toInt());
}
else if (command == "QUERY_GETALLSCHEDULED")
{
@@ -1937,14 +1942,24 @@
SendResponse(pbssock, strlist);
}
-void MainServer::HandleGetPendingRecordings(PlaybackSock *pbs)
+void MainServer::HandleGetPendingRecordings(PlaybackSock *pbs, QString table, int recordid)
{
QSocket *pbssock = pbs->getSocket();
QStringList strList;
- if (m_sched)
- m_sched->getAllPending(strList);
+ if (m_sched) {
+ if (table == "") m_sched->getAllPending(strList);
+ else {
+ // We need a different connection from the scheduler proper
+ // DDCon exists, although it's designed for other purposes.
+ MSqlQueryInfo dbconn = MSqlQuery::DDCon();
+ Scheduler *sched = new Scheduler(false, encoderList, table, &dbconn);
+ sched->FillRecordListFromDB(recordid);
+ sched->getAllPending(strList);
+ delete sched;
+ }
+ }
else
{
strList << QString::number(0);
Index: programs/mythbackend/scheduler.cpp
===================================================================
--- programs/mythbackend/scheduler.cpp (revision 7738)
+++ programs/mythbackend/scheduler.cpp (working copy)
@@ -31,11 +31,16 @@
#include "libmythtv/programinfo.h"
#include "libmythtv/scheduledrecording.h"
-Scheduler::Scheduler(bool runthread, QMap *tvList)
+Scheduler::Scheduler(bool runthread, QMap *tvList, QString recordTbl, MSqlQueryInfo *databaseConnection)
{
hasconflicts = false;
m_tvList = tvList;
+ if (databaseConnection) dbConn = *databaseConnection;
+ else dbConn = MSqlQuery::SchedCon();
+
+ recordTable = recordTbl;
+
m_mainServer = NULL;
m_isShuttingDown = false;
@@ -77,7 +82,7 @@
{
QString thequery;
- MSqlQuery query(MSqlQuery::SchedCon());
+ MSqlQuery query(dbConn);
query.prepare("SELECT NULL FROM capturecard;");
int numcards = -1;
@@ -103,7 +108,7 @@
while (query.next())
{
source = query.value(0).toInt();
- MSqlQuery subquery(MSqlQuery::SchedCon());
+ MSqlQuery subquery(dbConn);
subquery.prepare("SELECT cardinputid FROM cardinput WHERE "
"sourceid = :SOURCEID ORDER BY cardinputid;");
@@ -275,13 +280,28 @@
return hasconflicts;
}
-void Scheduler::FillRecordListFromDB(void)
+void Scheduler::FillRecordListFromDB(int recordid)
{
- MSqlQuery query(MSqlQuery::SchedCon());
- query.prepare("CREATE TEMPORARY TABLE recordmatch "
+ struct timeval fillstart, fillend;
+
+ gettimeofday(&fillstart, NULL);
+
+ MSqlQuery query(dbConn);
+ QString thequery;
+ if (recordid == -1)
+ {
+ thequery = "CREATE TEMPORARY TABLE recordmatch "
"(recordid int unsigned, chanid int unsigned, "
" starttime datetime, manualid int unsigned, "
- " INDEX (recordid));");
+ " INDEX (recordid));";
+ } else {
+ thequery = "CREATE TEMPORARY TABLE recordmatch "
+ "(recordid int unsigned, chanid int unsigned, "
+ " starttime datetime, manualid int unsigned, "
+ " INDEX (recordid)) SELECT * from recordmatch;";
+ }
+
+ query.prepare(thequery);
query.exec();
if (!query.isActive())
{
@@ -289,8 +309,27 @@
return;
}
- UpdateMatches(-1);
+ UpdateMatches(recordid);
FillRecordList();
+
+ MSqlQuery queryDrop(dbConn);
+ queryDrop.prepare("DROP TEMPORARY TABLE recordmatch;");
+ queryDrop.exec();
+ if (!queryDrop.isActive())
+ {
+ MythContext::DBError("FillRecordListFromDB", queryDrop);
+ return;
+ }
+
+ gettimeofday(&fillend, NULL);
+
+ double schedTime = (fillend.tv_sec - fillstart.tv_sec ) +
+ (fillend.tv_usec - fillstart.tv_usec) / 1000000.0;
+ QString msg;
+ msg.sprintf("Speculative scheduled %d items in "
+ "%.2f", (int)reclist.size(),
+ schedTime);
+ VERBOSE(VB_GENERAL, msg);
}
void Scheduler::FillRecordListFromMaster(void)
@@ -980,7 +1019,7 @@
// Mark anything that was recording as aborted. We'll fix it up.
// if possible, after the slaves connect and we start scheduling.
- MSqlQuery query(MSqlQuery::SchedCon());
+ MSqlQuery query(dbConn);
query.prepare("UPDATE oldrecorded SET recstatus = :RSABORTED "
" WHERE recstatus = :RSRECORDING");
query.bindValue(":RSABORTED", rsAborted);
@@ -1425,11 +1464,11 @@
void Scheduler::UpdateManuals(int recordid)
{
- MSqlQuery query(MSqlQuery::SchedCon());
+ MSqlQuery query(dbConn);
- query.prepare("SELECT type,title,station,startdate,starttime, "
+ query.prepare(QString("SELECT type,title,station,startdate,starttime, "
" enddate,endtime "
- "FROM record WHERE recordid = :RECORDID");
+ "FROM %1 WHERE recordid = :RECORDID").arg(recordTable));
query.bindValue(":RECORDID", recordid);
query.exec();
if (!query.isActive() || query.size() != 1)
@@ -1529,14 +1568,14 @@
QStringList &where,
MSqlBindings &bindings)
{
- MSqlQuery result(MSqlQuery::SchedCon());
+ MSqlQuery result(dbConn);
QString query;
QString qphrase;
query = QString("SELECT recordid,search,subtitle,description "
- "FROM record WHERE search <> %1 AND "
- "(recordid = %2 OR %3 = -1) ")
- .arg(kNoSearch).arg(recordid).arg(recordid);
+ "FROM %1 WHERE search <> %2 AND "
+ "(recordid = %3 OR %4 = -1) ")
+ .arg(recordTable).arg(kNoSearch).arg(recordid).arg(recordid);
result.prepare(query);
@@ -1574,19 +1613,19 @@
case kPowerSearch:
qphrase.remove(QRegExp("^\\s*AND\\s+", false));
from << result.value(2).toString();
- where << (QString("record.recordid = ") + bindrecid +
+ where << (QString("%1.recordid = ").arg(recordTable) + bindrecid +
QString(" AND program.manualid = 0 AND ( %2 )")
.arg(qphrase));
break;
case kTitleSearch:
from << "";
- where << (QString("record.recordid = ") + bindrecid + " AND "
+ where << (QString("%1.recordid = ").arg(recordTable) + bindrecid + " AND "
"program.manualid = 0 AND "
"program.title LIKE " + bindlikephrase);
break;
case kKeywordSearch:
from << "";
- where << (QString("record.recordid = ") + bindrecid +
+ where << (QString("%1.recordid = ").arg(recordTable) + bindrecid +
" AND program.manualid = 0"
" AND (program.title LIKE " + bindlikephrase +
" OR program.subtitle LIKE " + bindlikephrase +
@@ -1594,7 +1633,7 @@
break;
case kPeopleSearch:
from << ", people, credits";
- where << (QString("record.recordid = ") + bindrecid + " AND "
+ where << (QString("%1.recordid = ").arg(recordTable) + bindrecid + " AND "
"program.manualid = 0 AND "
"people.name LIKE " + bindphrase + " AND "
"credits.person = people.person AND "
@@ -1604,8 +1643,8 @@
case kManualSearch:
UpdateManuals(result.value(0).toInt());
from << "";
- where << (QString("record.recordid = ") + bindrecid + " AND "
- "program.manualid = record.recordid ");
+ where << ((QString("%1.recordid = ").arg(recordTable)) + bindrecid + " AND " +
+ QString("program.manualid = %1.recordid ").arg(recordTable));
break;
default:
VERBOSE(VB_IMPORTANT, QString("Unknown RecSearchType "
@@ -1621,10 +1660,19 @@
if (recordid == -1 || from.count() == 0)
{
from << "";
- where << "record.search = :NRST AND "
- "(record.recordid = :NRRECORDID OR :NRRECORDID = -1) AND "
+ QString s("DATABASE.search = :NRST AND "
+ "(DATABASE.recordid = :NRRECORDID OR :NRRECORDID = -1) AND "
"program.manualid = 0 AND "
- "program.title = record.title ";
+ "program.title = DATABASE.title ");
+
+ while (1)
+ {
+ int i = s.find("DATABASE");
+ if (i == -1) break;
+ s = s.replace(i, strlen("DATABASE"), recordTable);
+ }
+
+ where << s;
bindings[":NRST"] = kNoSearch;
bindings[":NRRECORDID"] = recordid;
}
@@ -1633,7 +1681,7 @@
void Scheduler::UpdateMatches(int recordid) {
struct timeval dbstart, dbend;
- MSqlQuery query(MSqlQuery::SchedCon());
+ MSqlQuery query(dbConn);
query.prepare("DELETE FROM recordmatch "
"WHERE recordid = :RECORDID OR :RECORDID = -1;");
@@ -1673,29 +1721,29 @@
{
QString query = QString(
"INSERT INTO recordmatch (recordid, chanid, starttime, manualid) "
-"SELECT record.recordid, program.chanid, program.starttime, "
+"SELECT DATABASE.recordid, program.chanid, program.starttime, "
" IF(search = %1, recordid, 0) "
-"FROM record, program ").arg(kManualSearch) + fromclauses[clause] + QString(
+"FROM DATABASE, program ").arg(kManualSearch) + fromclauses[clause] + QString(
" INNER JOIN channel ON (channel.chanid = program.chanid) "
"WHERE ") + whereclauses[clause] + QString(" AND channel.visible = 1 AND "
-"((record.type = %1 " // allrecord
-"OR record.type = %2 " // findonerecord
-"OR record.type = %3 " // finddailyrecord
-"OR record.type = %4) " // findweeklyrecord
+"((DATABASE.type = %1 " // allrecord
+"OR DATABASE.type = %2 " // findonerecord
+"OR DATABASE.type = %3 " // finddailyrecord
+"OR DATABASE.type = %4) " // findweeklyrecord
" OR "
-" ((record.station = channel.callsign) " // channel matches
+" ((DATABASE.station = channel.callsign) " // channel matches
" AND "
-" ((record.type = %5) " // channelrecord
+" ((DATABASE.type = %5) " // channelrecord
" OR"
-" ((TIME_TO_SEC(record.starttime) = TIME_TO_SEC(program.starttime)) " // timeslot matches
+" ((TIME_TO_SEC(DATABASE.starttime) = TIME_TO_SEC(program.starttime)) " // timeslot matches
" AND "
-" ((record.type = %6) " // timeslotrecord
+" ((DATABASE.type = %6) " // timeslotrecord
" OR"
-" ((DAYOFWEEK(record.startdate) = DAYOFWEEK(program.starttime) "
+" ((DAYOFWEEK(DATABASE.startdate) = DAYOFWEEK(program.starttime) "
" AND "
-" ((record.type = %7) " // weekslotrecord
+" ((DATABASE.type = %7) " // weekslotrecord
" OR"
-" ((TO_DAYS(record.startdate) = TO_DAYS(program.starttime)) " // date matches
+" ((TO_DAYS(DATABASE.startdate) = TO_DAYS(program.starttime)) " // date matches
" )"
" )"
" )"
@@ -1713,10 +1761,17 @@
.arg(kTimeslotRecord)
.arg(kWeekslotRecord);
+ while (1)
+ {
+ int i = query.find("DATABASE");
+ if (i == -1) break;
+ query = query.replace(i, strlen("DATABASE"), recordTable);
+ }
+
VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query %1...").arg(clause));
gettimeofday(&dbstart, NULL);
- MSqlQuery result(MSqlQuery::SchedCon());
+ MSqlQuery result(dbConn);
result.prepare(query);
result.bindValues(bindings);
result.exec();
@@ -1757,8 +1812,8 @@
QMap tooManyMap;
bool checkTooMany = false;
- MSqlQuery rlist(MSqlQuery::SchedCon());
- rlist.prepare("SELECT recordid,title,maxepisodes,maxnewest FROM record;");
+ MSqlQuery rlist(dbConn);
+ rlist.prepare(QString("SELECT recordid,title,maxepisodes,maxnewest FROM %1;").arg(recordTable));
rlist.exec();
@@ -1779,7 +1834,7 @@
if (maxEpisodes && !maxNewest)
{
- MSqlQuery epicnt(MSqlQuery::SchedCon());
+ MSqlQuery epicnt(dbConn);
epicnt.prepare("SELECT count(*) FROM recorded "
"WHERE title = :TITLE;");
@@ -1801,18 +1856,18 @@
}
QString progfindid = QString(
-"(CASE record.type "
+"(CASE DATABASE.type "
" WHEN %1 "
-" THEN record.findid "
+" THEN DATABASE.findid "
" WHEN %2 "
" THEN to_days(date_sub(program.starttime, interval "
-" time_format(record.findtime, '%H:%i') hour_minute)) "
+" time_format(DATABASE.findtime, '%H:%i') hour_minute)) "
" WHEN %3 "
" THEN floor((to_days(date_sub(program.starttime, interval "
-" time_format(record.findtime, '%H:%i') hour_minute)) - "
-" record.findday)/7) * 7 + record.findday "
+" time_format(DATABASE.findtime, '%H:%i') hour_minute)) - "
+" DATABASE.findday)/7) * 7 + DATABASE.findday "
" WHEN %4 "
-" THEN record.findid "
+" THEN DATABASE.findid "
" ELSE 0 "
" END) ")
.arg(kFindOneRecord)
@@ -1826,25 +1881,25 @@
"program.title, program.subtitle, program.description, "
"channel.channum, channel.callsign, channel.name, "
"oldrecorded.endtime IS NOT NULL AS oldrecduplicate, program.category, "
-"record.recpriority, "
-"record.dupin, "
+"DATABASE.recpriority, "
+"DATABASE.dupin, "
"recorded.endtime IS NOT NULL AND recorded.endtime < NOW() AS recduplicate, "
"oldfind.findid IS NOT NULL AS findduplicate, "
-"record.type, record.recordid, "
-"program.starttime - INTERVAL record.startoffset minute AS recstartts, "
-"program.endtime + INTERVAL record.endoffset minute AS recendts, "
-"program.previouslyshown, record.recgroup, record.dupmethod, "
+"DATABASE.type, DATABASE.recordid, "
+"program.starttime - INTERVAL DATABASE.startoffset minute AS recstartts, "
+"program.endtime + INTERVAL DATABASE.endoffset minute AS recendts, "
+"program.previouslyshown, DATABASE.recgroup, DATABASE.dupmethod, "
"channel.commfree, capturecard.cardid, "
"cardinput.cardinputid, UPPER(cardinput.shareable) = 'Y' AS shareable, "
"program.seriesid, program.programid, program.category_type, "
-"program.airdate, program.stars, program.originalairdate, record.inactive, "
-"record.parentid, ") + progfindid + ", record.tsdefault, "
+"program.airdate, program.stars, program.originalairdate, DATABASE.inactive, "
+"DATABASE.parentid, ") + progfindid + ", DATABASE.tsdefault, "
"oldrecstatus.recstatus, oldrecstatus.reactivate, "
"channel.recpriority + cardinput.preference "
+ QString(
"FROM recordmatch "
-" INNER JOIN record ON (recordmatch.recordid = record.recordid) "
+" INNER JOIN DATABASE ON (recordmatch.recordid = DATABASE.recordid) "
" INNER JOIN program ON (recordmatch.chanid = program.chanid AND "
" recordmatch.starttime = program.starttime AND "
" recordmatch.manualid = program.manualid) "
@@ -1857,7 +1912,7 @@
" oldrecstatus.title = program.title ) "
" LEFT JOIN oldrecorded ON "
" ( "
-" record.dupmethod > 1 AND "
+" DATABASE.dupmethod > 1 AND "
" oldrecorded.duplicate <> 0 AND "
" program.title = oldrecorded.title "
" AND "
@@ -1872,17 +1927,17 @@
" ( "
" (program.programid = '' OR oldrecorded.programid = '') "
" AND "
-" (((record.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
+" (((DATABASE.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
" AND program.subtitle = oldrecorded.subtitle)) "
" AND "
-" (((record.dupmethod & 0x04) = 0) OR (program.description <> '' "
+" (((DATABASE.dupmethod & 0x04) = 0) OR (program.description <> '' "
" AND program.description = oldrecorded.description)) "
" ) "
" ) "
" ) "
" LEFT JOIN recorded ON "
" ( "
-" record.dupmethod > 1 AND "
+" DATABASE.dupmethod > 1 AND "
" program.title = recorded.title "
" AND "
" ( "
@@ -1896,10 +1951,10 @@
" ( "
" (program.programid = '' OR recorded.programid = '') "
" AND "
-" (((record.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
+" (((DATABASE.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
" AND program.subtitle = recorded.subtitle)) "
" AND "
-" (((record.dupmethod & 0x04) = 0) OR (program.description <> '' "
+" (((DATABASE.dupmethod & 0x04) = 0) OR (program.description <> '' "
" AND program.description = recorded.description)) "
" ) "
" ) "
@@ -1907,13 +1962,20 @@
" LEFT JOIN oldfind ON "
" (oldfind.recordid = recordmatch.recordid AND "
" oldfind.findid = ") + progfindid + QString(") "
-" ORDER BY record.recordid DESC "
+" ORDER BY DATABASE.recordid DESC "
);
+ while (1)
+ {
+ int i = query.find("DATABASE");
+ if (i == -1) break;
+ query = query.replace(i, strlen("DATABASE"), recordTable);
+ }
+
VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query..."));
gettimeofday(&dbstart, NULL);
- MSqlQuery result(MSqlQuery::SchedCon());
+ MSqlQuery result(dbConn);
result.prepare(query);
result.exec();
gettimeofday(&dbend, NULL);
@@ -1976,6 +2038,7 @@
p->year = result.value(30).toString();
p->stars = result.value(31).toDouble();
+
if (result.value(32).isNull())
{
p->originalAirDate = p->startts.date();
@@ -2081,22 +2144,29 @@
RecList tmpList;
QString query = QString(
-"SELECT record.recordid, record.type, record.chanid, "
-"record.starttime, record.startdate, record.endtime, record.enddate, "
-"record.startoffset, record.endoffset, "
-"record.title, record.subtitle, record.description, "
+"SELECT DATABASE.recordid, DATABASE.type, DATABASE.chanid, "
+"DATABASE.starttime, DATABASE.startdate, DATABASE.endtime, DATABASE.enddate, "
+"DATABASE.startoffset, DATABASE.endoffset, "
+"DATABASE.title, DATABASE.subtitle, DATABASE.description, "
"channel.channum, channel.callsign, channel.name "
-"FROM record "
-" INNER JOIN channel ON (channel.chanid = record.chanid) "
-" LEFT JOIN recordmatch on record.recordid = recordmatch.recordid "
+"FROM DATABASE "
+" INNER JOIN channel ON (channel.chanid = DATABASE.chanid) "
+" LEFT JOIN recordmatch on DATABASE.recordid = recordmatch.recordid "
"WHERE (type = %1 OR type = %2) AND recordmatch.chanid IS NULL")
.arg(kSingleRecord)
.arg(kOverrideRecord);
+ while (1)
+ {
+ int i = query.find("DATABASE");
+ if (i == -1) break;
+ query = query.replace(i, strlen("DATABASE"), recordTable);
+ }
+
VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query..."));
gettimeofday(&dbstart, NULL);
- MSqlQuery result(MSqlQuery::SchedCon());
+ MSqlQuery result(dbConn);
result.prepare(query);
result.exec();
gettimeofday(&dbend, NULL);
@@ -2166,18 +2236,25 @@
void Scheduler::findAllScheduledPrograms(list &proglist)
{
QString temptime, tempdate;
- QString query = QString("SELECT record.chanid, record.starttime, "
-"record.startdate, record.endtime, record.enddate, record.title, "
-"record.subtitle, record.description, record.recpriority, record.type, "
-"channel.name, record.recordid, record.recgroup, record.dupin, "
-"record.dupmethod, channel.commfree, channel.channum, record.station, "
-"record.seriesid, record.programid, record.category, record.findid, "
-"record.tsdefault "
-"FROM record "
-"LEFT JOIN channel ON channel.callsign = record.station "
+ QString query = QString("SELECT DATABASE.chanid, DATABASE.starttime, "
+"DATABASE.startdate, DATABASE.endtime, DATABASE.enddate, DATABASE.title, "
+"DATABASE.subtitle, DATABASE.description, DATABASE.recpriority, DATABASE.type, "
+"channel.name, DATABASE.recordid, DATABASE.recgroup, DATABASE.dupin, "
+"DATABASE.dupmethod, channel.commfree, channel.channum, DATABASE.station, "
+"DATABASE.seriesid, DATABASE.programid, DATABASE.category, DATABASE.findid, "
+"DATABASE.tsdefault "
+"FROM DATABASE "
+"LEFT JOIN channel ON channel.callsign = DATABASE.station "
"GROUP BY recordid "
"ORDER BY title ASC;");
+ while (1)
+ {
+ int i = query.find("DATABASE");
+ if (i == -1) break;
+ query = query.replace(i, strlen("DATABASE"), recordTable);
+ }
+
MSqlQuery result(MSqlQuery::InitCon());
result.prepare(query);
result.exec();
Index: programs/mythbackend/mainserver.h
===================================================================
--- programs/mythbackend/mainserver.h (revision 7738)
+++ programs/mythbackend/mainserver.h (working copy)
@@ -83,7 +83,7 @@
void HandleQueryFreeSpace(PlaybackSock *pbs, bool allBackends);
void HandleQueryCheckFile(QStringList &slist, PlaybackSock *pbs);
void HandleQueryGuideDataThrough(PlaybackSock *pbs);
- void HandleGetPendingRecordings(PlaybackSock *pbs);
+ void HandleGetPendingRecordings(PlaybackSock *pbs, QString table = "", int recordid=-1);
void HandleGetScheduledRecordings(PlaybackSock *pbs);
void HandleGetConflictingRecordings(QStringList &slist, PlaybackSock *pbs);
void HandleGetNextFreeRecorder(QStringList &slist, PlaybackSock *pbs);
Index: programs/mythbackend/scheduler.h
===================================================================
--- programs/mythbackend/scheduler.h (revision 7738)
+++ programs/mythbackend/scheduler.h (working copy)
@@ -22,11 +22,12 @@
class Scheduler : public QObject
{
public:
- Scheduler(bool runthread, QMap *tvList);
+ Scheduler(bool runthread, QMap *tvList, QString recordTbl = "record", MSqlQueryInfo *dbConnUse = NULL);
~Scheduler();
void Reschedule(int recordid);
- void FillRecordListFromDB(void);
+ /// @param[in] recordID changed from master (-1 == everything changed)
+ void FillRecordListFromDB(int recordid = -1);
void FillRecordListFromMaster(void);
void FillEncoderFreeSpaceCache(void);
@@ -61,6 +62,8 @@
static void *SchedulerThread(void *param);
private:
+ QString recordTable;
+
void verifyCards(void);
bool FillRecordList(void);
@@ -117,6 +120,7 @@
MainServer *m_mainServer;
bool m_isShuttingDown;
+ MSqlQueryInfo dbConn;
};