2016-04-25 Fred Gleason <fredg@paravelsystems.com>

* Added a 'Cut Log' report in 'lib/export_cutlog.cpp'.
	* Added 'DESCRIPTION' and 'OUTCUE' fields to the '_SRT' table
	schema.
	* Incremented the database version to 255.
This commit is contained in:
Fred Gleason 2016-04-25 17:47:22 -04:00
parent c837ab24ae
commit 512d1a2575
21 changed files with 344 additions and 89 deletions

View File

@ -15077,3 +15077,8 @@
'rlm/rlm_walltime.c'. 'rlm/rlm_walltime.c'.
2016-04-25 Fred Gleason <fredg@paravelsystems.com> 2016-04-25 Fred Gleason <fredg@paravelsystems.com>
* Fixed a regression in 'ripcd/btsrc16.cpp' that broke RML processing. * Fixed a regression in 'ripcd/btsrc16.cpp' that broke RML processing.
2016-04-25 Fred Gleason <fredg@paravelsystems.com>
* Added a 'Cut Log' report in 'lib/export_cutlog.cpp'.
* Added 'DESCRIPTION' and 'OUTCUE' fields to the '_SRT' table
schema.
* Incremented the database version to 255.

View File

@ -22,6 +22,8 @@ CONDUCTOR char(64) From CART.CONDUCTOR
USER_DEFINED char(255) From CART.USER_DEFINED USER_DEFINED char(255) From CART.USER_DEFINED
SONG_ID char(32) From CART.SONG_ID SONG_ID char(32) From CART.SONG_ID
USAGE_CODE int From CART.USAGE_CODE USAGE_CODE int From CART.USAGE_CODE
DESCRIPTION char(64) From CUTS.DESCRIPTION
OUTCUE char(64) From CUTS.OUTCUE
ISRC char(12) From CUTS.ISRC ISRC char(12) From CUTS.ISRC
ISCI char(32) From CUTS.ISCI ISCI char(32) From CUTS.ISCI
STATION_NAME char(64) From STATIONS.NAME STATION_NAME char(64) From STATIONS.NAME

View File

@ -2,9 +2,7 @@
## ##
## Automake.am for rivendell/lib ## Automake.am for rivendell/lib
## ##
## (C) Copyright 2002-2006 Fred Gleason <fredg@paravelsystems.com> ## (C) Copyright 2002-2016 Fred Gleason <fredg@paravelsystems.com>
##
## $Id: Makefile.am,v 1.132.4.15.2.3 2014/05/28 21:21:39 cvs Exp $
## ##
## 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
@ -52,6 +50,7 @@ lib_LTLIBRARIES = librd.la
dist_librd_la_SOURCES = dbversion.h\ dist_librd_la_SOURCES = dbversion.h\
gpio.h\ gpio.h\
export_bmiemr.cpp\ export_bmiemr.cpp\
export_cutlog.cpp\
export_deltaflex.cpp\ export_deltaflex.cpp\
export_musicclassical.cpp\ export_musicclassical.cpp\
export_musicplayout.cpp\ export_musicplayout.cpp\

View File

@ -2,9 +2,7 @@
// //
// The Current Database Schema Version for Rivendell // The Current Database Schema Version for Rivendell
// //
// (C) Copyright 2002-2008 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2016 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: dbversion.h,v 1.34.4.29.2.4 2014/06/03 18:23:34 cvs Exp $
// //
// 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
@ -26,7 +24,7 @@
/* /*
* Current Database Version * Current Database Version
*/ */
#define RD_VERSION_DATABASE 254 #define RD_VERSION_DATABASE 255
#endif // DBVERSION_H #endif // DBVERSION_H

136
lib/export_cutlog.cpp Normal file
View File

@ -0,0 +1,136 @@
// export_cutlog.cpp
//
// Export a Rivendell Cut Report.
//
// (C) Copyright 2002-2016 Fred Gleason <fredg@paravelsystems.com>
//
// 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 <stdio.h>
#include <qfile.h>
#include <qmessagebox.h>
#include <rddb.h>
#include <rdlog_line.h>
#include <rdairplay_conf.h>
#include <rdconf.h>
#include <rddatedecode.h>
#include <rdreport.h>
bool RDReport::ExportCutLog(const QDate &startdate,const QDate &enddate,
const QString &mixtable)
{
QString sql;
RDSqlQuery *q;
FILE *f;
QString cut;
QString str;
QString cart_fmt;
QString cart_num;
#ifdef WIN32
QString filename=RDDateDecode(exportPath(RDReport::Windows),startdate);
#else
QString filename=RDDateDecode(exportPath(RDReport::Linux),startdate);
#endif
QFile file(filename);
if((f=fopen((const char *)filename,"w"))==NULL) {
report_error_code=RDReport::ErrorCantOpen;
return false;
}
if(useLeadingZeros()) {
cart_fmt=QString().sprintf("%%0%uu",cartDigits());
}
else {
cart_fmt="%6u";
}
sql=QString("select ")+
"`"+mixtable+"_SRT`.LENGTH,"+ // 00
"`"+mixtable+"_SRT`.CART_NUMBER,"+ // 01
"`"+mixtable+"_SRT`.EVENT_DATETIME,"+ // 02
"`"+mixtable+"_SRT`.EVENT_TYPE,"+ // 03
"`"+mixtable+"_SRT`.EXT_START_TIME,"+ // 04
"`"+mixtable+"_SRT`.EXT_LENGTH,"+ // 05
"`"+mixtable+"_SRT`.EXT_DATA,"+ // 06
"`"+mixtable+"_SRT`.EXT_EVENT_ID,"+ // 07
"`"+mixtable+"_SRT`.TITLE,"+ // 08
"CART.FORCED_LENGTH,"+ // 09
"`"+mixtable+"_SRT`.STATION_NAME,"+ // 10
"`"+mixtable+"_SRT`.PLAY_SOURCE,"+ // 11
"`"+mixtable+"_SRT`.CUT_NUMBER,"+ // 12
"`"+mixtable+"_SRT`.DESCRIPTION "+ // 13
"from `"+mixtable+"_SRT` left join CART "+
"on `"+mixtable+"_SRT`.CART_NUMBER=CART.NUMBER "+
"order by EVENT_DATETIME";
q=new RDSqlQuery(sql);
//
// Write File Header
//
if(startdate==enddate) {
fprintf(f," Rivendell RDAirPlay Cut Report for %s\n",
(const char *)startdate.toString("MM/dd/yyyy"));
}
else {
fprintf(f," Rivendell RDAirPlay Cut Report for %s - %s\n",
(const char *)startdate.toString("MM/dd/yyyy"),
(const char *)enddate.toString("MM/dd/yyyy"));
}
str=QString().sprintf("%s -- %s\n",(const char *)name(),
(const char *)description());
for(unsigned i=0;i<(80-str.length())/2;i++) {
fprintf(f," ");
}
fprintf(f,"%s\n",(const char *)str);
fprintf(f,"--Time-- -Cart- --Title---------------- Cut --Description------- -Len-\n");
//
// Write Data Rows
//
while(q->next()) {
if(q->value(12).toInt()>0) {
cut=QString().sprintf("%03d",q->value(12).toInt());
}
else {
if((RDAirPlayConf::TrafficAction)q->value(3).toInt()==
RDAirPlayConf::TrafficMacro) {
cut="rml";
}
else {
cut=" ";
}
}
cart_num=QString().sprintf(cart_fmt,q->value(1).toUInt());
QString desc=q->value(13).toString();
if(desc.isEmpty()) {
desc=" ";
}
fprintf(f,"%8s %6s %-23s %3s %-20s %5s",
(const char *)q->value(2).toTime().toString("hh:mm:ss"),
(const char *)cart_num,
(const char *)q->value(8).toString().left(23),
(const char *)cut,
(const char *)desc.left(20),
(const char *)RDGetTimeLength(q->value(9).toInt(),true,false).
right(5));
fprintf(f,"\n");
}
delete q;
fclose(f);
report_error_code=RDReport::ErrorOk;
return true;
}

View File

@ -427,6 +427,10 @@
<source>Spin Count</source> <source>Spin Count</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Cut Log</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RDAddCart</name> <name>RDAddCart</name>

View File

@ -423,6 +423,10 @@
<source>Spin Count</source> <source>Spin Count</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Cut Log</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RDAddCart</name> <name>RDAddCart</name>

View File

@ -423,6 +423,10 @@
<source>Spin Count</source> <source>Spin Count</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Cut Log</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RDAddCart</name> <name>RDAddCart</name>

View File

@ -409,6 +409,10 @@
<source>Spin Count</source> <source>Spin Count</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Cut Log</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RDAddCart</name> <name>RDAddCart</name>

View File

@ -423,6 +423,10 @@
<source>Spin Count</source> <source>Spin Count</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Cut Log</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RDAddCart</name> <name>RDAddCart</name>

View File

@ -423,6 +423,10 @@
<source>Spin Count</source> <source>Spin Count</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Cut Log</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RDAddCart</name> <name>RDAddCart</name>

View File

@ -423,6 +423,10 @@
<source>Spin Count</source> <source>Spin Count</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Cut Log</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>RDAddCart</name> <name>RDAddCart</name>

View File

@ -670,46 +670,50 @@ void RDCartSlot::LogPlayout(RDPlayDeck::State state)
length+=86400000; length+=86400000;
datetime.setDate(datetime.date().addDays(-1)); datetime.setDate(datetime.date().addDays(-1));
} }
QString svctablename=slot_svcname; if(!slot_svcname.isEmpty()) {
svctablename.replace(" ","_"); QString svctablename=slot_svcname;
sql=QString("insert into `")+svctablename+"_SRT` set "+ svctablename.replace(" ","_");
QString().sprintf("LENGTH=%d,LOG_ID=%d,CART_NUMBER=%u,EVENT_TYPE=%d,\ sql=QString("insert into `")+svctablename+"_SRT` set "+
EVENT_SOURCE=%d,EXT_LENGTH=%d,PLAY_SOURCE=%d,\ QString().sprintf("LENGTH=%d,LOG_ID=%d,CART_NUMBER=%u,EVENT_TYPE=%d,\
EVENT_SOURCE=%d,EXT_LENGTH=%d,PLAY_SOURCE=%d, \
CUT_NUMBER=%d,USAGE_CODE=%d,START_SOURCE=%d,", CUT_NUMBER=%d,USAGE_CODE=%d,START_SOURCE=%d,",
length, length,
slot_number+1, slot_number+1,
slot_logline->cartNumber(), slot_logline->cartNumber(),
action, action,
slot_logline->source(), slot_logline->source(),
slot_logline->extLength(), slot_logline->extLength(),
RDLogLine::CartSlot, RDLogLine::CartSlot,
slot_logline->cutNumber(), slot_logline->cutNumber(),
slot_logline->usageCode(), slot_logline->usageCode(),
slot_logline->startSource())+ slot_logline->startSource())+
"STATION_NAME=\""+RDEscapeString(slot_station->name())+"\","+ "STATION_NAME=\""+RDEscapeString(slot_station->name())+"\","+
"EVENT_DATETIME=\""+datetime.toString("yyyy-MM-dd")+ "EVENT_DATETIME=\""+datetime.toString("yyyy-MM-dd")+
" "+slot_logline->startTime(RDLogLine::Actual).toString("hh:mm:ss")+"\","+ " "+slot_logline->startTime(RDLogLine::Actual).toString("hh:mm:ss")+"\","+
"EXT_START_TIME=\""+slot_logline->extStartTime().toString("hh:mm:ss")+"\","+ "EXT_START_TIME=\""+slot_logline->extStartTime().toString("hh:mm:ss")+"\","+
"EXT_DATA=\""+RDEscapeString(slot_logline->extData())+"\","+ "EXT_DATA=\""+RDEscapeString(slot_logline->extData())+"\","+
"EXT_EVENT_ID=\""+RDEscapeString(slot_logline->extEventId())+"\","+ "EXT_EVENT_ID=\""+RDEscapeString(slot_logline->extEventId())+"\","+
"EXT_ANNC_TYPE=\""+RDEscapeString(slot_logline->extAnncType())+"\","+ "EXT_ANNC_TYPE=\""+RDEscapeString(slot_logline->extAnncType())+"\","+
"EXT_CART_NAME=\""+RDEscapeString(slot_logline->extCartName())+"\","+ "EXT_CART_NAME=\""+RDEscapeString(slot_logline->extCartName())+"\","+
"TITLE=\""+RDEscapeString(slot_logline->title())+"\","+ "TITLE=\""+RDEscapeString(slot_logline->title())+"\","+
"ARTIST=\""+RDEscapeString(slot_logline->artist())+"\","+ "ARTIST=\""+RDEscapeString(slot_logline->artist())+"\","+
"SCHEDULED_TIME=\""+slot_logline->startTime(RDLogLine::Logged). "SCHEDULED_TIME=\""+slot_logline->startTime(RDLogLine::Logged).
toString("hh:mm:ss")+"\","+ toString("hh:mm:ss")+"\","+
"ISRC=\""+RDEscapeString(slot_logline->isrc())+"\","+ "ISRC=\""+RDEscapeString(slot_logline->isrc())+"\","+
"PUBLISHER=\""+RDEscapeString(slot_logline->publisher())+"\","+ "PUBLISHER=\""+RDEscapeString(slot_logline->publisher())+"\","+
"COMPOSER=\""+RDEscapeString(slot_logline->composer())+"\","+ "COMPOSER=\""+RDEscapeString(slot_logline->composer())+"\","+
"ONAIR_FLAG=\""+RDYesNo(slot_ripc->onairFlag())+"\","+ "ONAIR_FLAG=\""+RDYesNo(slot_ripc->onairFlag())+"\","+
"ALBUM=\""+RDEscapeString(slot_logline->album())+"\","+ "ALBUM=\""+RDEscapeString(slot_logline->album())+"\","+
"LABEL=\""+RDEscapeString(slot_logline->label())+"\","+ "LABEL=\""+RDEscapeString(slot_logline->label())+"\","+
"CONDUCTOR=\""+RDEscapeString(slot_logline->conductor())+"\","+ "CONDUCTOR=\""+RDEscapeString(slot_logline->conductor())+"\","+
"USER_DEFINED=\""+RDEscapeString(slot_logline->userDefined())+"\","+ "USER_DEFINED=\""+RDEscapeString(slot_logline->userDefined())+"\","+
"SONG_ID=\""+RDEscapeString(slot_logline->songId())+"\","+ "SONG_ID=\""+RDEscapeString(slot_logline->songId())+"\","+
"ISCI=\""+RDEscapeString(slot_logline->isci())+"\""; "DESCRIPTION=\""+RDEscapeString(slot_logline->description())+"\","+
q=new RDSqlQuery(sql); "OUTCUE=\""+RDEscapeString(slot_logline->outcue())+"\","+
delete q; "ISCI=\""+RDEscapeString(slot_logline->isci())+"\"";
q=new RDSqlQuery(sql);
delete q;
}
} }
void RDCartSlot::ClearTempCart() void RDCartSlot::ClearTempCart()

View File

@ -114,6 +114,8 @@ QString RDCreateReconciliationTableSql(QString name)
"LABEL char(64),"+ "LABEL char(64),"+
"CONDUCTOR char(64),"+ "CONDUCTOR char(64),"+
"USAGE_CODE int,"+ "USAGE_CODE int,"+
"DESCRIPTION char(64),"+
"OUTCUE char(64),"+
"ISRC char(12),"+ "ISRC char(12),"+
"ISCI char(32),"+ "ISCI char(32),"+
"STATION_NAME char(64),"+ "STATION_NAME char(64),"+

View File

@ -477,35 +477,42 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate,
// //
// Selected Fields // Selected Fields
// //
sql=QString().sprintf("select LENGTH,LOG_ID,CART_NUMBER,STATION_NAME,\ sql=QString("select ")+
EVENT_DATETIME,EVENT_TYPE,EXT_START_TIME,\ "LENGTH,"+ // 00
EXT_LENGTH,EXT_DATA,EXT_EVENT_ID,EXT_ANNC_TYPE,\ "LOG_ID,"+ // 01
PLAY_SOURCE,CUT_NUMBER,EVENT_SOURCE,EXT_CART_NAME,\ "CART_NUMBER,"+ // 02
LOG_NAME,`%s_SRT`.TITLE,`%s_SRT`.ARTIST,\ "STATION_NAME,"+ // 03
SCHEDULED_TIME,\ "EVENT_DATETIME,"+ // 04
START_SOURCE,`%s_SRT`.PUBLISHER,`%s_SRT`.COMPOSER,\ "EVENT_TYPE,"+ // 05
`%s_SRT`.ALBUM,`%s_SRT`.LABEL,\ "EXT_START_TIME,"+ // 06
`%s_SRT`.ISRC,`%s_SRT`.USAGE_CODE,\ "EXT_LENGTH,"+ // 07
`%s_SRT`.ONAIR_FLAG,`%s_SRT`.ISCI,\ "EXT_DATA,"+ // 08
`%s_SRT`.CONDUCTOR,`%s_SRT`.USER_DEFINED,\ "EXT_EVENT_ID,"+ // 09
`%s_SRT`.SONG_ID from `%s_SRT`\ "EXT_ANNC_TYPE,"+ // 10
left join CART on `%s_SRT`.CART_NUMBER=CART.NUMBER \ "PLAY_SOURCE,"+ // 11
where ", "CUT_NUMBER,"+ // 12
(const char *)rec_name, "EVENT_SOURCE,"+ // 13
(const char *)rec_name, "EXT_CART_NAME,"+ // 14
(const char *)rec_name, "LOG_NAME,"+ // 15
(const char *)rec_name, "`"+rec_name+"_SRT`.TITLE,"+ // 16
(const char *)rec_name, "`"+rec_name+"_SRT`.ARTIST,"+ // 17
(const char *)rec_name, "SCHEDULED_TIME,"+ // 18
(const char *)rec_name, "START_SOURCE,"+ // 19
(const char *)rec_name, "`"+rec_name+"_SRT`.PUBLISHER,"+ // 20
(const char *)rec_name, "`"+rec_name+"_SRT`.COMPOSER,"+ // 21
(const char *)rec_name, "`"+rec_name+"_SRT`.ALBUM,"+ // 22
(const char *)rec_name, "`"+rec_name+"_SRT`.LABEL,"+ // 23
(const char *)rec_name, "`"+rec_name+"_SRT`.ISRC,"+ // 24
(const char *)rec_name, "`"+rec_name+"_SRT`.USAGE_CODE,"+ // 25
(const char *)rec_name, "`"+rec_name+"_SRT`.ONAIR_FLAG,"+ // 26
(const char *)rec_name); "`"+rec_name+"_SRT`.ISCI,"+ // 27
"`"+rec_name+"_SRT`.CONDUCTOR,"+ // 28
"`"+rec_name+"_SRT`.USER_DEFINED,"+ // 29
"`"+rec_name+"_SRT`.SONG_ID,"+ // 30
"`"+rec_name+"_SRT`.DESCRIPTION,"+ // 31
"`"+rec_name+"_SRT`.OUTCUE "+ // 32
"from `"+rec_name+"_SRT` left join CART "+
"on `"+rec_name+"_SRT`.CART_NUMBER=CART.NUMBER where ";
// //
// OnAir Flag Filter // OnAir Flag Filter
@ -542,7 +549,6 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate,
} }
sql=sql.left(sql.length()-2); sql=sql.left(sql.length()-2);
sql+=")"; sql+=")";
//printf("SQL: %s\n",(const char *)sql);
q1=new RDSqlQuery(sql); q1=new RDSqlQuery(sql);
while(q1->next()) { while(q1->next()) {
sql=QString("insert into `")+mixname+"_SRT` "+ sql=QString("insert into `")+mixname+"_SRT` "+
@ -580,7 +586,9 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate,
"ISCI=\""+RDEscapeString(q1->value(27).toString())+"\","+ "ISCI=\""+RDEscapeString(q1->value(27).toString())+"\","+
"CONDUCTOR=\""+RDEscapeString(q1->value(28).toString())+"\","+ "CONDUCTOR=\""+RDEscapeString(q1->value(28).toString())+"\","+
"USER_DEFINED=\""+RDEscapeString(q1->value(29).toString())+"\","+ "USER_DEFINED=\""+RDEscapeString(q1->value(29).toString())+"\","+
"SONG_ID=\""+RDEscapeString(q1->value(30).toString())+"\""; "SONG_ID=\""+RDEscapeString(q1->value(30).toString())+"\","+
"DESCRIPTION=\""+RDEscapeString(q1->value(31).toString())+"\","+
"OUTCUE=\""+RDEscapeString(q1->value(32).toString())+"\"";
q2=new RDSqlQuery(sql); q2=new RDSqlQuery(sql);
delete q2; delete q2;
} }
@ -654,6 +662,10 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate,
ret=ExportTechnical(startdate,enddate,false,true,mixname); ret=ExportTechnical(startdate,enddate,false,true,mixname);
break; break;
case RDReport::CutLog:
ret=ExportCutLog(startdate,enddate,mixname);
break;
default: default:
return false; return false;
break; break;
@ -670,6 +682,7 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate,
sql=QString().sprintf("drop table `%s_SRT`",(const char *)mixname); sql=QString().sprintf("drop table `%s_SRT`",(const char *)mixname);
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
delete q; delete q;
return ret; return ret;
} }
@ -728,6 +741,9 @@ QString RDReport::filterText(RDReport::ExportFilter filter)
case RDReport::WideOrbit: case RDReport::WideOrbit:
return QObject::tr("WideOrbit Traffic Reconciliation"); return QObject::tr("WideOrbit Traffic Reconciliation");
case RDReport::CutLog:
return QObject::tr("Cut Log");
default: default:
return QObject::tr("Unknown"); return QObject::tr("Unknown");
} }
@ -770,6 +786,7 @@ bool RDReport::multipleDaysAllowed(RDReport::ExportFilter filter)
case RDReport::NaturalLog: case RDReport::NaturalLog:
case RDReport::SpinCount: case RDReport::SpinCount:
case RDReport::WideOrbit: case RDReport::WideOrbit:
case RDReport::CutLog:
return false; return false;
case RDReport::BmiEmr: case RDReport::BmiEmr:
@ -799,6 +816,7 @@ bool RDReport::multipleMonthsAllowed(RDReport::ExportFilter filter)
case RDReport::MusicPlayout: case RDReport::MusicPlayout:
case RDReport::NaturalLog: case RDReport::NaturalLog:
case RDReport::WideOrbit: case RDReport::WideOrbit:
case RDReport::CutLog:
return false; return false;
case RDReport::MusicSummary: case RDReport::MusicSummary:

View File

@ -37,8 +37,8 @@ class RDReport
SoundExchange=4,RadioTraffic=5,VisualTraffic=6, SoundExchange=4,RadioTraffic=5,VisualTraffic=6,
CounterPoint=7,Music1=8,MusicSummary=9,WideOrbit=10, CounterPoint=7,Music1=8,MusicSummary=9,WideOrbit=10,
NprSoundExchange=11,MusicPlayout=12,NaturalLog=13, NprSoundExchange=11,MusicPlayout=12,NaturalLog=13,
MusicClassical=14,MrMaster=15,SpinCount=16, MusicClassical=14,MrMaster=15,SpinCount=16,CutLog=17,
LastFilter=17}; LastFilter=18};
enum ExportOs {Linux=0,Windows=1}; enum ExportOs {Linux=0,Windows=1};
enum ExportType {Generic=0,Traffic=1,Music=2}; enum ExportType {Generic=0,Traffic=1,Music=2};
enum StationType {TypeOther=0,TypeAm=1,TypeFm=2,TypeLast=3}; enum StationType {TypeOther=0,TypeAm=1,TypeFm=2,TypeLast=3};
@ -117,6 +117,8 @@ class RDReport
const QString &mixtable); const QString &mixtable);
bool ExportSpinCount(const QDate &startdate,const QDate &enddate, bool ExportSpinCount(const QDate &startdate,const QDate &enddate,
const QString &mixtable); const QString &mixtable);
bool ExportCutLog(const QDate &startdate,const QDate &enddate,
const QString &mixtable);
QString StringField(const QString &str,const QString &null_text="") const; QString StringField(const QString &str,const QString &null_text="") const;
void SetRow(const QString &param,const QString &value) const; void SetRow(const QString &param,const QString &value) const;
void SetRow(const QString &param,int value) const; void SetRow(const QString &param,int value) const;

View File

@ -2,9 +2,7 @@
// //
// The sound panel widget for RDAirPlay // The sound panel widget for RDAirPlay
// //
// (C) Copyright 2002-2004 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2016 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: rdsound_panel.cpp,v 1.62.6.13.2.3 2014/05/20 22:39:35 cvs Exp $
// //
// 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
@ -1468,10 +1466,22 @@ void RDSoundPanel::LogTraffic(RDPanelButton *button)
RDSqlQuery *q; RDSqlQuery *q;
QDateTime datetime(QDate::currentDate(),QTime::currentTime()); QDateTime datetime(QDate::currentDate(),QTime::currentTime());
sql=QString("select CART.TITLE,CART.ARTIST,CART.PUBLISHER,")+ sql=QString("select ")+
"CART.COMPOSER,CART.USAGE_CODE,CUTS.ISRC,"+ "CART.TITLE,"+ // 00
"CART.ALBUM,CART.LABEL,CUTS.ISCI,CART.CONDUCTOR,CART.USER_DEFINED," "CART.ARTIST,"+ // 01
"CART.SONG_ID from CART left join CUTS "+ "CART.PUBLISHER,"+ // 02
"CART.COMPOSER,"+ // 03
"CART.USAGE_CODE,"+ // 04
"CUTS.ISRC,"+ // 05
"CART.ALBUM,"+ // 06
"CART.LABEL,"+ // 07
"CUTS.ISCI,"+ // 08
"CART.CONDUCTOR,"+ // 09
"CART.USER_DEFINED,"+ // 10
"CART.SONG_ID,"+ // 11
"CUTS.DESCRIPTION,"+ // 12
"CUTS.OUTCUE "+ // 13
"from CART left join CUTS "+
"on CART.NUMBER=CUTS.CART_NUMBER where "+ "on CART.NUMBER=CUTS.CART_NUMBER where "+
"CUTS.CUT_NAME=\""+RDEscapeString(button->cutName())+"\""; "CUTS.CUT_NAME=\""+RDEscapeString(button->cutName())+"\"";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
@ -1497,6 +1507,8 @@ void RDSoundPanel::LogTraffic(RDPanelButton *button)
"ALBUM=\""+RDEscapeString(q->value(6).toString().utf8())+"\","+ "ALBUM=\""+RDEscapeString(q->value(6).toString().utf8())+"\","+
"LABEL=\""+RDEscapeString(q->value(7).toString().utf8())+"\","+ "LABEL=\""+RDEscapeString(q->value(7).toString().utf8())+"\","+
"ISCI=\""+RDEscapeString(q->value(8).toString().utf8())+"\","+ "ISCI=\""+RDEscapeString(q->value(8).toString().utf8())+"\","+
"DESCRIPTION=\""+RDEscapeString(q->value(12).toString().utf8())+"\","+
"OUTCUE=\""+RDEscapeString(q->value(13).toString().utf8())+"\","+
"CONDUCTOR=\""+RDEscapeString(q->value(9).toString().utf8())+"\","+ "CONDUCTOR=\""+RDEscapeString(q->value(9).toString().utf8())+"\","+
"USER_DEFINED=\""+RDEscapeString(q->value(10).toString().utf8())+"\","+ "USER_DEFINED=\""+RDEscapeString(q->value(10).toString().utf8())+"\","+
"SONG_ID=\""+RDEscapeString(q->value(11).toString().utf8())+"\","+ "SONG_ID=\""+RDEscapeString(q->value(11).toString().utf8())+"\","+

View File

@ -8132,6 +8132,24 @@ int UpdateDb(int ver)
delete q; delete q;
} }
if(ver<255) {
sql=QString("select NAME from SERVICES");
q=new QSqlQuery(sql);
while(q->next()) {
sql=QString("alter table `")+RDSvc::svcTableName(q->value(0).toString())+
"` add column DESCRIPTION char(64) after USAGE_CODE";
q1=new QSqlQuery(sql);
delete q1;
sql=QString("alter table `")+RDSvc::svcTableName(q->value(0).toString())+
"` add column OUTCUE char(64) after DESCRIPTION";
q1=new QSqlQuery(sql);
delete q1;
}
delete q;
}
// **** End of version updates **** // **** End of version updates ****

View File

@ -2,9 +2,7 @@
// //
// Add an entry to the reconciliation table. // Add an entry to the reconciliation table.
// //
// (C) Copyright 2002-2005 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2016 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: log_traffic.cpp,v 1.20.8.2.2.3 2014/06/24 18:27:05 cvs Exp $
// //
// 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
@ -80,6 +78,8 @@ void LogTraffic(const QString &svcname,const QString &logname,
"USER_DEFINED=\""+RDEscapeString(logline->userDefined().utf8())+"\","+ "USER_DEFINED=\""+RDEscapeString(logline->userDefined().utf8())+"\","+
"CONDUCTOR=\""+RDEscapeString(logline->conductor().utf8())+"\","+ "CONDUCTOR=\""+RDEscapeString(logline->conductor().utf8())+"\","+
"SONG_ID=\""+RDEscapeString(logline->songId().utf8())+"\","+ "SONG_ID=\""+RDEscapeString(logline->songId().utf8())+"\","+
"DESCRIPTION=\""+RDEscapeString(logline->description().utf8())+"\","+
"OUTCUE=\""+RDEscapeString(logline->outcue().utf8())+"\","+
"ISCI=\""+RDEscapeString(logline->isci().utf8())+"\""; "ISCI=\""+RDEscapeString(logline->isci().utf8())+"\"";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);

View File

@ -31,6 +31,7 @@
#include <rdcreate_log.h> #include <rdcreate_log.h>
#include <rdescape_string.h> #include <rdescape_string.h>
#include <rdevent.h> #include <rdevent.h>
#include <rdsvc.h>
#include "rdrevert.h" #include "rdrevert.h"
@ -162,6 +163,10 @@ void MainObject::Revert(int schema) const
case 254: case 254:
Revert254(); Revert254();
break; break;
case 255:
Revert255();
break;
} }
} }
@ -376,6 +381,31 @@ void MainObject::Revert254() const
} }
void MainObject::Revert255() const
{
QString sql;
QSqlQuery *q;
QSqlQuery *q1;
sql=QString("select NAME from SERVICES");
q=new QSqlQuery(sql);
while(q->next()) {
sql=QString("alter table `")+RDSvc::svcTableName(q->value(0).toString())+
"` drop column DESCRIPTION";
q1=new QSqlQuery(sql);
delete q1;
sql=QString("alter table `")+RDSvc::svcTableName(q->value(0).toString())+
"` drop column OUTCUE";
q1=new QSqlQuery(sql);
delete q1;
}
delete q;
SetVersion(254);
}
int MainObject::GetVersion() const int MainObject::GetVersion() const
{ {
QString sql; QString sql;

View File

@ -50,6 +50,7 @@ class MainObject : public QObject
void Revert252() const; void Revert252() const;
void Revert253() const; void Revert253() const;
void Revert254() const; void Revert254() const;
void Revert255() const;
int GetVersion() const; int GetVersion() const;
void SetVersion(int schema) const; void SetVersion(int schema) const;
int MapSchema(const QString &ver); int MapSchema(const QString &ver);