From 0c17eb841a0a64eae32273492ffbeb127c3582e5 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Fri, 6 Jul 2018 13:52:35 -0400 Subject: [PATCH] 2018-07-07 Fred Gleason * Added a 'CLOCK_LINES' table to the database. * Incremented the database version to 291. * Removed the 'RDClock::tableName()' method. --- ChangeLog | 4 +++ docs/tables/Makefile.am | 1 + docs/tables/clock_lines.txt | 12 ++++++++ lib/dbversion.h | 2 +- lib/rdclock.cpp | 54 ++++++++++++++++------------------ lib/rdclock.h | 6 ++-- lib/rdcreate_log.cpp | 8 ++--- lib/rdcreate_log.h | 4 +-- rdlogmanager/edit_clock.cpp | 16 ++++------ rdlogmanager/list_clocks.cpp | 30 ++++++++----------- rdlogmanager/list_events.cpp | 27 +++++++---------- utils/rddbmgr/check.cpp | 10 +++++++ utils/rddbmgr/revertschema.cpp | 50 ++++++++++++++++++++++++++++++- utils/rddbmgr/schemamap.cpp | 2 +- utils/rddbmgr/updateschema.cpp | 45 ++++++++++++++++++++++++++++ 15 files changed, 185 insertions(+), 86 deletions(-) create mode 100644 docs/tables/clock_lines.txt diff --git a/ChangeLog b/ChangeLog index 96ee5e5a..05d35d8a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17102,3 +17102,7 @@ * Fixed a bug in rddbmgr(8) that caused the 'EVENT_LINES' table to be created with the incorrect engine type when using '--modify'. +2018-07-07 Fred Gleason + * Added a 'CLOCK_LINES' table to the database. + * Incremented the database version to 291. + * Removed the 'RDClock::tableName()' method. diff --git a/docs/tables/Makefile.am b/docs/tables/Makefile.am index 4ff79575..ba1c6e46 100644 --- a/docs/tables/Makefile.am +++ b/docs/tables/Makefile.am @@ -27,6 +27,7 @@ EXTRA_DIST = audio_cards.txt\ cart.txt\ cartslots.txt\ clipboard.txt\ + clock_lines.txt\ clock_perms.txt\ copy_splits.txt\ cut_events.txt\ diff --git a/docs/tables/clock_lines.txt b/docs/tables/clock_lines.txt new file mode 100644 index 00000000..e00d0d34 --- /dev/null +++ b/docs/tables/clock_lines.txt @@ -0,0 +1,12 @@ + CLOCK_LINES Table Layout for Rivendell + +The CLOCK_PERMS table holds per-line data for clocks in RDLogManager. + + +FIELD NAME TYPE REMARKS +--------------------------------------------------------------- +ID int(10) unsigned Primary key, auto increment +CLOCK_NAME char(64) From CLOCKS.NAME +EVENT_NAME char(64) From EVENTS.NAME +START_TIME int(11) +LENGTH int(11) diff --git a/lib/dbversion.h b/lib/dbversion.h index 8bfab708..7b00def7 100644 --- a/lib/dbversion.h +++ b/lib/dbversion.h @@ -24,7 +24,7 @@ /* * Current Database Version */ -#define RD_VERSION_DATABASE 290 +#define RD_VERSION_DATABASE 291 #endif // DBVERSION_H diff --git a/lib/rdclock.cpp b/lib/rdclock.cpp index e5001a92..552a0e8e 100644 --- a/lib/rdclock.cpp +++ b/lib/rdclock.cpp @@ -2,7 +2,7 @@ // // Abstract a Rivendell Log Manager Clock. // -// (C) Copyright 2002-2004,2008,2016 Fred Gleason +// (C) Copyright 2002-2004,2008,2016-2018 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 @@ -40,8 +40,6 @@ QString RDClock::name() const void RDClock::setName(const QString &name) { clock_name=name; - clock_name_esc=name; - clock_name_esc.replace(" ","_"); } @@ -151,9 +149,13 @@ bool RDClock::load() clock_remarks=q->value(3).toString(); delete q; - sql=QString().sprintf("select EVENT_NAME,START_TIME,LENGTH from %s_CLK\ - order by ID", - (const char *)clock_name_esc); + sql=QString("select ")+ + "EVENT_NAME,"+ // 00 + "START_TIME,"+ // 01 + "LENGTH "+ // 02 + "from CLOCK_LINES where "+ + "CLOCK_NAME=\""+RDEscapeString(clock_name)+"\" "+ + "order by START_TIME"; q=new RDSqlQuery(sql); while(q->next()) { clock_events.push_back(RDEventLine()); @@ -186,7 +188,8 @@ bool RDClock::save() (const char *)clock_name); q=new RDSqlQuery(sql); delete q; - sql=QString().sprintf("delete from %s_CLK",(const char *)clock_name_esc); + sql=QString("delete from CLOCK_LINES where ")+ + "CLOCK_NAME=\""+RDEscapeString(clock_name)+"\""; q=new RDSqlQuery(sql); delete q; } @@ -204,17 +207,16 @@ bool RDClock::save() q=new RDSqlQuery(sql); delete q; } - sql=QString().sprintf("delete from %s_CLK", - (const char *)clock_name_esc); + sql=QString("delete from CLOCK_LINES where ")+ + "CLOCK_NAME=\""+RDEscapeString(clock_name)+"\""; q=new RDSqlQuery(sql); delete q; for(unsigned i=0;inext()) { eventline.setName(q->value(0).toString()); eventline.load(); - // eventline.setStartTime(q->value(1).toTime().addSecs(3600*hour)); eventline.setStartTime(QTime().addMSecs(q->value(1).toInt()). addSecs(3600*hour)); eventline.setLength(q->value(2).toInt()); - eventline.generateLog(logname,svc_name,errors,artistsep,clock_name_esc); + eventline.generateLog(logname,svc_name,errors,artistsep,clock_name); eventline.clear(); } delete q; return true; } - - -QString RDClock::tableName(const QString &name) -{ - QString ret=name; - ret.replace(" ","_"); - - return ret+"_CLK"; -} diff --git a/lib/rdclock.h b/lib/rdclock.h index f9d5162b..fe1673ca 100644 --- a/lib/rdclock.h +++ b/lib/rdclock.h @@ -2,7 +2,7 @@ // // Abstract a Rivendell Log Manager Clock // -// (C) Copyright 2002-2004,2016 Fred Gleason +// (C) Copyright 2002-2004,2016-2018 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 @@ -55,11 +55,9 @@ class RDClock bool validate(const QTime &start_time,int length,int except_line=-1); bool generateLog(int hour,const QString &logname,const QString &svc_name, QString *errors); - static QString tableName(const QString &name); private: QString clock_name; - QString clock_name_esc; QString clock_short_name; QColor clock_color; QString clock_remarks; @@ -68,4 +66,4 @@ class RDClock bool rules_modified; }; -#endif +#endif // RDCLOCK_H diff --git a/lib/rdcreate_log.cpp b/lib/rdcreate_log.cpp index 804f7060..ac80cc0f 100644 --- a/lib/rdcreate_log.cpp +++ b/lib/rdcreate_log.cpp @@ -33,7 +33,7 @@ void RDCreateLogTable(const QString &name,RDConfig *config) delete q; } */ - +/* QString RDCreateLogTableSql(QString name,RDConfig *config) { return QString("create table if not exists `")+name+"`"+ @@ -81,8 +81,8 @@ QString RDCreateLogTableSql(QString name,RDConfig *config) "index LABEL_IDX (LABEL))"+ config->createTablePostfix(); } - - +*/ +/* QString RDCreateClockTableSql(QString name,RDConfig *config) { return QString("create table `")+name+"` ("+ @@ -93,7 +93,7 @@ QString RDCreateClockTableSql(QString name,RDConfig *config) "INDEX EVENT_NAME_IDX (EVENT_NAME))"+ config->createTablePostfix(); } - +*/ /* QString RDCreateReconciliationTableSql(QString name,RDConfig *config) { diff --git a/lib/rdcreate_log.h b/lib/rdcreate_log.h index b084804e..4799f339 100644 --- a/lib/rdcreate_log.h +++ b/lib/rdcreate_log.h @@ -24,8 +24,8 @@ #define RDCREATE_LOG_H //void RDCreateLogTable(const QString &name,RDConfig *config); -QString RDCreateLogTableSql(QString name,RDConfig *config); -QString RDCreateClockTableSql(QString name,RDConfig *config); +//QString RDCreateLogTableSql(QString name,RDConfig *config); +//QString RDCreateClockTableSql(QString name,RDConfig *config); //QString RDCreateReconciliationTableSql(QString name,RDConfig *config); QString RDCreateStackTableSql(QString name,RDConfig *config); diff --git a/rdlogmanager/edit_clock.cpp b/rdlogmanager/edit_clock.cpp index 327d882a..0b480318 100644 --- a/rdlogmanager/edit_clock.cpp +++ b/rdlogmanager/edit_clock.cpp @@ -499,10 +499,6 @@ void EditClock::saveAsData() } delete q; edit_clock->setName(clockname); - sql=RDCreateClockTableSql(RDClock::tableName(clockname),rda->config()); - q=new RDSqlQuery(sql); - delete q; - Save(); edit_new_clocks->push_back(clockname); @@ -766,12 +762,12 @@ void EditClock::AbandonClock(QString name) if(name==edit_name) { return; } - QString sql=QString().sprintf("delete from CLOCKS where NAME=\"%s\"", - (const char *)name); - RDSqlQuery *q=new RDSqlQuery(sql); - delete q; - - rda->dropTable(RDClock::tableName(name)); + QString sql=QString("delete from CLOCKS where ")+ + "NAME=\""+RDEscapeString(name)+"\""; + RDSqlQuery::apply(sql); + sql=QString("delete from CLOCK_LINES where ")+ + "CLOCK_NAME=\""+RDEscapeString(name)+"\""; + RDSqlQuery::apply(sql); } diff --git a/rdlogmanager/list_clocks.cpp b/rdlogmanager/list_clocks.cpp index b4a8e7ed..d012add1 100644 --- a/rdlogmanager/list_clocks.cpp +++ b/rdlogmanager/list_clocks.cpp @@ -214,8 +214,7 @@ QSizePolicy ListClocks::sizePolicy() const void ListClocks::addData() { - QString clockname; - QString clockname_esc; + QString clockname; QString sql; RDSqlQuery *q; RDSqlQuery *q1; @@ -243,15 +242,11 @@ void ListClocks::addData() "ARTISTSEP=15"; q=new RDSqlQuery(sql); delete q; - sql=RDCreateClockTableSql(RDClock::tableName(clockname),rda->config()); - q=new RDSqlQuery(sql); - delete q; EditClock *clock_dialog=new EditClock(clockname,true,&new_clocks,this); if(clock_dialog->exec()<0) { - clockname_esc=clockname; - clockname_esc.replace(" ","_"); - clockname_esc+="_CLK"; - rda->dropTable(clockname_esc); + sql=QString("delete from CLOCK_LINES where ")+ + "CLOCK_NAME=\""+RDEscapeString(clockname)+"\""; + RDSqlQuery::apply(sql); sql=QString().sprintf("delete from CLOCKS where NAME=\"%s\"", (const char *)clockname); q=new RDSqlQuery(sql); @@ -383,15 +378,15 @@ void ListClocks::renameData() // // Rename Meta Table // + sql=QString("update CLOCK_LINES set ")+ + "CLOCK_NAME=\""+RDEscapeString(new_name)+"\" where "+ + "CLOCK_NAME=\""+RDEscapeString(item->text(0))+"\""; + q=new RDSqlQuery(sql); + delete q; QString old_name_esc=item->text(0); old_name_esc.replace(" ","_"); QString new_name_esc=new_name; new_name_esc.replace(" ","_"); - sql=QString().sprintf("alter table %s_CLK rename to %s_CLK", - (const char *)old_name_esc, - (const char *)new_name_esc); - q=new RDSqlQuery(sql); - delete q; sql=QString().sprintf("alter table %s_RULES rename to %s_RULES", (const char *)old_name_esc, (const char *)new_name_esc); @@ -629,9 +624,10 @@ void ListClocks::DeleteClock(QString clockname) // sql=QString().sprintf("delete from CLOCKS where NAME=\"%s\"", (const char *)clockname); - q=new RDSqlQuery(sql); - delete q; - rda->dropTable(base_name+"_CLK"); + RDSqlQuery::apply(sql); + sql=QString("delete from CLOCK_LINES where ")+ + "CLOCK_NAME=\""+RDEscapeString(clockname)+"\""; + RDSqlQuery::apply(sql); rda->dropTable(base_name+"_RULES"); } diff --git a/rdlogmanager/list_events.cpp b/rdlogmanager/list_events.cpp index 3d7f6e7f..9607fadc 100644 --- a/rdlogmanager/list_events.cpp +++ b/rdlogmanager/list_events.cpp @@ -345,11 +345,10 @@ void ListEvents::renameData() while(q->next()) { clock_name_esc=q->value(0).toString(); clock_name_esc.replace(" ","_"); - sql=QString().sprintf("update %s_CLK set EVENT_NAME=\"%s\"\ - where EVENT_NAME=\"%s\"", - (const char *)clock_name_esc, - (const char *)new_name, - (const char *)item->text(0)); + sql=QString("update CLOCK_LINES set ")+ + "CLOCK_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+ + "EVENT_NAME=\""+RDEscapeString(new_name)+"\" where "+ + "EVENT_NAME=\""+RDEscapeString(item->text(0))+"\""; q1=new RDSqlQuery(sql); delete q1; } @@ -527,16 +526,13 @@ int ListEvents::ActiveEvents(QString event_name,QString *clock_list) int n=0; QString sql; RDSqlQuery *q,*q1; - QString clockname; sql="select NAME from CLOCKS"; q=new RDSqlQuery(sql); while(q->next()) { - clockname=q->value(0).toString(); - clockname.replace(" ","_"); - sql=QString().sprintf("select EVENT_NAME from %s_CLK\ - where EVENT_NAME=\"%s\"",(const char *)clockname, - (const char *)event_name); + sql=QString("select EVENT_NAME from CLOCK_LINES where ")+ + "CLOCK_NAME=\""+RDEscapeString(q->value(0).toString())+"\" && "+ + "EVENT_NAME=\""+RDEscapeString(event_name)+"\""; q1=new RDSqlQuery(sql); if(q1->first()) { *clock_list+= @@ -554,7 +550,6 @@ void ListEvents::DeleteEvent(QString event_name) { QString sql; RDSqlQuery *q,*q1; - QString clockname; QString base_name=event_name; base_name.replace(" ","_"); @@ -564,11 +559,9 @@ void ListEvents::DeleteEvent(QString event_name) sql="select NAME from CLOCKS"; q=new RDSqlQuery(sql); while(q->next()) { - clockname=q->value(0).toString(); - clockname.replace(" ","_"); - sql=QString().sprintf("delete from %s_CLK\ - where EVENT_NAME=\"%s\"",(const char *)clockname, - (const char *)event_name); + sql=QString("delete from CLOCK_LINES where ")+ + "CLOCK_NAME=\""+RDEscapeString(q->value(0).toString())+"\" && "+ + "EVENT_NAME=\""+RDEscapeString(event_name)+"\""; q1=new RDSqlQuery(sql); delete q1; } diff --git a/utils/rddbmgr/check.cpp b/utils/rddbmgr/check.cpp index 3a2a644d..7321dce9 100644 --- a/utils/rddbmgr/check.cpp +++ b/utils/rddbmgr/check.cpp @@ -242,6 +242,10 @@ void MainObject::CheckOrphanedTracks() const void MainObject::CheckClocks() const { + // + // FIXME: This entire check needs to be rewritten! + // + /* QString sql; QSqlQuery *q; QSqlQuery *q1; @@ -299,11 +303,16 @@ void MainObject::CheckClocks() const delete q1; } delete q; + */ } void MainObject::CheckEvents() const { + // + // FIXME: This whole check needs to be rewritten! + // + /* QString sql; QSqlQuery *q; QSqlQuery *q1; @@ -351,6 +360,7 @@ void MainObject::CheckEvents() const delete q1; } delete q; + */ } diff --git a/utils/rddbmgr/revertschema.cpp b/utils/rddbmgr/revertschema.cpp index fa0cb2ea..b08cc649 100644 --- a/utils/rddbmgr/revertschema.cpp +++ b/utils/rddbmgr/revertschema.cpp @@ -38,6 +38,55 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) co // + // + // Revert 291 + // + if((cur_schema==291)&&(set_schemanext()) { + QString tablename=q->value(0).toString()+"_CLK"; + tablename.replace(" ","_"); + sql=QString("create table `")+tablename+"` ("+ + "ID int unsigned auto_increment not null primary key,"+ + "EVENT_NAME char(64) not null,"+ + "START_TIME int not null,"+ + "LENGTH int not null,"+ + "INDEX EVENT_NAME_IDX (EVENT_NAME))"+ + db_table_create_postfix; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + sql=QString("select ")+ + "EVENT_NAME,"+ // 00 + "START_TIME,"+ // 01 + "LENGTH "+ // 02 + "from CLOCK_LINES where "+ + "CLOCK_NAME=\""+RDEscapeString(q->value(0).toString())+"\" "+ + "order by START_TIME"; + q1=new RDSqlQuery(sql); + while(q1->next()) { + sql=QString("insert into `")+tablename+"` set "+ + "EVENT_NAME=\""+RDEscapeString(q1->value(0).toString())+"\","+ + QString().sprintf("START_TIME=%d,",q1->value(1).toInt())+ + QString().sprintf("LENGTH=%d",q1->value(2).toInt()); + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + } + delete q1; + } + delete q; + + sql=QString("drop table CLOCK_LINES"); + RDSqlQuery::apply(sql); + + cur_schema--; + } + + + // // Revert 290 // @@ -202,7 +251,6 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) co if(!RDSqlQuery::apply(sql,err_msg)) { return false; } - cur_schema--; } diff --git a/utils/rddbmgr/schemamap.cpp b/utils/rddbmgr/schemamap.cpp index ee6857fd..1f67386a 100644 --- a/utils/rddbmgr/schemamap.cpp +++ b/utils/rddbmgr/schemamap.cpp @@ -132,7 +132,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["2.20"]=290; + global_version_map["2.20"]=291; } diff --git a/utils/rddbmgr/updateschema.cpp b/utils/rddbmgr/updateschema.cpp index 0dcd3732..57725da9 100644 --- a/utils/rddbmgr/updateschema.cpp +++ b/utils/rddbmgr/updateschema.cpp @@ -7566,6 +7566,51 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) co } delete q; + cur_schema++; + } + + if((cur_schema<291)&&(set_schema>cur_schema)) { + sql=QString("create table if not exists CLOCK_LINES (")+ + "ID int unsigned auto_increment not null primary key,"+ + "CLOCK_NAME char(64) not null,"+ + "EVENT_NAME char(64) not null,"+ + "START_TIME int not null,"+ + "LENGTH int not null,"+ + "unique index CLOCK_NAME_START_TIME_IDX (CLOCK_NAME,START_TIME))"+ + db_table_create_postfix; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + sql=QString("select NAME from CLOCKS"); + q=new RDSqlQuery(sql); + while(q->next()) { + QString tablename=q->value(0).toString()+"_CLK"; + tablename.replace(" ","_"); + sql=QString("select ")+ + "EVENT_NAME,"+ // 00 + "START_TIME,"+ // 01 + "LENGTH "+ // 02 + "from `"+tablename+"` "+ + "order by START_TIME"; + q1=new RDSqlQuery(sql); + while(q1->next()) { + sql=QString("insert into CLOCK_LINES set ")+ + "CLOCK_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+ + "EVENT_NAME=\""+RDEscapeString(q1->value(0).toString())+"\","+ + QString().sprintf("START_TIME=%d,",q1->value(1).toInt())+ + QString().sprintf("LENGTH=%d",q1->value(2).toInt()); + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + } + delete q1; + sql=QString("drop table `")+tablename+"`"; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + } + delete q; cur_schema++; }