2018-07-07 Fred Gleason <fredg@paravelsystems.com>

* Added a 'CLOCK_LINES' table to the database.
	* Incremented the database version to 291.
	* Removed the 'RDClock::tableName()' method.
This commit is contained in:
Fred Gleason 2018-07-06 13:52:35 -04:00
parent bd5bd2246b
commit 0c17eb841a
15 changed files with 185 additions and 86 deletions

View File

@ -17102,3 +17102,7 @@
* Fixed a bug in rddbmgr(8) that caused the 'EVENT_LINES' * Fixed a bug in rddbmgr(8) that caused the 'EVENT_LINES'
table to be created with the incorrect engine type when using table to be created with the incorrect engine type when using
'--modify'. '--modify'.
2018-07-07 Fred Gleason <fredg@paravelsystems.com>
* Added a 'CLOCK_LINES' table to the database.
* Incremented the database version to 291.
* Removed the 'RDClock::tableName()' method.

View File

@ -27,6 +27,7 @@ EXTRA_DIST = audio_cards.txt\
cart.txt\ cart.txt\
cartslots.txt\ cartslots.txt\
clipboard.txt\ clipboard.txt\
clock_lines.txt\
clock_perms.txt\ clock_perms.txt\
copy_splits.txt\ copy_splits.txt\
cut_events.txt\ cut_events.txt\

View File

@ -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)

View File

@ -24,7 +24,7 @@
/* /*
* Current Database Version * Current Database Version
*/ */
#define RD_VERSION_DATABASE 290 #define RD_VERSION_DATABASE 291
#endif // DBVERSION_H #endif // DBVERSION_H

View File

@ -2,7 +2,7 @@
// //
// Abstract a Rivendell Log Manager Clock. // Abstract a Rivendell Log Manager Clock.
// //
// (C) Copyright 2002-2004,2008,2016 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2004,2008,2016-2018 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // 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 // 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) void RDClock::setName(const QString &name)
{ {
clock_name=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(); clock_remarks=q->value(3).toString();
delete q; delete q;
sql=QString().sprintf("select EVENT_NAME,START_TIME,LENGTH from %s_CLK\ sql=QString("select ")+
order by ID", "EVENT_NAME,"+ // 00
(const char *)clock_name_esc); "START_TIME,"+ // 01
"LENGTH "+ // 02
"from CLOCK_LINES where "+
"CLOCK_NAME=\""+RDEscapeString(clock_name)+"\" "+
"order by START_TIME";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
clock_events.push_back(RDEventLine()); clock_events.push_back(RDEventLine());
@ -186,7 +188,8 @@ bool RDClock::save()
(const char *)clock_name); (const char *)clock_name);
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
delete q; 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); q=new RDSqlQuery(sql);
delete q; delete q;
} }
@ -204,17 +207,16 @@ bool RDClock::save()
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
delete q; delete q;
} }
sql=QString().sprintf("delete from %s_CLK", sql=QString("delete from CLOCK_LINES where ")+
(const char *)clock_name_esc); "CLOCK_NAME=\""+RDEscapeString(clock_name)+"\"";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
delete q; delete q;
for(unsigned i=0;i<clock_events.size();i++) { for(unsigned i=0;i<clock_events.size();i++) {
sql=QString().sprintf("insert into %s_CLK set EVENT_NAME=\"%s\",\ sql=QString("insert into CLOCK_LINES set ")+
START_TIME=%d,LENGTH=%d", "CLOCK_NAME=\""+RDEscapeString(clock_name)+"\","+
(const char *)clock_name_esc, "EVENT_NAME=\""+RDEscapeString(clock_events[i].name())+"\","+
(const char *)clock_events[i].name(), QString().sprintf("START_TIME=%d,",QTime().msecsTo(clock_events[i].startTime()))+
QTime().msecsTo(clock_events[i].startTime()), QString().sprintf("LENGTH=%d",clock_events[i].length());
clock_events[i].length());
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
delete q; delete q;
} }
@ -307,29 +309,23 @@ bool RDClock::generateLog(int hour,const QString &logname,
RDSqlQuery *q; RDSqlQuery *q;
RDEventLine eventline; RDEventLine eventline;
sql=QString().sprintf("select EVENT_NAME,START_TIME,LENGTH from %s_CLK\ sql=QString("select ")+
order by START_TIME", "EVENT_NAME,"+ // 00
(const char *)clock_name_esc); "START_TIME,"+ // 01
"LENGTH "+ // 02
"from CLOCK_LINES where "+
"CLOCK_NAME=\""+RDEscapeString(clock_name)+"\" "+
"order by START_TIME";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
eventline.setName(q->value(0).toString()); eventline.setName(q->value(0).toString());
eventline.load(); eventline.load();
// eventline.setStartTime(q->value(1).toTime().addSecs(3600*hour));
eventline.setStartTime(QTime().addMSecs(q->value(1).toInt()). eventline.setStartTime(QTime().addMSecs(q->value(1).toInt()).
addSecs(3600*hour)); addSecs(3600*hour));
eventline.setLength(q->value(2).toInt()); 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(); eventline.clear();
} }
delete q; delete q;
return true; return true;
} }
QString RDClock::tableName(const QString &name)
{
QString ret=name;
ret.replace(" ","_");
return ret+"_CLK";
}

View File

@ -2,7 +2,7 @@
// //
// Abstract a Rivendell Log Manager Clock // Abstract a Rivendell Log Manager Clock
// //
// (C) Copyright 2002-2004,2016 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2004,2016-2018 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // 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 // 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 validate(const QTime &start_time,int length,int except_line=-1);
bool generateLog(int hour,const QString &logname,const QString &svc_name, bool generateLog(int hour,const QString &logname,const QString &svc_name,
QString *errors); QString *errors);
static QString tableName(const QString &name);
private: private:
QString clock_name; QString clock_name;
QString clock_name_esc;
QString clock_short_name; QString clock_short_name;
QColor clock_color; QColor clock_color;
QString clock_remarks; QString clock_remarks;
@ -68,4 +66,4 @@ class RDClock
bool rules_modified; bool rules_modified;
}; };
#endif #endif // RDCLOCK_H

View File

@ -33,7 +33,7 @@ void RDCreateLogTable(const QString &name,RDConfig *config)
delete q; delete q;
} }
*/ */
/*
QString RDCreateLogTableSql(QString name,RDConfig *config) QString RDCreateLogTableSql(QString name,RDConfig *config)
{ {
return QString("create table if not exists `")+name+"`"+ return QString("create table if not exists `")+name+"`"+
@ -81,8 +81,8 @@ QString RDCreateLogTableSql(QString name,RDConfig *config)
"index LABEL_IDX (LABEL))"+ "index LABEL_IDX (LABEL))"+
config->createTablePostfix(); config->createTablePostfix();
} }
*/
/*
QString RDCreateClockTableSql(QString name,RDConfig *config) QString RDCreateClockTableSql(QString name,RDConfig *config)
{ {
return QString("create table `")+name+"` ("+ return QString("create table `")+name+"` ("+
@ -93,7 +93,7 @@ QString RDCreateClockTableSql(QString name,RDConfig *config)
"INDEX EVENT_NAME_IDX (EVENT_NAME))"+ "INDEX EVENT_NAME_IDX (EVENT_NAME))"+
config->createTablePostfix(); config->createTablePostfix();
} }
*/
/* /*
QString RDCreateReconciliationTableSql(QString name,RDConfig *config) QString RDCreateReconciliationTableSql(QString name,RDConfig *config)
{ {

View File

@ -24,8 +24,8 @@
#define RDCREATE_LOG_H #define RDCREATE_LOG_H
//void RDCreateLogTable(const QString &name,RDConfig *config); //void RDCreateLogTable(const QString &name,RDConfig *config);
QString RDCreateLogTableSql(QString name,RDConfig *config); //QString RDCreateLogTableSql(QString name,RDConfig *config);
QString RDCreateClockTableSql(QString name,RDConfig *config); //QString RDCreateClockTableSql(QString name,RDConfig *config);
//QString RDCreateReconciliationTableSql(QString name,RDConfig *config); //QString RDCreateReconciliationTableSql(QString name,RDConfig *config);
QString RDCreateStackTableSql(QString name,RDConfig *config); QString RDCreateStackTableSql(QString name,RDConfig *config);

View File

@ -499,10 +499,6 @@ void EditClock::saveAsData()
} }
delete q; delete q;
edit_clock->setName(clockname); edit_clock->setName(clockname);
sql=RDCreateClockTableSql(RDClock::tableName(clockname),rda->config());
q=new RDSqlQuery(sql);
delete q;
Save(); Save();
edit_new_clocks->push_back(clockname); edit_new_clocks->push_back(clockname);
@ -766,12 +762,12 @@ void EditClock::AbandonClock(QString name)
if(name==edit_name) { if(name==edit_name) {
return; return;
} }
QString sql=QString().sprintf("delete from CLOCKS where NAME=\"%s\"", QString sql=QString("delete from CLOCKS where ")+
(const char *)name); "NAME=\""+RDEscapeString(name)+"\"";
RDSqlQuery *q=new RDSqlQuery(sql); RDSqlQuery::apply(sql);
delete q; sql=QString("delete from CLOCK_LINES where ")+
"CLOCK_NAME=\""+RDEscapeString(name)+"\"";
rda->dropTable(RDClock::tableName(name)); RDSqlQuery::apply(sql);
} }

View File

@ -214,8 +214,7 @@ QSizePolicy ListClocks::sizePolicy() const
void ListClocks::addData() void ListClocks::addData()
{ {
QString clockname; QString clockname;
QString clockname_esc;
QString sql; QString sql;
RDSqlQuery *q; RDSqlQuery *q;
RDSqlQuery *q1; RDSqlQuery *q1;
@ -243,15 +242,11 @@ void ListClocks::addData()
"ARTISTSEP=15"; "ARTISTSEP=15";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
delete q; 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); EditClock *clock_dialog=new EditClock(clockname,true,&new_clocks,this);
if(clock_dialog->exec()<0) { if(clock_dialog->exec()<0) {
clockname_esc=clockname; sql=QString("delete from CLOCK_LINES where ")+
clockname_esc.replace(" ","_"); "CLOCK_NAME=\""+RDEscapeString(clockname)+"\"";
clockname_esc+="_CLK"; RDSqlQuery::apply(sql);
rda->dropTable(clockname_esc);
sql=QString().sprintf("delete from CLOCKS where NAME=\"%s\"", sql=QString().sprintf("delete from CLOCKS where NAME=\"%s\"",
(const char *)clockname); (const char *)clockname);
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
@ -383,15 +378,15 @@ void ListClocks::renameData()
// //
// Rename Meta Table // 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); QString old_name_esc=item->text(0);
old_name_esc.replace(" ","_"); old_name_esc.replace(" ","_");
QString new_name_esc=new_name; QString new_name_esc=new_name;
new_name_esc.replace(" ","_"); 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", sql=QString().sprintf("alter table %s_RULES rename to %s_RULES",
(const char *)old_name_esc, (const char *)old_name_esc,
(const char *)new_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\"", sql=QString().sprintf("delete from CLOCKS where NAME=\"%s\"",
(const char *)clockname); (const char *)clockname);
q=new RDSqlQuery(sql); RDSqlQuery::apply(sql);
delete q; sql=QString("delete from CLOCK_LINES where ")+
rda->dropTable(base_name+"_CLK"); "CLOCK_NAME=\""+RDEscapeString(clockname)+"\"";
RDSqlQuery::apply(sql);
rda->dropTable(base_name+"_RULES"); rda->dropTable(base_name+"_RULES");
} }

View File

@ -345,11 +345,10 @@ void ListEvents::renameData()
while(q->next()) { while(q->next()) {
clock_name_esc=q->value(0).toString(); clock_name_esc=q->value(0).toString();
clock_name_esc.replace(" ","_"); clock_name_esc.replace(" ","_");
sql=QString().sprintf("update %s_CLK set EVENT_NAME=\"%s\"\ sql=QString("update CLOCK_LINES set ")+
where EVENT_NAME=\"%s\"", "CLOCK_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+
(const char *)clock_name_esc, "EVENT_NAME=\""+RDEscapeString(new_name)+"\" where "+
(const char *)new_name, "EVENT_NAME=\""+RDEscapeString(item->text(0))+"\"";
(const char *)item->text(0));
q1=new RDSqlQuery(sql); q1=new RDSqlQuery(sql);
delete q1; delete q1;
} }
@ -527,16 +526,13 @@ int ListEvents::ActiveEvents(QString event_name,QString *clock_list)
int n=0; int n=0;
QString sql; QString sql;
RDSqlQuery *q,*q1; RDSqlQuery *q,*q1;
QString clockname;
sql="select NAME from CLOCKS"; sql="select NAME from CLOCKS";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
clockname=q->value(0).toString(); sql=QString("select EVENT_NAME from CLOCK_LINES where ")+
clockname.replace(" ","_"); "CLOCK_NAME=\""+RDEscapeString(q->value(0).toString())+"\" && "+
sql=QString().sprintf("select EVENT_NAME from %s_CLK\ "EVENT_NAME=\""+RDEscapeString(event_name)+"\"";
where EVENT_NAME=\"%s\"",(const char *)clockname,
(const char *)event_name);
q1=new RDSqlQuery(sql); q1=new RDSqlQuery(sql);
if(q1->first()) { if(q1->first()) {
*clock_list+= *clock_list+=
@ -554,7 +550,6 @@ void ListEvents::DeleteEvent(QString event_name)
{ {
QString sql; QString sql;
RDSqlQuery *q,*q1; RDSqlQuery *q,*q1;
QString clockname;
QString base_name=event_name; QString base_name=event_name;
base_name.replace(" ","_"); base_name.replace(" ","_");
@ -564,11 +559,9 @@ void ListEvents::DeleteEvent(QString event_name)
sql="select NAME from CLOCKS"; sql="select NAME from CLOCKS";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
clockname=q->value(0).toString(); sql=QString("delete from CLOCK_LINES where ")+
clockname.replace(" ","_"); "CLOCK_NAME=\""+RDEscapeString(q->value(0).toString())+"\" && "+
sql=QString().sprintf("delete from %s_CLK\ "EVENT_NAME=\""+RDEscapeString(event_name)+"\"";
where EVENT_NAME=\"%s\"",(const char *)clockname,
(const char *)event_name);
q1=new RDSqlQuery(sql); q1=new RDSqlQuery(sql);
delete q1; delete q1;
} }

View File

@ -242,6 +242,10 @@ void MainObject::CheckOrphanedTracks() const
void MainObject::CheckClocks() const void MainObject::CheckClocks() const
{ {
//
// FIXME: This entire check needs to be rewritten!
//
/*
QString sql; QString sql;
QSqlQuery *q; QSqlQuery *q;
QSqlQuery *q1; QSqlQuery *q1;
@ -299,11 +303,16 @@ void MainObject::CheckClocks() const
delete q1; delete q1;
} }
delete q; delete q;
*/
} }
void MainObject::CheckEvents() const void MainObject::CheckEvents() const
{ {
//
// FIXME: This whole check needs to be rewritten!
//
/*
QString sql; QString sql;
QSqlQuery *q; QSqlQuery *q;
QSqlQuery *q1; QSqlQuery *q1;
@ -351,6 +360,7 @@ void MainObject::CheckEvents() const
delete q1; delete q1;
} }
delete q; delete q;
*/
} }

View File

@ -38,6 +38,55 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) co
// //
//
// Revert 291
//
if((cur_schema==291)&&(set_schema<cur_schema)) {
sql=QString("select NAME from CLOCKS");
q=new RDSqlQuery(sql);
while(q->next()) {
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 // 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)) { if(!RDSqlQuery::apply(sql,err_msg)) {
return false; return false;
} }
cur_schema--; cur_schema--;
} }

View File

@ -132,7 +132,7 @@ void MainObject::InitializeSchemaMap() {
global_version_map["2.17"]=268; global_version_map["2.17"]=268;
global_version_map["2.18"]=272; global_version_map["2.18"]=272;
global_version_map["2.19"]=275; global_version_map["2.19"]=275;
global_version_map["2.20"]=290; global_version_map["2.20"]=291;
} }

View File

@ -7566,6 +7566,51 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) co
} }
delete q; 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++; cur_schema++;
} }