Ticket #602: viewscheddiff6.patch
File viewscheddiff6.patch, 54.7 KB (added by , 20 years ago) |
---|
-
themes/G.A.N.T./ui.xml
550 550 551 551 </window> 552 552 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 553 749 <window name="recprioritychannels"> 554 750 555 751 <font name="active_font" face="Arial"> -
themes/blue/ui.xml
365 365 366 366 </window> 367 367 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 368 476 <window name="recprioritychannels"> 369 477 370 478 <container name="background"> -
libs/libmythtv/channeleditor.cpp
190 190 }; 191 191 192 192 void save() {}; 193 void save(QString) {}; 193 194 void load() 194 195 { 195 196 MSqlQuery query(MSqlQuery::InitCon()); -
libs/libmythtv/scheduledrecording.h
91 91 92 92 93 93 virtual void save(); 94 virtual void save(QString); 94 95 95 96 virtual void loadByID(int id); 96 97 virtual void loadByProgram(const ProgramInfo* proginfo); … … 168 169 169 170 public slots: 170 171 void runProgList(); 172 void testRecording(); 171 173 172 174 protected slots: 173 175 void runShowDetails(); … … 253 255 virtual int exec(); 254 256 virtual void load(); 255 257 virtual void save() { }; 258 virtual void save(QString) { }; 256 259 257 260 protected slots: 258 261 void open(int id); -
libs/libmythtv/recordingprofile.h
113 113 virtual int exec(); 114 114 virtual void load(); 115 115 virtual void save() { }; 116 virtual void save(QString) { }; 116 117 117 118 protected slots: 118 119 void open(int id); -
libs/libmythtv/dvbtransporteditor.h
87 87 DVBTransportList() {} 88 88 89 89 void save() { }; 90 void save(QString) { }; 90 91 void load() 91 92 { 92 93 fillSelections(); -
libs/libmythtv/dvbtransporteditor.cpp
69 69 }; 70 70 71 71 void save() { }; 72 void save(QString) { }; 72 73 void load() 73 74 { 74 75 MSqlQuery query(MSqlQuery::InitCon()); -
libs/libmythtv/videosource.h
167 167 XMLTV_generic_config(const VideoSource& _parent, QString _grabber); 168 168 169 169 virtual void save(); 170 virtual void save(QString) { save(); } 170 171 171 172 protected: 172 173 const VideoSource& parent; … … 178 179 public: 179 180 EITOnly_config(const VideoSource& _parent); 180 181 virtual void save(); 182 virtual void save(QString) { save(); } 183 181 184 protected: 182 185 UseEIT *useeit; 183 186 }; … … 205 208 if (name) 206 209 ConfigurationWizard::save(); 207 210 }; 211 virtual void save(QString destination) { 212 if (name) 213 ConfigurationWizard::save(destination); 214 }; 208 215 209 216 private: 210 217 class ID: virtual public IntegerSetting, … … 281 288 settingValue = ""; 282 289 SimpleDBStorage::save(); 283 290 }; 291 void save(QString destination) { 292 changed = true; 293 settingValue = ""; 294 SimpleDBStorage::save(destination); 295 }; 284 296 }; 285 297 286 298 class DVBVbiDevice: public LineEditSetting, public CCSetting { … … 295 307 settingValue = ""; 296 308 SimpleDBStorage::save(); 297 309 }; 310 void save(QString destination) { 311 changed = true; 312 settingValue = ""; 313 SimpleDBStorage::save(destination); 314 }; 298 315 }; 299 316 300 317 class DVBDiseqcInputList … … 439 456 virtual int exec(); 440 457 virtual void load(); 441 458 virtual void save() { }; 459 virtual void save(QString) { }; 442 460 443 461 public slots: 444 462 void menu(); … … 464 482 virtual int exec(); 465 483 virtual void load(); 466 484 virtual void save() { }; 485 virtual void save(QString) { }; 467 486 468 487 public slots: 469 488 void menu(); … … 483 502 virtual int exec(); 484 503 virtual void load(); 485 504 virtual void save() { }; 505 virtual void save(QString) { }; 486 506 487 507 protected: 488 508 vector<CardInput*> cardinputs; … … 530 550 void fillDiseqcSettingsInput(QString _pos, QString _port); 531 551 532 552 virtual void save(); 553 virtual void save(QString destination) { save(); } 533 554 534 555 public slots: 535 556 void channelScanner(); -
libs/libmythtv/libmythtv.pro
93 93 HEADERS += sr_items.h scheduledrecording.h 94 94 HEADERS += signalmonitorvalue.h 95 95 HEADERS += mpeg/iso639.h 96 HEADERS += viewschdiff.h 96 97 HEADERS += livetvchain.h 97 98 98 99 SOURCES += programinfo.cpp proglist.cpp … … 106 107 SOURCES += sr_items.cpp scheduledrecording.cpp 107 108 SOURCES += signalmonitorvalue.cpp 108 109 SOURCES += mpeg/iso639.cpp 110 SOURCES += viewschdiff.cpp 109 111 SOURCES += livetvchain.cpp 110 112 111 113 using_frontend { -
libs/libmythtv/scanwizardhelpers.h
120 120 { setLabel(QObject::tr("Video Source")); } 121 121 virtual void load(); 122 122 virtual void save() {} 123 virtual void save(QString) {} 123 124 private: 124 125 int sourceid; 125 126 }; … … 135 136 { setLabel(QObject::tr("Transport")); } 136 137 virtual void load() { refresh(); } 137 138 virtual void save() { ; } 139 virtual void save(QString) { ; } 138 140 139 141 void refresh(); 140 142 public slots: … … 165 167 { setLabel(QObject::tr("Capture Card")); } 166 168 virtual void load() { refresh(); } 167 169 virtual void save() { ; } 170 virtual void save(QString) { ; } 168 171 void refresh(); 169 172 170 173 public slots: -
libs/libmythtv/programinfo.h
320 320 return at(index); 321 321 }; 322 322 323 bool FromScheduler(bool &hasConflicts );323 bool FromScheduler(bool &hasConflicts, QString altTable = "", int recordid=-1); 324 324 bool FromScheduler(void) { 325 325 bool dummyConflicts; 326 326 return FromScheduler(dummyConflicts); -
libs/libmythtv/programinfo.cpp
3478 3478 * * 3479 3479 * ************************************************************************* */ 3480 3480 3481 bool ProgramList::FromScheduler(bool &hasConflicts )3481 bool ProgramList::FromScheduler(bool &hasConflicts, QString database, int recordid) 3482 3482 { 3483 3483 clear(); 3484 3484 hasConflicts = false; 3485 3485 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 3487 3496 if (!gContext->SendReceiveStringList(slist) || slist.size() < 2) 3488 3497 { 3489 3498 VERBOSE(VB_IMPORTANT, -
libs/libmythtv/sr_root.h
27 27 DialogDoneListItem* cancelItem; 28 28 DialogDoneListItem* recordAsShownItem; 29 29 ManagedListItem* upcomingButton; 30 ManagedListItem* testButton; 30 31 ManagedListItem* detailsButton; 31 32 32 33 class SRSchedOptionsGroup* schedOptions; -
libs/libmythtv/scheduledrecording.cpp
8 8 #include "sr_dialog.h" 9 9 #include "jobqueue.h" 10 10 #include "mythdbcon.h" 11 #include "viewschdiff.h" 11 12 12 13 #include <qlayout.h> 13 14 #include <qlabel.h> 14 15 #include <qapplication.h> 15 16 #include <qregexp.h> 17 #include <qsqlquery.h> 16 18 17 19 // NOTE: if this changes, you _MUST_ update the RecTypePriority function 18 20 // in recordingtypes.cpp. … … 435 437 signalChange(getRecordID()); 436 438 } 437 439 440 void 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 438 452 void ScheduledRecording::remove() 439 453 { 440 454 int rid = getRecordID(); … … 813 827 recgroup->setChanged(); 814 828 } 815 829 830 void 831 ScheduledRecording::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 int id = getRecordID(); 885 if (id == 0) { 886 thequery = QString("SELECT recordid FROM %1 ORDER BY recordid;").arg(ttable); 887 query.prepare(thequery); 888 query.exec(); 889 if (query.lastError().type() != QSqlError::None) 890 { 891 QString msg = 892 QString("DB Error (query columns): \n" 893 "Query was: %1 \nError was: %2 \n") 894 .arg(thequery) 895 .arg(MythContext::DBErrorMessage(query.lastError())); 896 VERBOSE(VB_IMPORTANT, msg); 897 return; 898 } 899 id = 1; 900 while (query.next()) 901 { 902 if (id != query.value(0).toInt()) break; 903 id++; 904 } 905 } 906 907 thequery = QString("SHOW COLUMNS FROM %1;").arg(ttable); 908 query.prepare(thequery); 909 query.exec(); 910 if (query.lastError().type() != QSqlError::None) 911 { 912 QString msg = 913 QString("DB Error (query columns): \n" 914 "Query was: %1 \nError was: %2 \n") 915 .arg(thequery) 916 .arg(MythContext::DBErrorMessage(query.lastError())); 917 VERBOSE(VB_IMPORTANT, msg); 918 return; 919 } 920 921 QStringList cols; 922 QStringList coltype; 923 while (query.next()) 924 { 925 cols.push_back(query.value(0).toString()); 926 coltype.push_back(query.value(1).toString()); 927 } 928 929 QDict<QVariant> newvals; 930 newvals.setAutoDelete(true); 931 932 933 if (getRecordID() == 0) 934 thequery = QString("INSERT INTO %1 SET").arg(ttable); 935 else 936 thequery = QString("UPDATE %1 SET").arg(ttable); 937 938 char pref = ' '; 939 940 Setting *s; 941 for (unsigned int i = 0; i < cols.count(); i++) 942 { 943 if (cols[i] == "recordid") continue; 944 int c = coltype[i].find('('); 945 QString ctype = coltype[i]; 946 if (c != -1) ctype.truncate(c); 947 948 s = byName(cols[i]); 949 if (!s) continue; 950 if (!s->isChanged()) continue; 951 952 QVariant *v = NULL; 953 if (ctype == "tinyint" || ctype == "int") 954 v = new QVariant(s->getValue().toInt()); 955 else if (ctype == "varchar" || ctype == "text" || 956 ctype == "date" || ctype == "time") 957 v = new QVariant(s->getValue().utf8()); 958 else if (ctype == "float") 959 v = new QVariant(s->getValue().toFloat()); 960 else 961 { 962 QString msg = 963 QString("Unknown column type %1 for field %2") 964 .arg(ctype).arg(cols[i]); 965 VERBOSE(VB_IMPORTANT, msg); 966 continue; 967 } 968 969 newvals.insert(cols[i], v); 970 thequery += pref; 971 thequery += ' '; 972 pref = ','; 973 thequery += QString("%1 = :%2").arg(cols[i]).arg(cols[i]); 974 } 975 if (getRecordID() != 0) thequery += QString(" WHERE recordid = :RECORDID"); 976 else 977 { 978 thequery += pref; 979 thequery += ' '; 980 thequery += QString("recordid = :RECORDID"); 981 } 982 query.prepare(thequery); 983 query.bindValue(":RECORDID", id); 984 for (unsigned int i = 0; i < cols.count(); i++) 985 { 986 QVariant *v = newvals[cols[i]]; 987 if (v) query.bindValue(":" + cols[i], *v); 988 } 989 query.exec(); 990 if (query.lastError().type() != QSqlError::None) 991 { 992 QString msg = 993 QString("DB Error (query columns): \n" 994 "Query was: %1 \nError was: %2 \n") 995 .arg(thequery) 996 .arg(MythContext::DBErrorMessage(query.lastError())); 997 VERBOSE(VB_IMPORTANT, msg); 998 return; 999 } 1000 1001 1002 ViewScheduleDiff vsd(gContext->GetMainWindow(), "Recording Changes", ttable, id); 1003 1004 // query2.prepare(QString("DROP TABLE %1;").arg(ttable)); 1005 // query2.exec(); 1006 //fprintf (stderr, "drop2\n"); 1007 1008 thequery = "SELECT RELEASE_LOCK(:LOCK);"; 1009 query.prepare(thequery); 1010 query.bindValue(":LOCK", "DiffSchedule"); 1011 query.exec(); 1012 if (query.lastError().type() != QSqlError::None) 1013 { 1014 QString msg = 1015 QString("DB Error (free lock): \n" 1016 "Query was: %1 \nError was: %2 \n") 1017 .arg(thequery) 1018 .arg(MythContext::DBErrorMessage(query.lastError())); 1019 VERBOSE(VB_IMPORTANT, msg); 1020 return; 1021 } 1022 1023 vsd.exec(); 1024 } 1025 816 1026 /* vim: set expandtab tabstop=4 shiftwidth=4: */ -
libs/libmythtv/sr_root.cpp
10 10 cancelItem->setState(MLS_BOLD); 11 11 addItem(cancelItem); 12 12 13 14 13 recType = new SRRecordingType(schedRec, _parentList, this); 15 14 addItem(recType->getItem(), -1); 16 15 connect(recType->getItem(), SIGNAL(changed(ManagedListItem*)), this, SLOT(itemChanged(ManagedListItem*))); … … 34 33 addItem(upcomingButton, -1); 35 34 connect(upcomingButton, SIGNAL(selected(ManagedListItem*)), _rec, SLOT(runProgList())); 36 35 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 37 41 recordAsShownItem = new DialogDoneListItem(QString("[ %1 ]").arg(QObject::tr("Save these settings")), 38 42 MythDialog::Accepted, NULL, _parentList, this, "recordAsShown"); 39 43 recordAsShownItem->setState(MLS_BOLD); -
libs/libmythtv/channelsettings.h
26 26 }; 27 27 28 28 void load() { }; 29 void save( )29 void save(QString table) 30 30 { 31 31 if (intValue() == 0) { 32 32 setValue(findHighest()); … … 53 53 if (query.numRowsAffected() != 1) 54 54 cerr << "ChannelID:Failed to insert into: " << table << endl; 55 55 } 56 }; 56 } 57 void save() 58 { 59 save(table); 60 } 57 61 58 62 int findHighest(int floor = 1000) 59 63 { -
libs/libmythtv/profilegroup.h
114 114 virtual int exec(); 115 115 virtual void load(); 116 116 virtual void save() {}; 117 virtual void save(QString) {}; 117 118 118 119 protected slots: 119 120 void open(int id); -
libs/libmythtv/channeleditor.h
57 57 }; 58 58 59 59 void save() {}; 60 void save(QString) {}; 60 61 void load() { 61 62 fillSelections(); 62 63 }; -
libs/libmyth/settings.cpp
109 109 (*i)->save(); 110 110 } 111 111 112 void ConfigurationGroup::save(QString destination) { 113 for(childList::iterator i = children.begin() ; 114 i != children.end() ; 115 ++i ) 116 (*i)->save(destination); 117 } 118 112 119 QWidget* VerticalConfigurationGroup::configWidget(ConfigurationGroup *cg, 113 120 QWidget* parent, 114 121 const char* widgetName) … … 350 357 children[top]->save(); 351 358 } 352 359 360 void StackedConfigurationGroup::save(QString destination) { 361 if (saveAll) 362 ConfigurationGroup::save(destination); 363 else if (top < children.size()) 364 children[top]->save(destination); 365 } 366 353 367 void TriggeredConfigurationGroup::setTrigger(Configurable* _trigger) { 354 368 trigger = _trigger; 355 369 // Make sure the stack is after the trigger … … 981 995 } 982 996 } 983 997 984 void SimpleDBStorage::save( )998 void SimpleDBStorage::save(QString table) 985 999 { 986 1000 if (!isChanged()) 987 1001 return; … … 1011 1025 } 1012 1026 } 1013 1027 1014 void AutoIncrementStorage::save() { 1028 void SimpleDBStorage::save() 1029 { 1030 save(table); 1031 } 1032 1033 void AutoIncrementStorage::save(QString table) { 1015 1034 if (intValue() == 0) 1016 1035 { 1017 1036 // Generate a new, unique ID … … 1038 1057 } 1039 1058 } 1040 1059 1060 void AutoIncrementStorage::save() 1061 { 1062 save(table); 1063 } 1064 1041 1065 void ListBoxSetting::setEnabled(bool b) 1042 1066 { 1043 1067 Configurable::setEnabled(b); -
libs/libmyth/langsettings.cpp
25 25 gContext->SaveSetting("Language", getValue()); 26 26 LanguageSettings::reload(); 27 27 }; 28 virtual void save(QString destination) { } 28 29 }; 29 30 30 31 -
libs/libmyth/settings.h
30 30 31 31 virtual void load() = 0; 32 32 virtual void save() = 0; 33 virtual void save(QString destination) = 0; 33 34 34 35 // A name for looking up the setting 35 36 void setName(QString str) { … … 123 124 virtual void load(); 124 125 125 126 virtual void save(); 127 virtual void save(QString destination); 126 128 127 129 void setUseLabel(bool useit) { uselabel = useit; } 128 130 void setUseFrame(bool useit) { useframe = useit; } … … 183 185 184 186 void raise(Configurable* child); 185 187 virtual void save(); 188 virtual void save(QString destination); 186 189 187 190 // save all children, or only the top? 188 191 void setSaveAll(bool b) { saveAll = b; }; … … 597 600 598 601 virtual void load() = 0; 599 602 virtual void save() = 0; 603 virtual void save(QString destination) = 0; 600 604 601 605 protected: 602 606 QString getColumn(void) const { return column; }; … … 615 619 616 620 virtual void load(); 617 621 virtual void save(); 622 virtual void save(QString destination); 618 623 619 624 protected: 620 625 … … 628 633 public: 629 634 virtual void load() { } 630 635 virtual void save() { } 636 virtual void save(QString) { } 631 637 }; 632 638 633 639 class AutoIncrementStorage: virtual public IntegerSetting, public DBStorage { … … 639 645 640 646 virtual void load() { }; 641 647 virtual void save(); 648 virtual void save(QString destination); 642 649 }; 643 650 644 651 class ButtonSetting: virtual public Setting { -
programs/mythfrontend/main.cpp
23 23 #include "previousbox.h" 24 24 #include "customrecord.h" 25 25 #include "viewscheduled.h" 26 #include "viewschdiff.h" 26 27 #include "programrecpriority.h" 27 28 #include "channelrecpriority.h" 28 29 #include "globalsettings.h" -
programs/mythbackend/mainserver.cpp
379 379 } 380 380 else if (command == "QUERY_GETALLPENDING") 381 381 { 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()); 383 388 } 384 389 else if (command == "QUERY_GETALLSCHEDULED") 385 390 { … … 1937 1942 SendResponse(pbssock, strlist); 1938 1943 } 1939 1944 1940 void MainServer::HandleGetPendingRecordings(PlaybackSock *pbs )1945 void MainServer::HandleGetPendingRecordings(PlaybackSock *pbs, QString table, int recordid) 1941 1946 { 1942 1947 QSocket *pbssock = pbs->getSocket(); 1943 1948 1944 1949 QStringList strList; 1945 1950 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 if (recordid != -1) 1963 { 1964 ScheduledRecording s; 1965 s.loadByID(recordid); 1966 if (s.getSearchType() == kManualSearch) 1967 HandleRescheduleRecordings(recordid, NULL); 1968 } 1969 1970 } 1971 } 1948 1972 else 1949 1973 { 1950 1974 strList << QString::number(0); -
programs/mythbackend/scheduler.cpp
31 31 #include "libmythtv/programinfo.h" 32 32 #include "libmythtv/scheduledrecording.h" 33 33 34 Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList )34 Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList, QString recordTbl, MSqlQueryInfo *databaseConnection) 35 35 { 36 36 hasconflicts = false; 37 37 m_tvList = tvList; 38 38 39 if (databaseConnection) dbConn = *databaseConnection; 40 else dbConn = MSqlQuery::SchedCon(); 41 42 recordTable = recordTbl; 43 39 44 m_mainServer = NULL; 40 45 41 46 m_isShuttingDown = false; … … 77 82 { 78 83 QString thequery; 79 84 80 MSqlQuery query( MSqlQuery::SchedCon());85 MSqlQuery query(dbConn); 81 86 query.prepare("SELECT NULL FROM capturecard;"); 82 87 83 88 int numcards = -1; … … 103 108 while (query.next()) 104 109 { 105 110 source = query.value(0).toInt(); 106 MSqlQuery subquery( MSqlQuery::SchedCon());111 MSqlQuery subquery(dbConn); 107 112 108 113 subquery.prepare("SELECT cardinputid FROM cardinput WHERE " 109 114 "sourceid = :SOURCEID ORDER BY cardinputid;"); … … 275 280 return hasconflicts; 276 281 } 277 282 278 void Scheduler::FillRecordListFromDB( void)283 void Scheduler::FillRecordListFromDB(int recordid) 279 284 { 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 " 282 294 "(recordid int unsigned, chanid int unsigned, " 283 295 " 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); 305 recordmatchLock.lock(); 285 306 query.exec(); 307 recordmatchLock.unlock(); 286 308 if (!query.isActive()) 287 309 { 288 310 MythContext::DBError("FillRecordListFromDB", query); 289 311 return; 290 312 } 291 313 292 UpdateMatches( -1);314 UpdateMatches(recordid); 293 315 FillRecordList(); 316 317 MSqlQuery queryDrop(dbConn); 318 queryDrop.prepare("DROP TEMPORARY TABLE recordmatch;"); 319 queryDrop.exec(); 320 if (!queryDrop.isActive()) 321 { 322 MythContext::DBError("FillRecordListFromDB", queryDrop); 323 return; 324 } 325 326 gettimeofday(&fillend, NULL); 327 328 double schedTime = (fillend.tv_sec - fillstart.tv_sec ) + 329 (fillend.tv_usec - fillstart.tv_usec) / 1000000.0; 330 QString msg; 331 msg.sprintf("Speculative scheduled %d items in " 332 "%.2f", (int)reclist.size(), 333 schedTime); 334 VERBOSE(VB_GENERAL, msg); 294 335 } 295 336 296 337 void Scheduler::FillRecordListFromMaster(void) … … 980 1021 981 1022 // Mark anything that was recording as aborted. We'll fix it up. 982 1023 // if possible, after the slaves connect and we start scheduling. 983 MSqlQuery query( MSqlQuery::SchedCon());1024 MSqlQuery query(dbConn); 984 1025 query.prepare("UPDATE oldrecorded SET recstatus = :RSABORTED " 985 1026 " WHERE recstatus = :RSRECORDING"); 986 1027 query.bindValue(":RSABORTED", rsAborted); … … 1023 1064 { 1024 1065 if (recordid == -1) 1025 1066 reschedQueue.clear(); 1067 recordmatchLock.lock(); 1026 1068 UpdateMatches(recordid); 1069 recordmatchLock.unlock(); 1027 1070 } 1028 1071 } 1029 1072 gettimeofday(&fillend, NULL); … … 1425 1468 1426 1469 void Scheduler::UpdateManuals(int recordid) 1427 1470 { 1428 MSqlQuery query( MSqlQuery::SchedCon());1471 MSqlQuery query(dbConn); 1429 1472 1430 query.prepare( "SELECT type,title,station,startdate,starttime, "1473 query.prepare(QString("SELECT type,title,station,startdate,starttime, " 1431 1474 " enddate,endtime " 1432 "FROM record WHERE recordid = :RECORDID");1475 "FROM %1 WHERE recordid = :RECORDID").arg(recordTable)); 1433 1476 query.bindValue(":RECORDID", recordid); 1434 1477 query.exec(); 1435 1478 if (!query.isActive() || query.size() != 1) … … 1529 1572 QStringList &where, 1530 1573 MSqlBindings &bindings) 1531 1574 { 1532 MSqlQuery result( MSqlQuery::SchedCon());1575 MSqlQuery result(dbConn); 1533 1576 QString query; 1534 1577 QString qphrase; 1535 1578 1536 1579 query = QString("SELECT recordid,search,subtitle,description " 1537 "FROM record WHERE search <> %1AND "1538 "(recordid = % 2 OR %3= -1) ")1539 .arg( kNoSearch).arg(recordid).arg(recordid);1580 "FROM %1 WHERE search <> %2 AND " 1581 "(recordid = %3 OR %4 = -1) ") 1582 .arg(recordTable).arg(kNoSearch).arg(recordid).arg(recordid); 1540 1583 1541 1584 result.prepare(query); 1542 1585 … … 1574 1617 case kPowerSearch: 1575 1618 qphrase.remove(QRegExp("^\\s*AND\\s+", false)); 1576 1619 from << result.value(2).toString(); 1577 where << (QString(" record.recordid = ") + bindrecid +1620 where << (QString("%1.recordid = ").arg(recordTable) + bindrecid + 1578 1621 QString(" AND program.manualid = 0 AND ( %2 )") 1579 1622 .arg(qphrase)); 1580 1623 break; 1581 1624 case kTitleSearch: 1582 1625 from << ""; 1583 where << (QString(" record.recordid = ") + bindrecid + " AND "1626 where << (QString("%1.recordid = ").arg(recordTable) + bindrecid + " AND " 1584 1627 "program.manualid = 0 AND " 1585 1628 "program.title LIKE " + bindlikephrase); 1586 1629 break; 1587 1630 case kKeywordSearch: 1588 1631 from << ""; 1589 where << (QString(" record.recordid = ") + bindrecid +1632 where << (QString("%1.recordid = ").arg(recordTable) + bindrecid + 1590 1633 " AND program.manualid = 0" 1591 1634 " AND (program.title LIKE " + bindlikephrase + 1592 1635 " OR program.subtitle LIKE " + bindlikephrase + … … 1594 1637 break; 1595 1638 case kPeopleSearch: 1596 1639 from << ", people, credits"; 1597 where << (QString(" record.recordid = ") + bindrecid + " AND "1640 where << (QString("%1.recordid = ").arg(recordTable) + bindrecid + " AND " 1598 1641 "program.manualid = 0 AND " 1599 1642 "people.name LIKE " + bindphrase + " AND " 1600 1643 "credits.person = people.person AND " … … 1604 1647 case kManualSearch: 1605 1648 UpdateManuals(result.value(0).toInt()); 1606 1649 from << ""; 1607 where << ( QString("record.recordid = ") + bindrecid + " AND "1608 "program.manualid = record.recordid ");1650 where << ((QString("%1.recordid = ").arg(recordTable)) + bindrecid + " AND " + 1651 QString("program.manualid = %1.recordid ").arg(recordTable)); 1609 1652 break; 1610 1653 default: 1611 1654 VERBOSE(VB_IMPORTANT, QString("Unknown RecSearchType " … … 1621 1664 if (recordid == -1 || from.count() == 0) 1622 1665 { 1623 1666 from << ""; 1624 where << "record.search = :NRST AND "1625 "( record.recordid = :NRRECORDID OR :NRRECORDID = -1) AND "1667 QString s("DATABASE.search = :NRST AND " 1668 "(DATABASE.recordid = :NRRECORDID OR :NRRECORDID = -1) AND " 1626 1669 "program.manualid = 0 AND " 1627 "program.title = record.title "; 1670 "program.title = DATABASE.title "); 1671 1672 while (1) 1673 { 1674 int i = s.find("DATABASE"); 1675 if (i == -1) break; 1676 s = s.replace(i, strlen("DATABASE"), recordTable); 1677 } 1678 1679 where << s; 1628 1680 bindings[":NRST"] = kNoSearch; 1629 1681 bindings[":NRRECORDID"] = recordid; 1630 1682 } … … 1633 1685 void Scheduler::UpdateMatches(int recordid) { 1634 1686 struct timeval dbstart, dbend; 1635 1687 1636 MSqlQuery query( MSqlQuery::SchedCon());1688 MSqlQuery query(dbConn); 1637 1689 query.prepare("DELETE FROM recordmatch " 1638 1690 "WHERE recordid = :RECORDID OR :RECORDID = -1;"); 1639 1691 … … 1673 1725 { 1674 1726 QString query = QString( 1675 1727 "INSERT INTO recordmatch (recordid, chanid, starttime, manualid) " 1676 "SELECT record.recordid, program.chanid, program.starttime, "1728 "SELECT DATABASE.recordid, program.chanid, program.starttime, " 1677 1729 " IF(search = %1, recordid, 0) " 1678 "FROM record, program ").arg(kManualSearch) + fromclauses[clause] + QString(1730 "FROM DATABASE, program ").arg(kManualSearch) + fromclauses[clause] + QString( 1679 1731 " INNER JOIN channel ON (channel.chanid = program.chanid) " 1680 1732 "WHERE ") + whereclauses[clause] + QString(" AND channel.visible = 1 AND " 1681 "(( record.type = %1 " // allrecord1682 "OR record.type = %2 " // findonerecord1683 "OR record.type = %3 " // finddailyrecord1684 "OR record.type = %4) " // findweeklyrecord1733 "((DATABASE.type = %1 " // allrecord 1734 "OR DATABASE.type = %2 " // findonerecord 1735 "OR DATABASE.type = %3 " // finddailyrecord 1736 "OR DATABASE.type = %4) " // findweeklyrecord 1685 1737 " OR " 1686 " (( record.station = channel.callsign) " // channel matches1738 " ((DATABASE.station = channel.callsign) " // channel matches 1687 1739 " AND " 1688 " (( record.type = %5) " // channelrecord1740 " ((DATABASE.type = %5) " // channelrecord 1689 1741 " OR" 1690 " ((TIME_TO_SEC( record.starttime) = TIME_TO_SEC(program.starttime)) " // timeslot matches1742 " ((TIME_TO_SEC(DATABASE.starttime) = TIME_TO_SEC(program.starttime)) " // timeslot matches 1691 1743 " AND " 1692 " (( record.type = %6) " // timeslotrecord1744 " ((DATABASE.type = %6) " // timeslotrecord 1693 1745 " OR" 1694 " ((DAYOFWEEK( record.startdate) = DAYOFWEEK(program.starttime) "1746 " ((DAYOFWEEK(DATABASE.startdate) = DAYOFWEEK(program.starttime) " 1695 1747 " AND " 1696 " (( record.type = %7) " // weekslotrecord1748 " ((DATABASE.type = %7) " // weekslotrecord 1697 1749 " OR" 1698 " ((TO_DAYS( record.startdate) = TO_DAYS(program.starttime)) " // date matches1750 " ((TO_DAYS(DATABASE.startdate) = TO_DAYS(program.starttime)) " // date matches 1699 1751 " )" 1700 1752 " )" 1701 1753 " )" … … 1713 1765 .arg(kTimeslotRecord) 1714 1766 .arg(kWeekslotRecord); 1715 1767 1768 while (1) 1769 { 1770 int i = query.find("DATABASE"); 1771 if (i == -1) break; 1772 query = query.replace(i, strlen("DATABASE"), recordTable); 1773 } 1774 1716 1775 VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query %1...").arg(clause)); 1717 1776 1718 1777 gettimeofday(&dbstart, NULL); 1719 MSqlQuery result( MSqlQuery::SchedCon());1778 MSqlQuery result(dbConn); 1720 1779 result.prepare(query); 1721 1780 result.bindValues(bindings); 1722 1781 result.exec(); … … 1757 1816 QMap<int, bool> tooManyMap; 1758 1817 bool checkTooMany = false; 1759 1818 1760 MSqlQuery rlist( MSqlQuery::SchedCon());1761 rlist.prepare( "SELECT recordid,title,maxepisodes,maxnewest FROM record;");1819 MSqlQuery rlist(dbConn); 1820 rlist.prepare(QString("SELECT recordid,title,maxepisodes,maxnewest FROM %1;").arg(recordTable)); 1762 1821 1763 1822 rlist.exec(); 1764 1823 … … 1779 1838 1780 1839 if (maxEpisodes && !maxNewest) 1781 1840 { 1782 MSqlQuery epicnt( MSqlQuery::SchedCon());1841 MSqlQuery epicnt(dbConn); 1783 1842 1784 1843 epicnt.prepare("SELECT count(*) FROM recorded " 1785 1844 "WHERE title = :TITLE;"); … … 1801 1860 } 1802 1861 1803 1862 QString progfindid = QString( 1804 "(CASE record.type "1863 "(CASE DATABASE.type " 1805 1864 " WHEN %1 " 1806 " THEN record.findid "1865 " THEN DATABASE.findid " 1807 1866 " WHEN %2 " 1808 1867 " THEN to_days(date_sub(program.starttime, interval " 1809 " time_format( record.findtime, '%H:%i') hour_minute)) "1868 " time_format(DATABASE.findtime, '%H:%i') hour_minute)) " 1810 1869 " WHEN %3 " 1811 1870 " 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 "1871 " time_format(DATABASE.findtime, '%H:%i') hour_minute)) - " 1872 " DATABASE.findday)/7) * 7 + DATABASE.findday " 1814 1873 " WHEN %4 " 1815 " THEN record.findid "1874 " THEN DATABASE.findid " 1816 1875 " ELSE 0 " 1817 1876 " END) ") 1818 1877 .arg(kFindOneRecord) … … 1826 1885 "program.title, program.subtitle, program.description, " 1827 1886 "channel.channum, channel.callsign, channel.name, " 1828 1887 "oldrecorded.endtime IS NOT NULL AS oldrecduplicate, program.category, " 1829 " record.recpriority, "1830 " record.dupin, "1888 "DATABASE.recpriority, " 1889 "DATABASE.dupin, " 1831 1890 "recorded.endtime IS NOT NULL AND recorded.endtime < NOW() AS recduplicate, " 1832 1891 "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, "1892 "DATABASE.type, DATABASE.recordid, " 1893 "program.starttime - INTERVAL DATABASE.startoffset minute AS recstartts, " 1894 "program.endtime + INTERVAL DATABASE.endoffset minute AS recendts, " 1895 "program.previouslyshown, DATABASE.recgroup, DATABASE.dupmethod, " 1837 1896 "channel.commfree, capturecard.cardid, " 1838 1897 "cardinput.cardinputid, UPPER(cardinput.shareable) = 'Y' AS shareable, " 1839 1898 "program.seriesid, program.programid, program.category_type, " 1840 "program.airdate, program.stars, program.originalairdate, record.inactive, "1841 " record.parentid, ") + progfindid + ", record.tsdefault, "1899 "program.airdate, program.stars, program.originalairdate, DATABASE.inactive, " 1900 "DATABASE.parentid, ") + progfindid + ", DATABASE.tsdefault, " 1842 1901 "oldrecstatus.recstatus, oldrecstatus.reactivate, " 1843 1902 "channel.recpriority + cardinput.preference " 1844 1903 + QString( 1845 1904 "FROM recordmatch " 1846 1905 1847 " INNER JOIN record ON (recordmatch.recordid = record.recordid) "1906 " INNER JOIN DATABASE ON (recordmatch.recordid = DATABASE.recordid) " 1848 1907 " INNER JOIN program ON (recordmatch.chanid = program.chanid AND " 1849 1908 " recordmatch.starttime = program.starttime AND " 1850 1909 " recordmatch.manualid = program.manualid) " … … 1857 1916 " oldrecstatus.title = program.title ) " 1858 1917 " LEFT JOIN oldrecorded ON " 1859 1918 " ( " 1860 " record.dupmethod > 1 AND "1919 " DATABASE.dupmethod > 1 AND " 1861 1920 " oldrecorded.duplicate <> 0 AND " 1862 1921 " program.title = oldrecorded.title " 1863 1922 " AND " … … 1872 1931 " ( " 1873 1932 " (program.programid = '' OR oldrecorded.programid = '') " 1874 1933 " AND " 1875 " ((( record.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "1934 " (((DATABASE.dupmethod & 0x02) = 0) OR (program.subtitle <> '' " 1876 1935 " AND program.subtitle = oldrecorded.subtitle)) " 1877 1936 " AND " 1878 " ((( record.dupmethod & 0x04) = 0) OR (program.description <> '' "1937 " (((DATABASE.dupmethod & 0x04) = 0) OR (program.description <> '' " 1879 1938 " AND program.description = oldrecorded.description)) " 1880 1939 " ) " 1881 1940 " ) " 1882 1941 " ) " 1883 1942 " LEFT JOIN recorded ON " 1884 1943 " ( " 1885 " record.dupmethod > 1 AND "1944 " DATABASE.dupmethod > 1 AND " 1886 1945 " program.title = recorded.title " 1887 1946 " AND " 1888 1947 " ( " … … 1896 1955 " ( " 1897 1956 " (program.programid = '' OR recorded.programid = '') " 1898 1957 " AND " 1899 " ((( record.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "1958 " (((DATABASE.dupmethod & 0x02) = 0) OR (program.subtitle <> '' " 1900 1959 " AND program.subtitle = recorded.subtitle)) " 1901 1960 " AND " 1902 " ((( record.dupmethod & 0x04) = 0) OR (program.description <> '' "1961 " (((DATABASE.dupmethod & 0x04) = 0) OR (program.description <> '' " 1903 1962 " AND program.description = recorded.description)) " 1904 1963 " ) " 1905 1964 " ) " … … 1907 1966 " LEFT JOIN oldfind ON " 1908 1967 " (oldfind.recordid = recordmatch.recordid AND " 1909 1968 " oldfind.findid = ") + progfindid + QString(") " 1910 " ORDER BY record.recordid DESC "1969 " ORDER BY DATABASE.recordid DESC " 1911 1970 ); 1912 1971 1972 while (1) 1973 { 1974 int i = query.find("DATABASE"); 1975 if (i == -1) break; 1976 query = query.replace(i, strlen("DATABASE"), recordTable); 1977 } 1978 1913 1979 VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query...")); 1914 1980 1915 1981 gettimeofday(&dbstart, NULL); 1916 MSqlQuery result( MSqlQuery::SchedCon());1982 MSqlQuery result(dbConn); 1917 1983 result.prepare(query); 1918 1984 result.exec(); 1919 1985 gettimeofday(&dbend, NULL); … … 1976 2042 p->year = result.value(30).toString(); 1977 2043 p->stars = result.value(31).toDouble(); 1978 2044 2045 1979 2046 if (result.value(32).isNull()) 1980 2047 { 1981 2048 p->originalAirDate = p->startts.date(); … … 2081 2148 RecList tmpList; 2082 2149 2083 2150 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, "2151 "SELECT DATABASE.recordid, DATABASE.type, DATABASE.chanid, " 2152 "DATABASE.starttime, DATABASE.startdate, DATABASE.endtime, DATABASE.enddate, " 2153 "DATABASE.startoffset, DATABASE.endoffset, " 2154 "DATABASE.title, DATABASE.subtitle, DATABASE.description, " 2088 2155 "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 "2156 "FROM DATABASE " 2157 " INNER JOIN channel ON (channel.chanid = DATABASE.chanid) " 2158 " LEFT JOIN recordmatch on DATABASE.recordid = recordmatch.recordid " 2092 2159 "WHERE (type = %1 OR type = %2) AND recordmatch.chanid IS NULL") 2093 2160 .arg(kSingleRecord) 2094 2161 .arg(kOverrideRecord); 2095 2162 2163 while (1) 2164 { 2165 int i = query.find("DATABASE"); 2166 if (i == -1) break; 2167 query = query.replace(i, strlen("DATABASE"), recordTable); 2168 } 2169 2096 2170 VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query...")); 2097 2171 2098 2172 gettimeofday(&dbstart, NULL); 2099 MSqlQuery result( MSqlQuery::SchedCon());2173 MSqlQuery result(dbConn); 2100 2174 result.prepare(query); 2101 2175 result.exec(); 2102 2176 gettimeofday(&dbend, NULL); … … 2166 2240 void Scheduler::findAllScheduledPrograms(list<ProgramInfo *> &proglist) 2167 2241 { 2168 2242 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 "2243 QString query = QString("SELECT DATABASE.chanid, DATABASE.starttime, " 2244 "DATABASE.startdate, DATABASE.endtime, DATABASE.enddate, DATABASE.title, " 2245 "DATABASE.subtitle, DATABASE.description, DATABASE.recpriority, DATABASE.type, " 2246 "channel.name, DATABASE.recordid, DATABASE.recgroup, DATABASE.dupin, " 2247 "DATABASE.dupmethod, channel.commfree, channel.channum, DATABASE.station, " 2248 "DATABASE.seriesid, DATABASE.programid, DATABASE.category, DATABASE.findid, " 2249 "DATABASE.tsdefault " 2250 "FROM DATABASE " 2251 "LEFT JOIN channel ON channel.callsign = DATABASE.station " 2178 2252 "GROUP BY recordid " 2179 2253 "ORDER BY title ASC;"); 2180 2254 2255 while (1) 2256 { 2257 int i = query.find("DATABASE"); 2258 if (i == -1) break; 2259 query = query.replace(i, strlen("DATABASE"), recordTable); 2260 } 2261 2181 2262 MSqlQuery result(MSqlQuery::InitCon()); 2182 2263 result.prepare(query); 2183 2264 result.exec(); -
programs/mythbackend/mainserver.h
83 83 void HandleQueryFreeSpace(PlaybackSock *pbs, bool allBackends); 84 84 void HandleQueryCheckFile(QStringList &slist, PlaybackSock *pbs); 85 85 void HandleQueryGuideDataThrough(PlaybackSock *pbs); 86 void HandleGetPendingRecordings(PlaybackSock *pbs );86 void HandleGetPendingRecordings(PlaybackSock *pbs, QString table = "", int recordid=-1); 87 87 void HandleGetScheduledRecordings(PlaybackSock *pbs); 88 88 void HandleGetConflictingRecordings(QStringList &slist, PlaybackSock *pbs); 89 89 void HandleGetNextFreeRecorder(QStringList &slist, PlaybackSock *pbs); -
programs/mythbackend/scheduler.h
22 22 class Scheduler : public QObject 23 23 { 24 24 public: 25 Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList );25 Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList, QString recordTbl = "record", MSqlQueryInfo *dbConnUse = NULL); 26 26 ~Scheduler(); 27 27 28 28 void Reschedule(int recordid); 29 void FillRecordListFromDB(void); 29 /// @param[in] recordID changed from master (-1 == everything changed) 30 void FillRecordListFromDB(int recordid = -1); 30 31 void FillRecordListFromMaster(void); 31 32 32 33 void FillEncoderFreeSpaceCache(void); … … 61 62 static void *SchedulerThread(void *param); 62 63 63 64 private: 65 QString recordTable; 66 64 67 void verifyCards(void); 65 68 66 69 bool FillRecordList(void); … … 94 97 95 98 QValueList<int> reschedQueue; 96 99 QMutex reschedLock; 100 QMutex recordmatchLock; 97 101 QWaitCondition reschedWait; 98 102 RecList reclist; 99 103 RecList retrylist; … … 117 121 MainServer *m_mainServer; 118 122 119 123 bool m_isShuttingDown; 124 MSqlQueryInfo dbConn; 120 125 121 126 }; 122 127