diff --git a/ChangeLog b/ChangeLog index 26080248..63a1d400 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18582,3 +18582,6 @@ 2019-04-22 Patrick Linstruth * Fixed a regression in rdimport(1) that broke the "--set-daypart-times" argument. +2019-04-22 Patrick Linstruth + * Fixed a regression that broke clock scheduler rules + in rdlogmanager(1). diff --git a/lib/rdevent_line.cpp b/lib/rdevent_line.cpp index 550b796d..0854bd22 100644 --- a/lib/rdevent_line.cpp +++ b/lib/rdevent_line.cpp @@ -596,71 +596,75 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, time.addMSecs(postimport_length); - // - // Load all carts with requested scheduler codes into schedCL - // - sql=QString("select NUMBER,ARTIST from CART"); - if(event_have_code!="") { - sql+=" INNER JOIN CART_SCHED_CODES AS S1 on (NUMBER=S1.CART_NUMBER AND S1.SCHED_CODE='"+RDEscapeString(event_have_code)+"')"; + if(event_artist_sep>=-1 && event_artist_sep<=50000) { + artistsep = event_artist_sep; } - if(event_have_code2!="") { - sql+=" INNER JOIN CART_SCHED_CODES AS S2 on (NUMBER=S2.CART_NUMBER AND S2.SCHED_CODE='"+RDEscapeString(event_have_code2)+"')"; + else { + artistsep = 15; } - sql+=" where GROUP_NAME='"+RDEscapeString(SchedGroup())+"'"; + + if(event_title_sep>=-1 && event_title_sep<=50000) { + titlesep = event_title_sep; + } + else { + titlesep = 100; + } + + // + // Get next stack id from the stack + // + sql=QString("select ")+ + "MAX(SCHED_STACK_ID) "+ + "from STACK_LINES where "+ + "SERVICE_NAME=\""+RDEscapeString(svcname)+"\""; q=new RDSqlQuery(sql); - if(q->size()>0) { - if(event_artist_sep>=-1 && event_artist_sep<=50000) { - artistsep = event_artist_sep; - } - else { - artistsep = 15; - } - - if(event_title_sep>=-1 && event_title_sep<=50000) { - titlesep = event_title_sep; - } - else { - titlesep = 100; - } - - int querysize=(int)q->size(); - SchedCartList *schedCL; - schedCL=new SchedCartList(querysize); - - QString schedcode; // No longer needed - possibly remove at a later date - for(counter=0;counterseek(counter); - schedCL->insertItem(q->value(0).toUInt(),0,0,q->value(1).toString(),schedcode); - } - delete q; + if (q->next()) { + stackid=q->value(0).toUInt(); + } + else { + stackid=0; + } + stackid++; + delete q; - // - // Get next stack id from the stack - // - sql=QString("select ")+ - "MAX(SCHED_STACK_ID) "+ - "from STACK_LINES where "+ - "SERVICE_NAME=\""+RDEscapeString(svcname)+"\""; - q=new RDSqlQuery(sql); - if (q->next()) - { - stackid=q->value(0).toUInt(); - } - else - { - stackid=0; - } - stackid++; - delete q; - - - ////////////////////////////////// - // // - // Add deconflicting rules here // - // // - ////////////////////////////////// + // + // Load all carts in requested group into schedCL + // + 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())+"'"+ + " group by NUMBER"; + 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()); + } + delete q; + + ////////////////////////////////// + // // + // Add deconflicting rules here // + // // + ////////////////////////////////// + + // Reduce schedCL to match requested scheduler code + if(event_have_code!=""||event_have_code2!="") { + QStringList codes; + codes << event_have_code << event_have_code2; + for(counter=0;countergetNumberOfItems();counter++) { + if(!schedCL->itemHasCodes(counter,codes)) { + schedCL->removeItem(counter); + counter--; + } + } + } + + if(schedCL->getNumberOfItems()) { // // Title separation // @@ -673,9 +677,9 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, "SERVICE_NAME=\""+RDEscapeString(svcname)+"\" && "+ QString().sprintf("SCHED_STACK_ID >= %d",stackid-titlesep); q=new RDSqlQuery(sql); - while (q->next()) { + while (q->next()) { for(counter=0;countergetNumberOfItems();counter++) { - if(q->value(0).toUInt()==schedCL->getItemCartnumber(counter)) { + if(q->value(0).toUInt()==schedCL->getItemCartNumber(counter)) { schedCL->removeItem(counter); counter--; } @@ -725,7 +729,7 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, schedCL->restore(); } - // Scheduler Codes + // Clock Scheduler Rules sql=QString("select ")+ "CODE,"+ // 00 "MAX_ROW,"+ // 01 @@ -763,8 +767,9 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, q->value(0).toString()+"\n"; } schedCL->restore(); + // do not play after - if(q->value(3).toString()!="") { + if(q->value(3).toString()!="") { schedCL->save(); QString wstr=q->value(3).toString(); wstr+=" "; @@ -787,8 +792,8 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, QObject::tr("Rule broken: Do not schedule ")+ q->value(0).toString()+" "+QObject::tr("after")+" "+ q->value(3).toString()+"\n"; + schedCL->restore(); } - schedCL->restore(); } // or after if (q->value(4).toString()!="") { @@ -813,8 +818,8 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, QObject::tr("Rule broken: Do not schedule")+" "+ q->value(0).toString()+" "+QObject::tr("after")+" "+ q->value(4).toString()+"\n"; + schedCL->restore(); } - schedCL->restore(); } // or after II if (q->value(5).toString()!="") { @@ -839,8 +844,8 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, QObject::tr("Rule broken: Do not schedule")+" "+ q->value(0).toString()+" "+QObject::tr("after")+" "+ q->value(5).toString()+"\n"; + schedCL->restore(); } - schedCL->restore(); } } delete q; @@ -864,7 +869,7 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, QString().sprintf("SOURCE=%d,",source)+ QString().sprintf("START_TIME=%d,",QTime().msecsTo(time))+ QString().sprintf("GRACE_TIME=%d,",grace_time)+ - QString().sprintf("CART_NUMBER=%u,",schedCL->getItemCartnumber(schedpos))+ + QString().sprintf("CART_NUMBER=%u,",schedCL->getItemCartNumber(schedpos))+ QString().sprintf("TIME_TYPE=%d,",time_type)+ "POST_POINT=\""+RDYesNo(post_point)+"\","+ QString().sprintf("TRANS_TYPE=%d,",trans_type)+ @@ -879,16 +884,16 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, "SERVICE_NAME=\""+RDEscapeString(svcname)+"\","+ "SCHEDULED_AT=now(),"+ QString().sprintf("SCHED_STACK_ID=%u,",stackid)+ - QString().sprintf("CART=%u,",schedCL->getItemCartnumber(schedpos))+ + QString().sprintf("CART=%u,",schedCL->getItemCartNumber(schedpos))+ "ARTIST=\""+RDEscapeString(schedCL->getItemArtist(schedpos))+"\","+ "SCHED_CODES=\""+RDEscapeString(schedCL->getItemSchedCodes(schedpos))+ "\""; q=new RDSqlQuery(sql); delete q; + delete schedCL; } - else - { + else { // We don't have any carts to work with *report+=time.toString("hh:mm:ss")+ " "+QObject::tr("No carts found in group")+" "+SchedGroup(); @@ -896,7 +901,8 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, *report+=QObject::tr(" with sched code(s): ")+HaveCode()+" "+HaveCode2(); } *report+="\n"; - delete q; + + delete schedCL; } } diff --git a/lib/schedcartlist.cpp b/lib/schedcartlist.cpp index 8b81f3f7..8c79c42b 100644 --- a/lib/schedcartlist.cpp +++ b/lib/schedcartlist.cpp @@ -18,162 +18,171 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -#include +#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; + 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; + delete []cartnum; + delete []cartlen; + delete []stackid; + delete []artist; + delete []sched_codes; } -// -// stack_schedcodes should no longer be needed. Possibly remove at a later date. P. Linstruth 01/12/2019 -// 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(" ",""); - sched_codes[itemcounter]=stack_schedcodes; - itemcounter++; + 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--; + 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); + 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; + 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); + QString test=test_code; + test+=" "; + test=test.left(11); - if (sched_codes[itemnumber].find(test)!=-1) - return true; - else - return false; + 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 +#include class SchedCartList { @@ -32,8 +33,9 @@ class SchedCartList void removeItem(int itemnumber); bool removeIfCode(int itemnumber,QString test_code); bool itemHasCode(int itemnumber,QString test_code); - unsigned getItemCartnumber(int itemnumber); - int getItemCartlength(int itemnumber); + bool itemHasCodes(int itemnumber,QStringList test_codes); + unsigned getItemCartNumber(int itemnumber); + int getItemCartLength(int itemnumber); int getItemStackid(int itemnumber); QString getItemArtist(int itemnumber); QString getItemSchedCodes(int itemnumber);