From 3ed7a7ca6f9ab8bff361be9a64022eaf7f09575d Mon Sep 17 00:00:00 2001 From: Patrick Linstruth Date: Tue, 13 Nov 2018 13:16:26 -0800 Subject: [PATCH] Move 'CART.SCHED_CODES' field to 'CART_SCHED_CODES' table. --- ChangeLog | 4 +++ docs/tables/cart_sched_codes.txt | 10 ++++++ lib/dbversion.h | 2 +- lib/rdcart.cpp | 57 ++++++++++++++++++++++---------- lib/rdcart_dialog.cpp | 6 ++-- lib/rdcart_search_text.cpp | 31 +++++++++-------- lib/rdcut_dialog.cpp | 2 +- lib/rdevent_line.cpp | 7 ++-- rdlibrary/list_reports.cpp | 24 +++++--------- rdlibrary/rdlibrary.cpp | 6 ++-- rdlogmanager/edit_event.cpp | 3 +- utils/rddbmgr/revertschema.cpp | 23 +++++++++++++ utils/rddbmgr/schemamap.cpp | 2 +- utils/rddbmgr/updateschema.cpp | 24 ++++++++++++++ web/rdxport/carts.cpp | 2 +- 15 files changed, 140 insertions(+), 63 deletions(-) create mode 100644 docs/tables/cart_sched_codes.txt diff --git a/ChangeLog b/ChangeLog index 5f24eb81..6b4e6877 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18007,3 +18007,7 @@ * Fixed a regression in rdpanel(1) background image. 2018-11-09 Fred Gleason * Removed a debugging printf in rdpanel(1). +2018-11-13 Patrick Linstruth + * Added a 'CART_SCHED_CODES' table to the database. + * Removed 'SCHED_CODES' field from 'CART' + * Incremented the database version to 299. diff --git a/docs/tables/cart_sched_codes.txt b/docs/tables/cart_sched_codes.txt new file mode 100644 index 00000000..ae28590c --- /dev/null +++ b/docs/tables/cart_sched_codes.txt @@ -0,0 +1,10 @@ + CART_SCHED_CODES Table Layout for Rivendell + +The CART_SCHED_CODES table holds the scheduler codes for carts. + +FIELD NAME TYPE REMARKS +------------------------------------------------------------------------- +ID int(11) Primary Key, Not Null, Unique + Auto-Increment +CART_NUMBER int(11) From CART.NUMBER +SCHED_CODE varchar(11) diff --git a/lib/dbversion.h b/lib/dbversion.h index 6e69779d..604ac29b 100644 --- a/lib/dbversion.h +++ b/lib/dbversion.h @@ -24,7 +24,7 @@ /* * Current Database Version */ -#define RD_VERSION_DATABASE 298 +#define RD_VERSION_DATABASE 299 #endif // DBVERSION_H diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index 2e1b90aa..9cf8dbb3 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -260,21 +260,21 @@ void RDCart::setYear(int year) QString RDCart::schedCodes() const { - return RDGetSqlValue("CART","NUMBER",cart_number,"SCHED_CODES").toString(); + QString sched_codes=""; + + QStringList list = schedCodesList(); + + for(int i=0;inext()) { + list.push_back(q->value(0).toString()); + } return list; } @@ -289,13 +303,19 @@ QStringList RDCart::schedCodesList() const void RDCart::setSchedCodesList(const QStringList &codes) const { + RDSqlQuery *q; + QString sql; QString sched_codes=""; + + sql=QString().sprintf("delete from CART_SCHED_CODES where CART_NUMBER=%u",cart_number); + q=new RDSqlQuery(sql); + delete q; for(int i=0;inext()) { QString wstr=q->value(0).toString(); wstr+=" "; - wstr=wstr.left(11); + wstr=wstr.left(11); if((sched_codes.contains(wstr)>0||add_codes.contains(wstr)>0)&&remove_codes.contains(wstr)==0) { - save_codes+=wstr; + save_codes.push_back(wstr.stripWhiteSpace()); } } delete q; - - save_codes+="."; - SetRow("SCHED_CODES",save_codes); + setSchedCodesList(save_codes); } @@ -1608,6 +1626,9 @@ bool RDCart::removeCart(unsigned cart_num,RDStation *station,RDUser *user, sql=QString().sprintf("delete from CUTS where CART_NUMBER=%u",cart_num); q=new RDSqlQuery(sql); delete q; + sql=QString().sprintf("delete from CART_SCHED_CODES where CART_NUMBER=%u",cart_num); + q=new RDSqlQuery(sql); + delete q; sql=QString().sprintf("delete from REPL_CART_STATE where CART_NUMBER=%u", cart_num); q=new RDSqlQuery(sql); diff --git a/lib/rdcart_dialog.cpp b/lib/rdcart_dialog.cpp index ee09a6eb..69e8a709 100644 --- a/lib/rdcart_dialog.cpp +++ b/lib/rdcart_dialog.cpp @@ -703,7 +703,7 @@ void RDCartDialog::RefreshCarts() "CART.GROUP_NAME,"+ // 12 "GROUPS.COLOR "+ // 13 "from CART left join GROUPS "+ - "on CART.GROUP_NAME=GROUPS.NAME where "+ + "on CART.GROUP_NAME=GROUPS.NAME "+ GetSearchFilter(cart_filter_edit->text(),group,schedcode); } else { @@ -723,8 +723,8 @@ void RDCartDialog::RefreshCarts() "CART.GROUP_NAME,"+ // 12 "GROUPS.COLOR "+ // 13 "from CART left join GROUPS "+ - "on CART.GROUP_NAME=GROUPS.NAME where "+ - "("+GetSearchFilter(cart_filter_edit->text(),group,schedcode)+")&&"+ + "on CART.GROUP_NAME=GROUPS.NAME "+ + GetSearchFilter(cart_filter_edit->text(),group,schedcode)+"&&"+ QString().sprintf("(TYPE=%d)",cart_type); } if(cart_limit_box->isChecked()) { diff --git a/lib/rdcart_search_text.cpp b/lib/rdcart_search_text.cpp index 89aaff8e..59941c1f 100644 --- a/lib/rdcart_search_text.cpp +++ b/lib/rdcart_search_text.cpp @@ -103,20 +103,29 @@ QString RDBaseSearchText(QString filter,bool incl_cuts) return ret; } +QString RDSchedSearchText(const QString &schedcode) +{ + QString ret=""; + + if(!schedcode.isEmpty()) { + ret+=QString(" inner join CART_SCHED_CODES on CART.NUMBER=CART_SCHED_CODES.CART_NUMBER and CART_SCHED_CODES.SCHED_CODE=\"")+RDEscapeString(schedcode)+"\" "; + } + + return ret; +} + QString RDCartSearchText(QString filter,const QString &group, const QString &schedcode,bool incl_cuts) { - QString ret=QString(" ")+RDBaseSearchText(filter,incl_cuts); + QString ret=""; + + ret+=RDSchedSearchText(schedcode); + ret+=QString(" where ")+RDBaseSearchText(filter,incl_cuts); if(!group.isEmpty()) { ret+=QString("&&(CART.GROUP_NAME=\"")+RDEscapeString(group)+"\")"; } - if(!schedcode.isEmpty()) { - QString code=schedcode+" "; - code=code.left(11); - ret+=QString("&&(SCHED_CODES like \"%")+RDEscapeString(code)+"%\")"; - } return ret; } @@ -126,8 +135,10 @@ QString RDAllCartSearchText(const QString &filter,const QString &schedcode, { QString sql; RDSqlQuery *q; - QString search="("; + QString search=""; + search+=RDSchedSearchText(schedcode); + search+=" where ("; sql=QString("select GROUP_NAME from USER_PERMS where ")+ "USER_NAME=\""+RDEscapeString(user)+"\""; q=new RDSqlQuery(sql); @@ -139,11 +150,5 @@ QString RDAllCartSearchText(const QString &filter,const QString &schedcode, search=search.left(search.length()-2)+QString(")"); search+=QString("&&")+RDBaseSearchText(filter,incl_cuts); - if(!schedcode.isEmpty()) { - QString code=schedcode+" "; - code=code.left(11); - search+=QString("&&(SCHED_CODES like \"%%")+RDEscapeString(code)+"%%\")"; - } - return search; } diff --git a/lib/rdcut_dialog.cpp b/lib/rdcut_dialog.cpp index 7d0ea822..2ad559df 100644 --- a/lib/rdcut_dialog.cpp +++ b/lib/rdcut_dialog.cpp @@ -489,7 +489,7 @@ void RDCutDialog::RefreshCarts() sql=QString().sprintf("select CART.NUMBER,CART.TITLE,CART.GROUP_NAME,\ GROUPS.COLOR,CART.TYPE from CART left join GROUPS \ on CART.GROUP_NAME=GROUPS.NAME \ - where (%s)&&((CART.TYPE=%u))", + %s&&(CART.TYPE=%u)", (const char *)RDCartSearchText(cut_filter_edit->text(), group,schedcode.utf8(), false), diff --git a/lib/rdevent_line.cpp b/lib/rdevent_line.cpp index 8423c541..5e2ba6b1 100644 --- a/lib/rdevent_line.cpp +++ b/lib/rdevent_line.cpp @@ -594,8 +594,7 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, sql=QString("select ")+ "NUMBER,"+ - "ARTIST,"+ - "SCHED_CODES "+ + "ARTIST "+ "from CART where "+ "GROUP_NAME=\""+RDEscapeString(SchedGroup())+"\""; q=new RDSqlQuery(sql); @@ -617,7 +616,9 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, for(counter=0;counterseek(counter); - schedCL->insertItem(q->value(0).toUInt(),0,0,q->value(1).toString(),q->value(2).toString()); + RDCart *cart=new RDCart(q->value(0).toUInt()); + schedCL->insertItem(q->value(0).toUInt(),0,0,q->value(1).toString(),cart->schedCodes()); + delete cart; } delete q; diff --git a/rdlibrary/list_reports.cpp b/rdlibrary/list_reports.cpp index 2b4ea798..5ecf8a80 100644 --- a/rdlibrary/list_reports.cpp +++ b/rdlibrary/list_reports.cpp @@ -215,13 +215,11 @@ void ListReports::GenerateCartReport(QString *report) "from CART left join CUTS on "+ "CART.NUMBER=CUTS.CART_NUMBER "; if(list_group==QString("ALL")) { - sql+=QString(" where ")+ - RDAllCartSearchText(list_filter,schedcode,rda->user()->name(),true)+" && "+ + sql+=RDAllCartSearchText(list_filter,schedcode,rda->user()->name(),true)+" && "+ list_type_filter+" order by NUMBER"; } else { - sql+=QString(" where ")+ - RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+ + sql+=RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+ list_type_filter+" order by NUMBER"; } q=new RDSqlQuery(sql); @@ -376,13 +374,11 @@ void ListReports::GenerateCutReport(QString *report) "from CART join CUTS "+ "on CART.NUMBER=CUTS.CART_NUMBER "; if(list_group==QString("ALL")) { - sql+=QString(" where ")+ - RDAllCartSearchText(list_filter,schedcode,rda->user()->name(),true)+" && "+ + sql+=RDAllCartSearchText(list_filter,schedcode,rda->user()->name(),true)+" && "+ list_type_filter+" order by CART.NUMBER"; } else { - sql+=QString(" where ")+ - RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+ + sql+=RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+ list_type_filter+" order by CART.NUMBER"; } q=new RDSqlQuery(sql); @@ -587,13 +583,11 @@ void ListReports::GenerateCartDumpFixed(QString *report,bool prepend_names) "from CART join CUTS "+ "on CART.NUMBER=CUTS.CART_NUMBER "; if(list_group==QString("ALL")) { - sql+=QString(" where ")+ - RDAllCartSearchText(list_filter,schedcode,rda->user()->name(),true)+" && "+ + sql+=RDAllCartSearchText(list_filter,schedcode,rda->user()->name(),true)+" && "+ list_type_filter+" order by CUTS.CUT_NAME"; } else { - sql+=QString(" where ")+ - RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+ + sql+=RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+ list_type_filter+" order by CUTS.CUT_NAME"; } q=new RDSqlQuery(sql); @@ -755,13 +749,11 @@ void ListReports::GenerateCartDumpCsv(QString *report,bool prepend_names) "from CART left join CUTS "+ "on CART.NUMBER=CUTS.CART_NUMBER "; if(list_group==QString("ALL")) { - sql+=QString(" where ")+ - RDAllCartSearchText(list_filter,schedcode,rda->user()->name(),true)+" && "+ + sql+=RDAllCartSearchText(list_filter,schedcode,rda->user()->name(),true)+" && "+ list_type_filter+" order by CART.NUMBER,CUTS.CUT_NAME"; } else { - sql+=QString(" where ")+ - RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+ + sql+=RDCartSearchText(list_filter,list_group,schedcode,true)+" && "+ list_type_filter+" order by CART.NUMBER,CUTS.CUT_NAME"; } q=new RDSqlQuery(sql); diff --git a/rdlibrary/rdlibrary.cpp b/rdlibrary/rdlibrary.cpp index 4a951fec..fefc3794 100644 --- a/rdlibrary/rdlibrary.cpp +++ b/rdlibrary/rdlibrary.cpp @@ -1411,14 +1411,12 @@ QString MainWidget::WhereClause() const schedcode=lib_codes_box->currentText(); } if(lib_group_box->currentText()==QString(tr("ALL"))) { - sql+=QString(" where ")+ - RDAllCartSearchText(lib_filter_edit->text(),schedcode, + sql+=RDAllCartSearchText(lib_filter_edit->text(),schedcode, rda->user()->name(),true)+" && "+type_filter; } else { - sql+=QString(" where ")+ - RDCartSearchText(lib_filter_edit->text(),lib_group_box->currentText(), + sql+=RDCartSearchText(lib_filter_edit->text(),lib_group_box->currentText(), schedcode,true)+" && "+type_filter; } diff --git a/rdlogmanager/edit_event.cpp b/rdlogmanager/edit_event.cpp index 126e322e..e5f374e8 100644 --- a/rdlogmanager/edit_event.cpp +++ b/rdlogmanager/edit_event.cpp @@ -1289,8 +1289,7 @@ void EditEvent::RefreshLibrary() if(group==QString(tr("ALL"))) { group=""; } - sql+=QString(" where ")+ - RDCartSearchText(event_lib_filter_edit->text(),group,"",false)+" && "+ + sql+=RDCartSearchText(event_lib_filter_edit->text(),group,"",false)+" && "+ type_filter; RDSqlQuery *q=new RDSqlQuery(sql); Q3ListViewItem *item; diff --git a/utils/rddbmgr/revertschema.cpp b/utils/rddbmgr/revertschema.cpp index 33abfea7..5ade7f68 100644 --- a/utils/rddbmgr/revertschema.cpp +++ b/utils/rddbmgr/revertschema.cpp @@ -40,6 +40,29 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) // NEW SCHEMA REVERSIONS GO HERE... + // + // Revert 299 + // + if((cur_schema==299)&&(set_schemanext()) { + schedcode=QString().sprintf("%-11s",(const char *)q->value(1).toString()); + q1=new RDSqlQuery(QString().sprintf("update CART set SCHED_CODES=CONCAT(\"%s\",SCHED_CODES) where NUMBER=%d",(const char *)schedcode,q->value(0).toUInt()),false); + delete q1; + } + delete q; + + q=new RDSqlQuery("drop table CART_SCHED_CODES",false); + delete q; + + WriteSchemaVersion(--cur_schema); + } + // // Revert 298 // diff --git a/utils/rddbmgr/schemamap.cpp b/utils/rddbmgr/schemamap.cpp index d661e9f9..71f1a52c 100644 --- a/utils/rddbmgr/schemamap.cpp +++ b/utils/rddbmgr/schemamap.cpp @@ -140,7 +140,7 @@ void MainObject::InitializeSchemaMap() { global_version_map["2.17"]=268; global_version_map["2.18"]=272; global_version_map["2.19"]=275; - global_version_map["3.0"]=298; + global_version_map["3.0"]=299; } diff --git a/utils/rddbmgr/updateschema.cpp b/utils/rddbmgr/updateschema.cpp index 9ca2289b..f1fb47d7 100644 --- a/utils/rddbmgr/updateschema.cpp +++ b/utils/rddbmgr/updateschema.cpp @@ -9803,6 +9803,30 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) // NEW SCHEMA UPDATES GO HERE... + if((cur_schema<299)&&(set_schema>cur_schema)) { + sql=QString("create table if not exists CART_SCHED_CODES (")+ + "ID int auto_increment not null primary key,"+ + "CART_NUMBER int unsigned not null default 0,"+ + "SCHED_CODE varchar(11) not null,"+ + "index SCHED_CODE_IDX (CART_NUMBER,SCHED_CODE))"+ + " charset utf8mb4 collate utf8mb4_general_ci"+ + db_table_create_postfix; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + q=new RDSqlQuery("select NUMBER,SCHED_CODES from CART where TYPE=1",false); + while(q->next()) { + cart=new RDCart(q->value(0).toUInt()); + cart->setSchedCodes(q->value(1).toString()); + } + delete q; + + q=new RDSqlQuery("alter table CART drop column SCHED_CODES",false); + delete q; + + WriteSchemaVersion(++cur_schema); + } // // Maintainer's Note: diff --git a/web/rdxport/carts.cpp b/web/rdxport/carts.cpp index f64d5940..0eebe7f6 100644 --- a/web/rdxport/carts.cpp +++ b/web/rdxport/carts.cpp @@ -164,7 +164,7 @@ void Xport::ListCarts() if(cart_type!=RDCart::All) { where+=QString().sprintf("&&(TYPE=%u)",cart_type); } - sql=RDCart::xmlSql(include_cuts)+"where "+where+" order by CART.NUMBER"; + sql=RDCart::xmlSql(include_cuts)+where+" order by CART.NUMBER"; q=new RDSqlQuery(sql); //