From 5589d3fc973369ec51de06711e53c5b606f17f7b Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Tue, 23 Apr 2019 18:30:30 -0400 Subject: [PATCH] 2019-04-23 Fred Gleason * Added a 'STACK_SCHED_CODES' table to the database. * Dropped the 'STACK_LINES.SCHED_CODES' field from the database. * Incremented the database version to 308. * Renamed the 'SchedCartList' class to 'RDSchedCartList' and refactored it to be idiomatic Qt. * Renamed the 'SchedRulesList' class to 'RDSchedRulesList'. --- ChangeLog | 7 + docs/tables/Makefile.am | 1 + docs/tables/stack_lines.txt | 1 - docs/tables/stack_sched_codes.txt | 11 + lib/Makefile.am | 9 +- lib/dbversion.h | 2 +- lib/rdevent_line.cpp | 69 ++++++- lib/rdevent_line.h | 2 +- lib/rdschedcartlist.cpp | 139 +++++++++++++ lib/{schedcartlist.h => rdschedcartlist.h} | 52 ++--- ...chedruleslist.cpp => rdschedruleslist.cpp} | 37 ++-- lib/rdschedruleslist.h | 56 ++++++ lib/rdsvc.cpp | 9 + lib/schedcartlist.cpp | 188 ------------------ lib/schedruleslist.h | 57 ------ rdlogmanager/edit_clock.cpp | 2 +- rdlogmanager/edit_clock.h | 4 +- rdlogmanager/edit_schedcoderules.cpp | 3 +- rdlogmanager/edit_schedcoderules.h | 6 +- rdlogmanager/edit_schedrules.cpp | 5 +- rdlogmanager/edit_schedrules.h | 6 +- utils/rddbmgr/rddbmgr.cpp | 8 + utils/rddbmgr/rddbmgr.h | 2 + utils/rddbmgr/revertschema.cpp | 52 +++++ utils/rddbmgr/schemamap.cpp | 2 +- utils/rddbmgr/updateschema.cpp | 36 +++- utils/rdmaint/rdmaint.cpp | 10 + 27 files changed, 452 insertions(+), 324 deletions(-) create mode 100644 docs/tables/stack_sched_codes.txt create mode 100644 lib/rdschedcartlist.cpp rename lib/{schedcartlist.h => rdschedcartlist.h} (54%) rename lib/{schedruleslist.cpp => rdschedruleslist.cpp} (78%) create mode 100644 lib/rdschedruleslist.h delete mode 100644 lib/schedcartlist.cpp delete mode 100644 lib/schedruleslist.h diff --git a/ChangeLog b/ChangeLog index 9bda3c23..b808a9e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18588,3 +18588,10 @@ 2019-04-22 Patrick Linstruth * Fixed a bug in rdlogmanager(1) that could corrupt the 'CLOCK_LINES' table when renaming an event. +2019-04-23 Fred Gleason + * Added a 'STACK_SCHED_CODES' table to the database. + * Dropped the 'STACK_LINES.SCHED_CODES' field from the database. + * Incremented the database version to 308. + * Renamed the 'SchedCartList' class to 'RDSchedCartList' and + refactored it to be idiomatic Qt. + * Renamed the 'SchedRulesList' class to 'RDSchedRulesList'. diff --git a/docs/tables/Makefile.am b/docs/tables/Makefile.am index 42c3154b..a4d60aa6 100644 --- a/docs/tables/Makefile.am +++ b/docs/tables/Makefile.am @@ -97,6 +97,7 @@ EXTRA_DIST = audio_cards.txt\ services.txt\ sources.txt\ stack_lines.txt\ + stack_sched_codes.txt\ stations.txt\ switcher_nodes.txt\ system.txt\ diff --git a/docs/tables/stack_lines.txt b/docs/tables/stack_lines.txt index 2b3b4440..630a174f 100644 --- a/docs/tables/stack_lines.txt +++ b/docs/tables/stack_lines.txt @@ -9,5 +9,4 @@ SCHED_STACK_ID int(10) unsigned SERVICE_NAME varchar(10) From SERVICES.NAME CART int(10) unsigned From CART.NUMBER ARTIST varchar(191) From CART.ARTIST -SCHED_CODES varchar(191) SCHEDULED_AT datetime diff --git a/docs/tables/stack_sched_codes.txt b/docs/tables/stack_sched_codes.txt new file mode 100644 index 00000000..d069cb05 --- /dev/null +++ b/docs/tables/stack_sched_codes.txt @@ -0,0 +1,11 @@ + STACK_SCHED_CODES Table Layout for Rivendell + +The STACK_SCHED_CODES table holds the scheduler codes for rows in +the 'STACK_LINES' table. + + +FIELD NAME TYPE REMARKS +------------------------------------------------------------------------ +ID int(10) unsigned Primary key, auto_increment +STACK_LINES_ID int(10) unsigned From STACK_LINES.ID +SCHED_CODE varchar(10) diff --git a/lib/Makefile.am b/lib/Makefile.am index 7ad2126c..2866d84a 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -196,8 +196,10 @@ dist_librd_la_SOURCES = dbversion.h\ rdreport.cpp rdreport.h\ rdringbuffer.cpp rdringbuffer.h\ rdripc.cpp rdripc.h\ + rdschedcartlist.cpp rdschedcartlist.h\ rdschedcode.cpp rdschedcode.h\ rdschedcodes_dialog.cpp rdschedcodes_dialog.h\ + rdschedruleslist.cpp rdschedruleslist.h\ rdsegmeter.cpp rdsegmeter.h\ rdsettings.cpp rdsettings.h\ rdsimpleplayer.cpp rdsimpleplayer.h\ @@ -237,9 +239,7 @@ dist_librd_la_SOURCES = dbversion.h\ rdwavepainter.cpp rdwavepainter.h\ rdweb.cpp rdweb.h\ rdwebresult.cpp rdwebresult.h\ - rdxport_interface.h\ - schedruleslist.cpp schedruleslist.h\ - schedcartlist.cpp schedcartlist.h + rdxport_interface.h nodist_librd_la_SOURCES = moc_rdadd_cart.cpp\ @@ -332,8 +332,7 @@ nodist_librd_la_SOURCES = moc_rdadd_cart.cpp\ moc_rdunixserver.cpp\ moc_rdunixsocket.cpp\ moc_rdupload.cpp\ - moc_rdwavedata_dialog.cpp\ - moc_schedcartlist.cpp + moc_rdwavedata_dialog.cpp librd_la_LDFLAGS = -release $(VERSION) diff --git a/lib/dbversion.h b/lib/dbversion.h index 205df7be..8587f872 100644 --- a/lib/dbversion.h +++ b/lib/dbversion.h @@ -24,7 +24,7 @@ /* * Current Database Version */ -#define RD_VERSION_DATABASE 307 +#define RD_VERSION_DATABASE 308 #endif // DBVERSION_H diff --git a/lib/rdevent_line.cpp b/lib/rdevent_line.cpp index 0854bd22..31d4018a 100644 --- a/lib/rdevent_line.cpp +++ b/lib/rdevent_line.cpp @@ -27,7 +27,7 @@ #include "rdevent.h" #include "rdevent_line.h" #include "rdeventimportlist.h" -#include "schedcartlist.h" +#include "rdschedcartlist.h" RDEventLine::RDEventLine(RDStation *station) { @@ -222,7 +222,7 @@ void RDEventLine::setColor(const QColor &color) } -QString RDEventLine::SchedGroup() const +QString RDEventLine::schedGroup() const { return event_sched_group; } @@ -633,16 +633,17 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, sql=QString("select NUMBER,ARTIST,")+ "CONCAT(GROUP_CONCAT(RPAD(SC.SCHED_CODE,11,' ') separator ''),'.') as SCHED_CODES"+ " from CART LEFT JOIN CART_SCHED_CODES AS SC on (NUMBER=SC.CART_NUMBER)"+ - " where GROUP_NAME='"+RDEscapeString(SchedGroup())+"'"+ + " where GROUP_NAME='"+RDEscapeString(schedGroup())+"'"+ " group by NUMBER"; + RDSchedCartList *schedCL=new RDSchedCartList(); q=new RDSqlQuery(sql); - int querysize=(int)q->size(); - SchedCartList *schedCL; - schedCL=new SchedCartList(querysize); - - for(counter=0;counterseek(counter); - schedCL->insertItem(q->value(0).toUInt(),0,0,q->value(1).toString(),q->value(2).toString()); + while(q->next()) { + QStringList codes=q->value(2).toString().split(" ",QString::SkipEmptyParts); + if((codes.size()>0)&&(codes.last()==".")) { + codes.removeLast(); + } + schedCL-> + insertItem(q->value(0).toUInt(),0,0,q->value(1).toString(),codes); } delete q; @@ -748,10 +749,18 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, QString wstr=q->value(0).toString(); wstr+=" "; wstr=wstr.left(11); + sql=QString("select STACK_LINES.CART ")+ + "from STACK_LINES left join STACK_SCHED_CODES "+ + "on STACK_LINES.ID=STACK_SCHED_CODES.STACK_LINES_ID where "+ + "STACK_LINES.SERVICE_NAME=\""+RDEscapeString(svcname)+"\" && "+ + QString().sprintf("STACK_LINES.SCHED_STACK_ID > %d && ",stackid-range)+ + "STACK_SCHED_CODES.SCHED_CODE=\""+RDEscapeString(wstr)+"\""; + /* sql=QString("select CART from STACK_LINES where ")+ "SERVICE_NAME=\""+RDEscapeString(svcname)+"\" && "+ QString().sprintf("SCHED_STACK_ID > %d && ",stackid-range)+ "SCHED_CODES like \"%%"+RDEscapeString(wstr)+"%%\""; + */ q1=new RDSqlQuery(sql); if(q1->size()>=allowed || allowed==0) { for(counter=0;countergetNumberOfItems();counter++) { @@ -774,10 +783,18 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, QString wstr=q->value(3).toString(); wstr+=" "; wstr=wstr.left(11); + sql=QString("select STACK_LINES.CART ")+ + "from STACK_LINES left join STACK_SCHED_CODES "+ + "on STACK_LINES.ID=STACK_SCHED_CODES.STACK_LINES_ID where "+ + "STACK_LINES.SERVICE_NAME=\""+RDEscapeString(svcname)+"\" && "+ + QString().sprintf("STACK_LINES.SCHED_STACK_ID=%d && ",stackid-1)+ + "STACK_SCHED_CODES.SCHED_CODE=\""+RDEscapeString(wstr)+"\""; + /* sql=QString("select CART from STACK_LINES where ")+ "SERVICE_NAME=\""+RDEscapeString(svcname)+"\" && "+ QString().sprintf("SCHED_STACK_ID=%d && ",stackid-1)+ "SCHED_CODES like \"%"+RDEscapeString(wstr)+"%\""; + */ q1=new RDSqlQuery(sql); if(q1->size()>0) { for(counter=0;countergetNumberOfItems();counter++) { @@ -801,9 +818,16 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, QString wstr=q->value(4).toString(); wstr+=" "; wstr=wstr.left(11); + sql=QString("select STACK_LINES.CART ")+ + "from STACK_LINES left join STACK_SCHED_CODES "+ + "on STACK_LINES.ID=STACK_SCHED_CODES.STACK_LINES_ID where "+ + QString().sprintf("STACK_LINES.SCHED_STACK_ID=%d && ",stackid-1)+ + "STACK_SCHED_CODES.SCHED_CODE=\""+RDEscapeString(wstr)+"\""; + /* sql=QString("select CART from STACK_LINES where ")+ QString().sprintf("SCHED_STACK_ID=%d && ",stackid-1)+ "SCHED_CODES like \"%"+RDEscapeString(wstr)+"%\""; + */ q1=new RDSqlQuery(sql); if(q1->size()>0) { for(counter=0;countergetNumberOfItems();counter++) { @@ -827,9 +851,16 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, QString wstr=q->value(5).toString(); wstr+=" "; wstr=wstr.left(11); + sql=QString("select STACK_LINES.CART ")+ + "from STACK_LINES left join STACK_SCHED_CODES "+ + "on STACK_LINES.ID=STACK_SCHED_CODES.STACK_LINES_ID where "+ + QString().sprintf("STACK_LINES.SCHED_STACK_ID=%d && ",stackid-1)+ + "STACK_SCHED_CODES.SCHED_CODE=\""+RDEscapeString(wstr)+"\""; + /* sql=QString("select CART from STACK_LINES where ")+ QString().sprintf("SCHED_STACK_ID=%d && ",stackid-1)+ "SCHED_CODES like \"%"+RDEscapeString(wstr)+"%\""; + */ q1=new RDSqlQuery(sql); if(q1->size()>0) { for(counter=0;countergetNumberOfItems();counter++) { @@ -880,6 +911,21 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, count++; + sql=QString("insert into STACK_LINES set ")+ + "SERVICE_NAME=\""+RDEscapeString(svcname)+"\","+ + "SCHEDULED_AT=now(),"+ + QString().sprintf("SCHED_STACK_ID=%u,",stackid)+ + QString().sprintf("CART=%u,",schedCL->getItemCartNumber(schedpos))+ + "ARTIST=\""+RDEscapeString(schedCL->getItemArtist(schedpos))+"\""; + unsigned line_id=RDSqlQuery::run(sql).toUInt(); + QStringList codes=schedCL->getItemSchedCodes(schedpos); + for(int i=0;i +// Copyright (C) 2019 Fred Gleason +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public +// License along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#include +#include "rdschedcartlist.h" + +RDSchedCartList::RDSchedCartList() +{ +} + + +void RDSchedCartList::insertItem(unsigned cartnumber,int cartlength,int stack_id, + const QString &stack_artist, + const QStringList &stack_schedcodes) +{ + list_cartnum.push_back(cartnumber); + list_cartlen.push_back(cartlength); + list_stackid.push_back(stack_id); + list_artist.push_back(stack_artist.lower().replace(" ","")); + list_schedcodes.push_back(stack_schedcodes); +} + + +void RDSchedCartList::removeItem(int itemnumber) +{ + list_cartnum.removeAt(itemnumber); + list_cartlen.removeAt(itemnumber); + list_stackid.removeAt(itemnumber); + list_artist.removeAt(itemnumber); + list_schedcodes.removeAt(itemnumber); +} + +bool RDSchedCartList::removeIfCode(int itemnumber,const QString &test_code) +{ + bool matched=false; + + for(int i=list_schedcodes.size()-1;i>=0;i--) { + if(list_schedcodes.at(i).contains(test_code)) { + list_cartnum.removeAt(i); + list_cartlen.removeAt(i); + list_stackid.removeAt(i); + list_artist.removeAt(i); + list_schedcodes.removeAt(i); + matched=true; + } + } + + return matched; +} + +bool RDSchedCartList::itemHasCode(int itemnumber,const QString &test_code) +{ + return list_schedcodes.at(itemnumber).contains(test_code); +} + + +bool RDSchedCartList::itemHasCodes(int itemnumber,const QStringList &test_codes) +{ + for(int i=0;i +// Copyright (C) 2005 Stefan Gabriel +// Copyright (C) 2019 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -18,45 +19,44 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -#ifndef SCHEDCARTLIST_H -#define SCHEDCARTLIST_H +#ifndef RDSCHEDCARTLIST_H +#define RDSCHEDCARTLIST_H -#include +#include #include -class SchedCartList +class RDSchedCartList { public: - SchedCartList(int listsize); - ~SchedCartList(); - void insertItem(unsigned cartnumber,int cartlength,int stack_id,QString stack_artist,QString stack_schedcodes); + RDSchedCartList(); + void insertItem(unsigned cartnumber,int cartlength,int stack_id, + const QString &stack_artist, + const QStringList &stack_schedcodes); void removeItem(int itemnumber); - bool removeIfCode(int itemnumber,QString test_code); - bool itemHasCode(int itemnumber,QString test_code); - bool itemHasCodes(int itemnumber,QStringList test_codes); + bool removeIfCode(int itemnumber,const QString &test_code); + bool itemHasCode(int itemnumber,const QString &test_code); + bool itemHasCodes(int itemnumber,const QStringList &test_codes); unsigned getItemCartNumber(int itemnumber); int getItemCartLength(int itemnumber); int getItemStackid(int itemnumber); QString getItemArtist(int itemnumber); - QString getItemSchedCodes(int itemnumber); + QStringList getItemSchedCodes(int itemnumber); int getNumberOfItems(void); void save(void); void restore(void); private: - int itemcounter; - int saveitemcounter; - unsigned* cartnum; - unsigned* savecartnum; - int* cartlen; - int* savecartlen; - int* stackid; - int* savestackid; - QString* saveartist; - QString* artist; - QString* sched_codes; - QString* save_sched_codes; + QList list_cartnum; + QList list_savecartnum; + QList list_cartlen; + QList list_savecartlen; + QList list_stackid; + QList list_savestackid; + QStringList list_artist; + QStringList list_saveartist; + QList list_schedcodes; + QList list_saveschedcodes; }; -#endif +#endif // RDSCHEDCARTLIST_H diff --git a/lib/schedruleslist.cpp b/lib/rdschedruleslist.cpp similarity index 78% rename from lib/schedruleslist.cpp rename to lib/rdschedruleslist.cpp index 5f1a3509..495dba7c 100644 --- a/lib/schedruleslist.cpp +++ b/lib/rdschedruleslist.cpp @@ -1,8 +1,9 @@ -// schedruleslist.cpp +// rdschedruleslist.cpp // // A class for handling the scheduling rules for rdlogmanager/edit clocks // -// Stefan Gabriel +// (C) Copyright 2005 Stefan Gabriel +// (C) Copyright 2019 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -20,12 +21,12 @@ #include -#include -#include -#include -#include +#include "rdclock.h" +#include "rddb.h" +#include "rdescape_string.h" +#include "rdschedruleslist.h" -SchedRulesList::SchedRulesList(QString clockname,RDConfig *config) +RDSchedRulesList::RDSchedRulesList(QString clockname,RDConfig *config) { QString sql; RDSqlQuery *q; @@ -77,7 +78,7 @@ SchedRulesList::SchedRulesList(QString clockname,RDConfig *config) delete q; } -SchedRulesList::~SchedRulesList() +RDSchedRulesList::~RDSchedRulesList() { delete []sched_code; delete []max_row; @@ -88,7 +89,7 @@ SchedRulesList::~SchedRulesList() delete []description; } -void SchedRulesList::insertItem(int pos,int maxrow,int minwait,QString notafter,QString orafter,QString orafterii) +void RDSchedRulesList::insertItem(int pos,int maxrow,int minwait,QString notafter,QString orafter,QString orafterii) { max_row[pos] = maxrow; min_wait[pos] = minwait; @@ -97,47 +98,47 @@ void SchedRulesList::insertItem(int pos,int maxrow,int minwait,QString notafter, or_after_II[pos] = orafterii; } -QString SchedRulesList::getItemSchedCode(int pos) +QString RDSchedRulesList::getItemSchedCode(int pos) { return sched_code[pos]; } -int SchedRulesList::getItemMaxRow(int pos) +int RDSchedRulesList::getItemMaxRow(int pos) { return max_row[pos]; } -int SchedRulesList::getItemMinWait(int pos) +int RDSchedRulesList::getItemMinWait(int pos) { return min_wait[pos]; } -QString SchedRulesList::getItemNotAfter(int pos) +QString RDSchedRulesList::getItemNotAfter(int pos) { return not_after[pos]; } -QString SchedRulesList::getItemOrAfter(int pos) +QString RDSchedRulesList::getItemOrAfter(int pos) { return or_after[pos]; } -QString SchedRulesList::getItemOrAfterII(int pos) +QString RDSchedRulesList::getItemOrAfterII(int pos) { return or_after_II[pos]; } -QString SchedRulesList::getItemDescription(int pos) +QString RDSchedRulesList::getItemDescription(int pos) { return description[pos]; } -int SchedRulesList::getNumberOfItems(void) +int RDSchedRulesList::getNumberOfItems(void) { return itemcounter; } -void SchedRulesList::Save(QString clockname) +void RDSchedRulesList::Save(QString clockname) { QString sql; diff --git a/lib/rdschedruleslist.h b/lib/rdschedruleslist.h new file mode 100644 index 00000000..9b03021e --- /dev/null +++ b/lib/rdschedruleslist.h @@ -0,0 +1,56 @@ +// rdschedruleslist.h +// +// A class for handling the scheduling rules for rdlogmanager/edit clocks +// +// (C) Copyright Stefan Gabriel +// (C) Copyright 2019 Fred Gleason +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public +// License along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#ifndef RDSCHEDRULESLIST_H +#define RDSCHEDRULESLIST_H + +#include + +class RDSchedRulesList +{ + public: + RDSchedRulesList(QString clockname,RDConfig *config); + ~RDSchedRulesList(); + void insertItem(int pos,int maxrow,int minwait,QString notafter, + QString orafter,QString orafterii); + QString getItemSchedCode(int pos); + int getItemMaxRow(int pos); + int getItemMinWait(int pos); + int getNumberOfItems(void); + QString getItemNotAfter(int pos); + QString getItemOrAfter(int pos); + QString getItemOrAfterII(int pos); + QString getItemDescription(int pos); + void Save(QString clockname); + + private: + int itemcounter; + QString* sched_code; + int* max_row; + int* min_wait; + QString* not_after; + QString* or_after; + QString* or_after_II; + QString* description; +}; + + +#endif // RDSCHEDRULESLIST_H diff --git a/lib/rdsvc.cpp b/lib/rdsvc.cpp index 6addb6a5..4fc598dd 100644 --- a/lib/rdsvc.cpp +++ b/lib/rdsvc.cpp @@ -1410,6 +1410,15 @@ void RDSvc::remove(const QString &name) } delete q; + sql=QString("select ID from STACK_LINES where ")+ + "SERVICE_NAME=\""+RDEscapeString(name)+"\""; + q=new RDSqlQuery(sql); + while(q->next()) { + sql=QString("delete from STACK_SCHED_CODES where ")+ + QString().sprintf("STACK_LINES_ID=%u",q->value(0).toUInt()); + RDSqlQuery::apply(sql); + } + delete q; sql=QString("delete from STACK_LINES where ")+ "SERVICE_NAME=\""+RDEscapeString(name)+"\""; RDSqlQuery::apply(sql); diff --git a/lib/schedcartlist.cpp b/lib/schedcartlist.cpp deleted file mode 100644 index 8c79c42b..00000000 --- a/lib/schedcartlist.cpp +++ /dev/null @@ -1,188 +0,0 @@ -// schedcartlist.cpp -// -// A class for handling carts to be used in scheduler -// -// Stefan Gabriel -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public -// License along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// - -#include -#include "schedcartlist.h" - -SchedCartList::SchedCartList(int listsize) -{ - cartnum=new unsigned[listsize]; - cartlen=new int[listsize]; - stackid=new int[listsize]; - artist=new QString[listsize]; - sched_codes=new QString[listsize]; - itemcounter=0; -} - -SchedCartList::~SchedCartList() -{ - delete []cartnum; - delete []cartlen; - delete []stackid; - delete []artist; - delete []sched_codes; -} - -void SchedCartList::insertItem(unsigned cartnumber,int cartlength,int stack_id,QString stack_artist,QString stack_schedcodes) -{ - cartnum[itemcounter]=cartnumber; - cartlen[itemcounter]=cartlength; - stackid[itemcounter]=stack_id; - artist[itemcounter]=stack_artist.lower().replace(" ",""); - if(stack_schedcodes=="") { - stack_schedcodes="."; - } - sched_codes[itemcounter]=stack_schedcodes; - itemcounter++; -} - - -void SchedCartList::removeItem(int itemnumber) -{ - for(int i=itemnumber;i<(itemcounter-1);i++) { - cartnum[i]=cartnum[i+1]; - cartlen[i]=cartlen[i+1]; - stackid[i]=stackid[i+1]; - artist[i]=artist[i+1]; - sched_codes[i]=sched_codes[i+1]; - } - itemcounter--; -} - -bool SchedCartList::removeIfCode(int itemnumber,QString test_code) -{ - QString test = test_code; - test+=" "; - test=test.left(11); - - if (sched_codes[itemnumber].find(test)!=-1) { - for(int i=itemnumber;i<(itemcounter-1);i++) { - cartnum[i]=cartnum[i+1]; - cartlen[i]=cartlen[i+1]; - stackid[i]=stackid[i+1]; - artist[i]=artist[i+1]; - sched_codes[i]=sched_codes[i+1]; - } - itemcounter--; - return true; - } - return false; -} - -bool SchedCartList::itemHasCode(int itemnumber,QString test_code) -{ - QString test=test_code; - test+=" "; - test=test.left(11); - - if (sched_codes[itemnumber].find(test)!=-1) { - return true; - } - else { - return false; - } -} - - -bool SchedCartList::itemHasCodes(int itemnumber,QStringList test_codes) -{ - for (int i=0;i -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public -// License along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// - -#ifndef SCHEDRULESLIST_H -#define SCHEDRULESLIST_H - -#include - -class SchedRulesList -{ - public: - SchedRulesList(QString clockname,RDConfig *config); - ~SchedRulesList(); - void insertItem(int pos,int maxrow,int minwait,QString notafter,QString orafter,QString orafterii); - QString getItemSchedCode(int pos); - int getItemMaxRow(int pos); - int getItemMinWait(int pos); - int getNumberOfItems(void); - QString getItemNotAfter(int pos); - QString getItemOrAfter(int pos); - QString getItemOrAfterII(int pos); - QString getItemDescription(int pos); - void Save(QString clockname); - - - private: - int itemcounter; - QString* sched_code; - int* max_row; - int* min_wait; - QString* not_after; - QString* or_after; - QString* or_after_II; - QString* description; - -}; - - -#endif - diff --git a/rdlogmanager/edit_clock.cpp b/rdlogmanager/edit_clock.cpp index 74fe614f..74353bd6 100644 --- a/rdlogmanager/edit_clock.cpp +++ b/rdlogmanager/edit_clock.cpp @@ -240,7 +240,7 @@ EditClock::EditClock(QString clockname,bool new_clock, // // Populate Data // - sched_rules_list = new SchedRulesList(clockname,rda->config()); + sched_rules_list = new RDSchedRulesList(clockname,rda->config()); edit_clock=new RDClock(rda->station()); edit_clock->setName(clockname); edit_clock->load(); diff --git a/rdlogmanager/edit_clock.h b/rdlogmanager/edit_clock.h index 043b8b4d..35a23c67 100644 --- a/rdlogmanager/edit_clock.h +++ b/rdlogmanager/edit_clock.h @@ -31,7 +31,7 @@ #include #include -#include +#include #include "clock_listview.h" @@ -93,7 +93,7 @@ class EditClock : public QDialog QString edit_name; bool edit_new_clock; std::vector *edit_new_clocks; - SchedRulesList* sched_rules_list; + RDSchedRulesList* sched_rules_list; Q3TextEdit *edit_remarks_edit; }; diff --git a/rdlogmanager/edit_schedcoderules.cpp b/rdlogmanager/edit_schedcoderules.cpp index a9f939c4..b639c26c 100644 --- a/rdlogmanager/edit_schedcoderules.cpp +++ b/rdlogmanager/edit_schedcoderules.cpp @@ -31,12 +31,11 @@ #include #include -#include #include "edit_schedcoderules.h" editSchedCodeRules::editSchedCodeRules(Q3ListViewItem *item, - SchedRulesList *sched_rules_list, + RDSchedRulesList *sched_rules_list, QWidget* parent) : QDialog(parent) { diff --git a/rdlogmanager/edit_schedcoderules.h b/rdlogmanager/edit_schedcoderules.h index 2adaaeef..912a3afd 100644 --- a/rdlogmanager/edit_schedcoderules.h +++ b/rdlogmanager/edit_schedcoderules.h @@ -3,7 +3,7 @@ // Change rules for scheduler codes dialog // // (C) Copyright Stefan Gabriel -// (C) Copyright 2002-2018 Fred Gleason +// (C) Copyright 2002-2019 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -28,7 +28,7 @@ #include #include -#include +#include #include "clock_listview.h" @@ -38,7 +38,7 @@ class editSchedCodeRules : public QDialog { Q_OBJECT public: - editSchedCodeRules(Q3ListViewItem *item, SchedRulesList *sched_rules_list, + editSchedCodeRules(Q3ListViewItem *item, RDSchedRulesList *sched_rules_list, QWidget *parent=0); ~editSchedCodeRules(); QSize sizeHint() const; diff --git a/rdlogmanager/edit_schedrules.cpp b/rdlogmanager/edit_schedrules.cpp index 9d3d2071..7788a4ee 100644 --- a/rdlogmanager/edit_schedrules.cpp +++ b/rdlogmanager/edit_schedrules.cpp @@ -37,9 +37,8 @@ #include "edit_schedcoderules.h" #include "globals.h" #include "list_clocks.h" -#include "schedruleslist.h" -EditSchedRules::EditSchedRules(QString clock,unsigned *artistsep,SchedRulesList *schedruleslist,bool *rules_modified,QWidget *parent) +EditSchedRules::EditSchedRules(QString clock,unsigned *artistsep,RDSchedRulesList *schedruleslist,bool *rules_modified,QWidget *parent) : QDialog(parent) { setModal(true); @@ -231,7 +230,7 @@ void EditSchedRules::importData() return; } delete listclocks; - SchedRulesList *import_list=new SchedRulesList(clockname,rda->config()); + RDSchedRulesList *import_list=new RDSchedRulesList(clockname,rda->config()); list_schedCodes_view->clear(); for (int i=0; igetNumberOfItems(); i++) diff --git a/rdlogmanager/edit_schedrules.h b/rdlogmanager/edit_schedrules.h index 69ac6555..64e09457 100644 --- a/rdlogmanager/edit_schedrules.h +++ b/rdlogmanager/edit_schedrules.h @@ -29,7 +29,7 @@ #include #include -#include +#include class QSpinBox; @@ -38,7 +38,7 @@ class EditSchedRules : public QDialog Q_OBJECT public: EditSchedRules(QString clock,unsigned *artistsep, - SchedRulesList *schedruleslist,bool *rules_modified, + RDSchedRulesList *schedruleslist,bool *rules_modified, QWidget *parent=0); ~EditSchedRules(); QSize sizeHint() const; @@ -63,7 +63,7 @@ class EditSchedRules : public QDialog QString clockname; unsigned* edit_artistsep; bool* edit_rules_modified; - SchedRulesList* sched_rules_list; + RDSchedRulesList* sched_rules_list; bool edit_modified; }; diff --git a/utils/rddbmgr/rddbmgr.cpp b/utils/rddbmgr/rddbmgr.cpp index f7005e24..a87f843e 100644 --- a/utils/rddbmgr/rddbmgr.cpp +++ b/utils/rddbmgr/rddbmgr.cpp @@ -434,6 +434,14 @@ bool MainObject::DropColumn(const QString &tbl_name,const QString &col_name, } +bool MainObject::DropIndex(const QString &tbl_name,const QString &idx_name, + QString *err_msg) const +{ + QString sql=QString("alter table `")+tbl_name+"` drop index `"+idx_name+"`"; + return RDSqlQuery::apply(sql,err_msg); +} + + int main(int argc,char *argv[]) { QApplication a(argc,argv,false); diff --git a/utils/rddbmgr/rddbmgr.h b/utils/rddbmgr/rddbmgr.h index d6337e8f..fe57e2d9 100644 --- a/utils/rddbmgr/rddbmgr.h +++ b/utils/rddbmgr/rddbmgr.h @@ -120,6 +120,8 @@ class MainObject : public QObject bool ColumnExists(const QString &tbl_name,const QString &col_name) const; bool DropColumn(const QString &tbl_name,const QString &col_name, QString *err_msg=NULL) const; + bool DropIndex(const QString &tbl_name,const QString &idx_name, + QString *err_msg=NULL) const; Command db_command; QString db_mysql_hostname; QString db_mysql_loginname; diff --git a/utils/rddbmgr/revertschema.cpp b/utils/rddbmgr/revertschema.cpp index 67f8ad07..5b447220 100644 --- a/utils/rddbmgr/revertschema.cpp +++ b/utils/rddbmgr/revertschema.cpp @@ -40,6 +40,58 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) // NEW SCHEMA REVERSIONS GO HERE... + // + // Revert 308 + // + if((cur_schema==308)&&(set_schemanext()) { + sql=QString("select ")+ + "SCHED_CODE " // 00 + "from STACK_SCHED_CODES where "+ + QString().sprintf("STACK_LINES_ID=%u",q->value(0).toUInt()); + q1=new RDSqlQuery(sql,false); + while(q1->next()) { + codes+=q1->value(0).toString(); + while((codes.length()%10)!=0) { + codes+=" "; + } + } + delete q1; + codes+="."; + sql=QString("update STACK_LINES set ")+ + "SCHED_CODES=\""+RDEscapeString(codes)+"\" where "+ + QString().sprintf("ID=%u",q->value(0).toUInt()); + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + codes=""; + } + delete q; + DropTable("STACK_SCHED_CODES",err_msg); + + WriteSchemaVersion(--cur_schema); + } + + // + // Revert 307 + // if((cur_schema==307)&&(set_schema +// (C) Copyright 2018-2019 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -9700,6 +9700,40 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) WriteSchemaVersion(++cur_schema); } + if((cur_schema<308)&&(set_schema>cur_schema)) { + sql=QString("create table if not exists STACK_SCHED_CODES (")+ + "ID int auto_increment not null primary key,"+ + "STACK_LINES_ID int unsigned,"+ + "SCHED_CODE varchar(10),"+ + "index SCHED_CODE_IDX(SCHED_CODE))"+ + " charset utf8mb4 collate utf8mb4_general_ci"+ + db_table_create_postfix; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + sql=QString("select ")+ + "ID,"+ // 00 + "SCHED_CODES " // 01 + "from STACK_LINES"; + q=new RDSqlQuery(sql,false); + while(q->next()) { + QStringList f0=q->value(1).toString().split(" ",QString::SkipEmptyParts); + for(int i=0;ivalue(0).toUInt())+ + "SCHED_CODE=\""+RDEscapeString(f0.at(i).trimmed())+"\""; + RDSqlQuery::apply(sql,err_msg); + } + } + } + delete q; + DropColumn("STACK_LINES","SCHED_CODES",err_msg); + + WriteSchemaVersion(++cur_schema); + } + + // NEW SCHEMA UPDATES GO HERE... // diff --git a/utils/rdmaint/rdmaint.cpp b/utils/rdmaint/rdmaint.cpp index c4d19e21..6b263813 100644 --- a/utils/rdmaint/rdmaint.cpp +++ b/utils/rdmaint/rdmaint.cpp @@ -327,6 +327,16 @@ void MainObject::PurgeStacks() if (q1->next()) { stackid=q1->value(0).toUInt(); if (stackid-stacksize > 0) { + sql=QString("select ID from STACK_LINES where ")+ + "SERVICE_NAME=\""+RDEscapeString(q->value(0).toString())+"\" && "+ + QString().sprintf("SCHED_STACK_ID<=%d",stackid-stacksize); + q2=new RDSqlQuery(sql); + while(q2->next()) { + sql=QString("delete from STACK_SCHED_CODES where ")+ + QString().sprintf("STACK_LINES_ID=%u",q2->value(0).toUInt()); + RDSqlQuery::apply(sql); + } + delete q2; sql=QString("delete from STACK_LINES where ")+ "SERVICE_NAME=\""+RDEscapeString(q->value(0).toString())+"\" && "+ QString().sprintf("SCHED_STACK_ID<=%d",stackid-stacksize);