From d222ed9ca0d976f1986140b0d6228dac75dbce13 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Fri, 3 Jun 2016 23:45:31 +0100 Subject: [PATCH 01/25] Added QDate/Time variant is valid checks for SQL use With MySQL v5.7+ you have to specifically set either a valid date or NULL otherwise you get SQL errors. In previous versions setting a date to "" implied NULL, this is no longer the case which causes nice SQL errors all over the place. This new RDCheckDateTime is an overloaded function that calls the respective isValid method of QDate/Time/DateTime and either returns the requested formatted string or returns NULL as a string. This can then be used as part of an INSERT/UPDATE without breaking the stricter NULL interpretation of MySQL v5.7+. --- lib/rdescape_string.cpp | 52 +++++++++++++++++++++++++++++++++++++++++ lib/rdescape_string.h | 5 ++++ 2 files changed, 57 insertions(+) diff --git a/lib/rdescape_string.cpp b/lib/rdescape_string.cpp index 89dd9caa..12af1d39 100644 --- a/lib/rdescape_string.cpp +++ b/lib/rdescape_string.cpp @@ -21,6 +21,58 @@ #include #include +#include + +/** + * RDCheckDateTime - Checks for QTime.isValid + * @param time - QTime object + * @param format - QString representing time format e.g. HH:MM + * @return QString, "NULL" if not Valid else formatted Time String + */ +QString RDCheckDateTime(QTime const &time, QString const &format) +{ + QString checkedValue = "NULL"; + + if(time.isValid()) + checkedValue = time.toString(format); + + return checkedValue; + +} + +/** + * RDCheckDateTime - Checks for QDateTime.isValid + * @param datetime - QDateTime object + * @param format - QString representing date time format e.g. yyyy-mm-dd HH:MM + * @return QString, "NULL" if not Valid else formatted DateTime String + */ +QString RDCheckDateTime(QDateTime const &datetime, QString const &format) +{ + QString checkedValue = "NULL"; + + if(datetime.isValid()) + checkedValue = datetime.toString(format); + + return checkedValue; + +} + +/** + * RDCheckDateTime - Checks for QDate.isValid + * @param date - QDate object + * @param format - QString representing date format e.g. yyyy-mm-dd + * @return QString, "NULL" if not Valid else formatted Date String + */ +QString RDCheckDateTime(QDate const &date, QString const &format) +{ + QString checkedValue = "NULL"; + + if(date.isValid()) + checkedValue = date.toString(format); + + return checkedValue; + +} QString RDEscapeString(QString const &str) { diff --git a/lib/rdescape_string.h b/lib/rdescape_string.h index 32ffac3f..553d84a6 100644 --- a/lib/rdescape_string.h +++ b/lib/rdescape_string.h @@ -19,11 +19,16 @@ // #include +#include #ifndef RDESCAPE_STRING_H #define RDESCAPE_STRING_H +QString RDCheckDateTime(const QTime &time, const QString &format); +QString RDCheckDateTime(const QDateTime &datetime, const QString &format); +QString RDCheckDateTime(const QDate &date, const QString &format); QString RDEscapeString(const QString &str); + #endif // RDESCAPE_STRING_H From e2eb07c61565a62ac1e4fbcac38cbb2aac23f9d6 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Fri, 3 Jun 2016 23:50:29 +0100 Subject: [PATCH 02/25] Added date/time checks for MySQL v5.7+ date/time nulls Shouldn't be necessary in the daypart SQL but can't verify validity so added checks there too. --- lib/rdreport.cpp | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/lib/rdreport.cpp b/lib/rdreport.cpp index 8bf1b0d2..911ba2e4 100644 --- a/lib/rdreport.cpp +++ b/lib/rdreport.cpp @@ -347,20 +347,19 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate, QDate date=startdate.addDays(i); if(startTime()=\"")+ - date.toString("yyyy-MM-dd")+ - " "+startTime().toString("hh:mm:ss")+"\")&&"+ - "(EVENT_DATETIME<\""+date.toString("yyyy-MM-dd")+ - " "+endTime().toString("hh:mm:ss")+"\"))||"; + RDCheckDateTime(date,"yyyy-MM-dd")+ + " "+RDCheckDateTime(startTime(),"hh:mm:ss")+"\")&&"+ + "(EVENT_DATETIME<\""+RDCheckDateTime(date,"yyyy-MM-dd")+ + " "+RDCheckDateTime(endTime(),"hh:mm:ss")+"\"))||"; } else { daypart_sql+=QString("((EVENT_DATETIME<=\"")+ - date.toString("yyyy-MM-dd")+ - " "+endTime().toString("hh:mm:ss")+"\")&&"+ - "(EVENT_DATETIME>\""+date.toString("yyyy-MM-dd")+" 00:00:00))||"+ - "((EVENT_DATETIME>=\""+ - date.toString("yyyy-MM-dd")+ - " "+startTime().toString("hh:mm:ss")+"\")&&"+ - "(EVENT_DATETIME<\""+date.toString("yyyy-MM-dd")+" 23:59:59))||"; + RDCheckDateTime(date,"yyyy-MM-dd")+ + " "+RDCheckDateTime(endTime(),"hh:mm:ss")+"\")&&"+ + "(EVENT_DATETIME>\""+RDCheckDateTime(date,"yyyy-MM-dd")+" 00:00:00))||"+ + "((EVENT_DATETIME>=\""+RDCheckDateTime(date,"yyyy-MM-dd")+ + " "+RDCheckDateTime(startTime(),"hh:mm:ss")+"\")&&"+ + "(EVENT_DATETIME<\""+RDCheckDateTime(date,"yyyy-MM-dd")+" 23:59:59))||"; } } @@ -534,9 +533,9 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate, // Daypart Filter // if(daypart_sql.isEmpty()) { - sql+=QString("(EVENT_DATETIME>=\"")+startdate.toString("yyyy-MM-dd")+ + sql+=QString("(EVENT_DATETIME>=\"")+RDCheckDateTime(startdate,"yyyy-MM-dd")+ " 00:00:00\")&&"+ - "(EVENT_DATETIME<=\""+enddate.toString("yyyy-MM-dd")+ + "(EVENT_DATETIME<=\""+RDCheckDateTime(enddate,"yyyy-MM-dd")+ " 23:59:59\")&&"; } else { @@ -555,8 +554,8 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate, q1->value(1).toUInt(), q1->value(2).toInt())+ "STATION_NAME=\""+RDEscapeString(q1->value(3).toString())+"\","+ - "EVENT_DATETIME=\""+RDEscapeString(q1->value(4).toDateTime(). - toString("yyyy-MM-dd hh:mm:ss"))+"\","+ + "EVENT_DATETIME=\""+RDCheckDateTime(q1->value(4).toDateTime(), + "yyyy-MM-dd hh:mm:ss")+"\","+ QString().sprintf("EVENT_TYPE=%d,",q1->value(5).toInt())+ "EXT_START_TIME=\""+RDEscapeString(q1->value(6).toString())+"\","+ QString().sprintf("EXT_LENGTH=%d,",q1->value(7).toInt())+ @@ -572,7 +571,7 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate, "TITLE=\""+RDEscapeString(q1->value(16).toString())+"\","+ "ARTIST=\""+RDEscapeString(q1->value(17).toString())+"\","+ "SCHEDULED_TIME=\""+ - q1->value(18).toDate().toString("yyyy-MM-dd hh:mm:ss")+"\","+ + RDCheckDateTime(q1->value(18).toDate(),"yyyy-MM-dd hh:mm:ss")+"\","+ QString().sprintf("START_SOURCE=%d,",q1->value(19).toInt())+ "PUBLISHER=\""+RDEscapeString(q1->value(20).toString())+"\","+ "COMPOSER=\""+RDEscapeString(q1->value(21).toString())+"\","+ @@ -923,7 +922,7 @@ void RDReport::SetRow(const QString ¶m,const QTime &value) const sql=QString().sprintf("UPDATE REPORTS SET %s=\"%s\" WHERE NAME=\"%s\"", (const char *)param, - (const char *)value.toString("hh:mm:ss"), + (const char *)RDCheckDateTime(value, "hh:mm:ss"), (const char *)report_name); q=new RDSqlQuery(sql); delete q; From ace1a01225e80dd507279eaf5151b9ea7b26b891 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 00:01:26 +0100 Subject: [PATCH 03/25] lib/rdpodcast.cpp MySQL v5.7+ changes for date nulls This doesn't use a dedicated setRow, instead it converts to QString and then tries to insert the dates instead. Amended setOrigin and setEffectiveDateTime to use RDCheckDateTime --- lib/rdpodcast.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rdpodcast.cpp b/lib/rdpodcast.cpp index 267c6188..28e56155 100644 --- a/lib/rdpodcast.cpp +++ b/lib/rdpodcast.cpp @@ -209,7 +209,7 @@ QDateTime RDPodcast::originDateTime() const void RDPodcast::setOriginDateTime(const QDateTime &datetime) const { - SetRow("ORIGIN_DATETIME",datetime.toString("yyyy-MM-dd hh:mm:ss")); + SetRow("ORIGIN_DATETIME",RDCheckDateTime(datetime,"yyyy-MM-dd hh:mm:ss")); } @@ -222,7 +222,7 @@ QDateTime RDPodcast::effectiveDateTime() const void RDPodcast::setEffectiveDateTime(const QDateTime &datetime) const { - SetRow("EFFECTIVE_DATETIME",datetime.toString("yyyy-MM-dd hh:mm:ss")); + SetRow("EFFECTIVE_DATETIME",RDCheckDateTime(datetime,"yyyy-MM-dd hh:mm:ss")); } From c2560a671b124ce85c3f73d74f8bc4fcf5493d19 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 00:04:44 +0100 Subject: [PATCH 04/25] lib/rdevent_line.cpp MySQL v5.7+ date/time null changes Time is based on event_start_time however can't guarantee validity hence RDCheckDateTime again. --- lib/rdevent_line.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rdevent_line.cpp b/lib/rdevent_line.cpp index 0055deab..190cdc7e 100644 --- a/lib/rdevent_line.cpp +++ b/lib/rdevent_line.cpp @@ -824,7 +824,7 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, time_type, (const char *)RDYesNo(post_point), trans_type, - (const char *)time.toString("hh:mm:ss"), + (const char *)RDCheckDateTime(time,"hh:mm:ss"), event_length); q=new RDSqlQuery(sql); delete q; From e98a915f90cfd3f84126c1b1e6d2cf98d09106fc Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 00:08:42 +0100 Subject: [PATCH 05/25] lib/rdlog.cpp MySQL v5.7+ date/time null changes Fixed in SetRow for QDate/QTime and QDateTime --- lib/rdlog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rdlog.cpp b/lib/rdlog.cpp index ec7c145c..e7617ea2 100644 --- a/lib/rdlog.cpp +++ b/lib/rdlog.cpp @@ -663,7 +663,7 @@ void RDLog::SetRow(const QString ¶m,const QDate &value) const sql=QString().sprintf("UPDATE LOGS SET %s=\"%s\" WHERE NAME=\"%s\"", (const char *)param, - (const char *)value.toString("yyyy/MM/dd"), + (const char *)RDCheckDateTime(value,"yyyy/MM/dd"), (const char *)RDEscapeString(log_name)); q=new RDSqlQuery(sql); delete q; @@ -677,7 +677,7 @@ void RDLog::SetRow(const QString ¶m,const QDateTime &value) const sql=QString().sprintf("UPDATE LOGS SET %s=\"%s\" WHERE NAME=\"%s\"", (const char *)param, - (const char *)value.toString("yyyy-MM-dd hh:mm:ss"), + (const char *)RDCheckDateTime(value,"yyyy-MM-dd hh:mm:ss"), (const char *)RDEscapeString(log_name)); q=new RDSqlQuery(sql); delete q; From 1cf11af4471a574ed001a43f162a9b772285a52b Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 00:12:02 +0100 Subject: [PATCH 06/25] lib/rdfeed.cpp MySQL v5.7+ date/time null changes Fixed in setX rather than Row as these are converted to QString before the DB --- lib/rdfeed.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rdfeed.cpp b/lib/rdfeed.cpp index 2c5d7f12..30d9ceca 100644 --- a/lib/rdfeed.cpp +++ b/lib/rdfeed.cpp @@ -320,7 +320,7 @@ QDateTime RDFeed::lastBuildDateTime() const void RDFeed::setLastBuildDateTime(const QDateTime &datetime) const { - SetRow("LAST_BUILD_DATETIME",datetime.toString("yyyy-MM-dd hh:mm:ss")); + SetRow("LAST_BUILD_DATETIME",RDCheckDateTime(datetime,"yyyy-MM-dd hh:mm:ss")); } @@ -333,7 +333,7 @@ QDateTime RDFeed::originDateTime() const void RDFeed::setOriginDateTime(const QDateTime &datetime) const { - SetRow("ORIGIN_DATETIME",datetime.toString("yyyy-MM-dd hh:mm:ss")); + SetRow("ORIGIN_DATETIME",RDCheckDateTime(datetime,"yyyy-MM-dd hh:mm:ss")); } From e1c9caa98762d62e640cb82fd6f06c1d8c4e1038 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 19:21:15 +0100 Subject: [PATCH 07/25] lib/rdreport.cpp Reverted date checks on SELECT statements Checking is probably not needed and even if it did find an invalid date it would likely not return valid SQL e.g this is just one paraphrased example from the code: SELECT x FROM y WHERE EVENT_DATETIME<="NULL 00:00:00" I've reverted back the two select changes for the daypart code and put a TODO note there as a marker. --- lib/rdreport.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/rdreport.cpp b/lib/rdreport.cpp index 911ba2e4..24db452b 100644 --- a/lib/rdreport.cpp +++ b/lib/rdreport.cpp @@ -346,20 +346,22 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate, for(int i=0;i<(startdate.daysTo(enddate)+1);i++) { QDate date=startdate.addDays(i); if(startTime()=\"")+ - RDCheckDateTime(date,"yyyy-MM-dd")+ - " "+RDCheckDateTime(startTime(),"hh:mm:ss")+"\")&&"+ - "(EVENT_DATETIME<\""+RDCheckDateTime(date,"yyyy-MM-dd")+ - " "+RDCheckDateTime(endTime(),"hh:mm:ss")+"\"))||"; + date.toString("yyyy-MM-dd")+ + " "+startTime().toString("hh:mm:ss")+"\")&&"+ + "(EVENT_DATETIME<\""+date.toString("yyyy-MM-dd")+ + " "+endTime().toString("hh:mm:ss")+"\"))||"; } else { daypart_sql+=QString("((EVENT_DATETIME<=\"")+ - RDCheckDateTime(date,"yyyy-MM-dd")+ - " "+RDCheckDateTime(endTime(),"hh:mm:ss")+"\")&&"+ - "(EVENT_DATETIME>\""+RDCheckDateTime(date,"yyyy-MM-dd")+" 00:00:00))||"+ - "((EVENT_DATETIME>=\""+RDCheckDateTime(date,"yyyy-MM-dd")+ - " "+RDCheckDateTime(startTime(),"hh:mm:ss")+"\")&&"+ - "(EVENT_DATETIME<\""+RDCheckDateTime(date,"yyyy-MM-dd")+" 23:59:59))||"; + date.toString("yyyy-MM-dd")+ + " "+endTime().toString("hh:mm:ss")+"\")&&"+ + "(EVENT_DATETIME>\""+date.toString("yyyy-MM-dd")+" 00:00:00))||"+ + "((EVENT_DATETIME>=\""+ + date.toString("yyyy-MM-dd")+ + " "+startTime().toString("hh:mm:ss")+"\")&&"+ + "(EVENT_DATETIME<\""+date.toString("yyyy-MM-dd")+" 23:59:59))||"; } } @@ -533,9 +535,10 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate, // Daypart Filter // if(daypart_sql.isEmpty()) { - sql+=QString("(EVENT_DATETIME>=\"")+RDCheckDateTime(startdate,"yyyy-MM-dd")+ + //TODO Do we need to escape on Select statement? + sql+=QString("(EVENT_DATETIME>=\"")+startdate.toString("yyyy-MM-dd")+ " 00:00:00\")&&"+ - "(EVENT_DATETIME<=\""+RDCheckDateTime(enddate,"yyyy-MM-dd")+ + "(EVENT_DATETIME<=\""+enddate.toString("yyyy-MM-dd")+ " 23:59:59\")&&"; } else { From 4523e8e90f599ad4aa955e537f11c00dfe001580 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 19:30:09 +0100 Subject: [PATCH 08/25] lib/rdsvc.cpp Added null checks to purge_date as per MySQL v5.7+ changes Changed purge_date to a QString so that it can be checked with the normal RDCheckDateTime function. Also means the QString.isEmpty check is a straight forward QDate.isValid and in that case we can use QDate.toString rather than formatting via RDCheckDateTime (and incurring another QDate.isValid check). --- lib/rdsvc.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/rdsvc.cpp b/lib/rdsvc.cpp index 63ef68c7..8157fc06 100644 --- a/lib/rdsvc.cpp +++ b/lib/rdsvc.cpp @@ -754,9 +754,9 @@ bool RDSvc::generateLog(const QDate &date,const QString &logname, // // Generate Log Structure // - QString purge_date; + QDate purge_date; if(defaultLogShelflife()>=0) { - purge_date=date.addDays(defaultLogShelflife()).toString("yyyy-MM-dd"); + purge_date=date.addDays(defaultLogShelflife()); } sql=QString().sprintf("select NAME from LOGS where NAME=\"%s\"", (const char *)RDEscapeString(logname)); @@ -771,8 +771,8 @@ bool RDSvc::generateLog(const QDate &date,const QString &logname, (const char *)RDEscapeString(svc_name), (const char *)RDEscapeString(RDDateDecode(descriptionTemplate(),date)), "RDLogManager"); - if(!purge_date.isEmpty()) { - sql+=(",PURGE_DATE=\""+purge_date+"\""); + if(!purge_date.isValid()) { + sql+=(",PURGE_DATE=\""+purge_date.toString("yyyy-MM-dd")+"\""); } sql+=(" where NAME=\""+RDEscapeString(logname)+"\""); @@ -793,7 +793,7 @@ bool RDSvc::generateLog(const QDate &date,const QString &logname, (const char *)RDEscapeString(svc_name), (const char *)RDEscapeString(RDDateDecode(descriptionTemplate(),date)), "RDLogManager", - (const char *)purge_date); + (const char *)RDCheckDateTime(purge_date,"yyyy-MM-dd")); q=new RDSqlQuery(sql); delete q; } From 1e37f6bbdc7e25ef8a5e0355b2c95572205eeb33 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 19:38:32 +0100 Subject: [PATCH 09/25] lib/rdcartslot.cpp Added MySQL v5.7+ changes Added usual checks. Line 690 EVENT_DATETIME is not required as this is derived from current system datetime as per line 665. --- lib/rdcartslot.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/rdcartslot.cpp b/lib/rdcartslot.cpp index c9ce3f8e..eaa43549 100644 --- a/lib/rdcartslot.cpp +++ b/lib/rdcartslot.cpp @@ -688,16 +688,18 @@ void RDCartSlot::LogPlayout(RDPlayDeck::State state) slot_logline->startSource())+ "STATION_NAME=\""+RDEscapeString(slot_station->name())+"\","+ "EVENT_DATETIME=\""+datetime.toString("yyyy-MM-dd")+ - " "+slot_logline->startTime(RDLogLine::Actual).toString("hh:mm:ss")+"\","+ - "EXT_START_TIME=\""+slot_logline->extStartTime().toString("hh:mm:ss")+"\","+ + " "+RDCheckDateTime( + slot_logline->startTime(RDLogLine::Actual),"hh:mm:ss")+"\","+ + "EXT_START_TIME=\""+RDCheckDateTime( + slot_logline->extStartTime(),"hh:mm:ss")+"\","+ "EXT_DATA=\""+RDEscapeString(slot_logline->extData())+"\","+ "EXT_EVENT_ID=\""+RDEscapeString(slot_logline->extEventId())+"\","+ "EXT_ANNC_TYPE=\""+RDEscapeString(slot_logline->extAnncType())+"\","+ "EXT_CART_NAME=\""+RDEscapeString(slot_logline->extCartName())+"\","+ "TITLE=\""+RDEscapeString(slot_logline->title())+"\","+ "ARTIST=\""+RDEscapeString(slot_logline->artist())+"\","+ - "SCHEDULED_TIME=\""+slot_logline->startTime(RDLogLine::Logged). - toString("hh:mm:ss")+"\","+ + "SCHEDULED_TIME=\""+RDCheckDateTime( + slot_logline->startTime(RDLogLine::Logged),"hh:mm:ss")+"\","+ "ISRC=\""+RDEscapeString(slot_logline->isrc())+"\","+ "PUBLISHER=\""+RDEscapeString(slot_logline->publisher())+"\","+ "COMPOSER=\""+RDEscapeString(slot_logline->composer())+"\","+ From 69ea83d570ba5e640167eed0db82120dfc8f08da Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 19:42:20 +0100 Subject: [PATCH 10/25] lib/rdsound_panel.cpp MySQL v5.7+ Date Changes Usual checks. Line 1493 and 1537 is not required as they are derived from current system datetime as per lines 1466 and 1526 respectively. --- lib/rdsound_panel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rdsound_panel.cpp b/lib/rdsound_panel.cpp index f92fb6fe..bdabe5c9 100644 --- a/lib/rdsound_panel.cpp +++ b/lib/rdsound_panel.cpp @@ -1491,7 +1491,7 @@ void RDSoundPanel::LogTraffic(RDPanelButton *button) QString().sprintf("CART_NUMBER=%u,",button->cart())+ "STATION_NAME=\""+RDEscapeString(panel_station->name().utf8())+"\","+ "EVENT_DATETIME=\""+datetime.toString("yyyy-MM-dd")+" "+ - button->startTime().toString("hh:mm:ss")+"\","+ + RDCheckDateTime(button->startTime(),"hh:mm:ss")+"\","+ QString().sprintf("EVENT_TYPE=%d,",RDAirPlayConf::TrafficStop)+ QString().sprintf("EVENT_SOURCE=%d,",RDLogLine::SoundPanel)+ QString().sprintf("PLAY_SOURCE=%d,",RDLogLine::SoundPanel)+ From 7506d1567ce8e3e3a54baf556b2ca9bee80cbbf0 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 19:50:23 +0100 Subject: [PATCH 11/25] lib/rdlog_event.cpp MySQL v5.7+ date/time checks Usual date changes and some TODOs for potentially invalid SELECT statements --- lib/rdlog_event.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/rdlog_event.cpp b/lib/rdlog_event.cpp index 898617ae..ea7ecd25 100644 --- a/lib/rdlog_event.cpp +++ b/lib/rdlog_event.cpp @@ -244,6 +244,7 @@ int RDLogEvent::validate(QString *report,const QDate &date) // // Handle events with no logged start time (e.g. manual inserts) // + //TODO do we need to verify date here? sql=QString(). sprintf("select CUT_NAME from CUTS where \ (CART_NUMBER=%u)&& \ @@ -258,6 +259,7 @@ int RDLogEvent::validate(QString *report,const QDate &date) (const char *)RDDowCode(date.dayOfWeek())); } else { + //TODO Do we need to verify date and logLine(i)->startTime? sql=QString(). sprintf("select CUT_NAME from CUTS where \ (CART_NUMBER=%u)&& \ @@ -1203,8 +1205,8 @@ void RDLogEvent::InsertLineValues(QString *query, int line) RDEscapeString(log_line[line]->markerLabel()), log_line[line]->graceTime(), log_line[line]->source(), - (const char *)log_line[line]->extStartTime(). - toString("hh:mm:ss"), + (const char *)RDCheckDateTime( + log_line[line]->extStartTime(),"hh:mm:ss"), log_line[line]->extLength(), (const char *)RDEscapeString(log_line[line]->extData()), (const char *) @@ -1226,8 +1228,8 @@ void RDLogEvent::InsertLineValues(QString *query, int line) (const char *)RDYesNo(log_line[line]->linkEmbedded()), (const char *) RDEscapeString(log_line[line]->originUser()), - (const char *)log_line[line]->originDateTime(). - toString("yyyy-MM-dd hh:mm:ss"), + (const char *)RDCheckDateTime( + log_line[line]->originDateTime(),"yyyy-MM-dd hh:mm:ss"), log_line[line]->linkStartSlop(), log_line[line]->linkEndSlop(), log_line[line]->duckUpGain(), From 5a07b62d0cce19028dc065306145fdbc44029125 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 19:54:17 +0100 Subject: [PATCH 12/25] lib/rdrecording.cpp MySQL v5.7+ date/time changes Amended SetRow(QString,QTime) to contain time checks for MySQL v5.7+ --- lib/rdrecording.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rdrecording.cpp b/lib/rdrecording.cpp index b698aa90..72bbbb73 100644 --- a/lib/rdrecording.cpp +++ b/lib/rdrecording.cpp @@ -947,7 +947,7 @@ void RDRecording::SetRow(const QString ¶m,const QTime &value) const sql=QString().sprintf("update RECORDINGS set %s=\"%s\" where ID=%d", (const char *)param, - (const char *)value.toString("hh:mm:ss"),rec_id); + (const char *)RDCheckDateTime(value,"hh:mm:ss"),rec_id); q=new RDSqlQuery(sql); delete q; } From 58d75f0b5c30fe8d2643bfb3c00344a17fd55a96 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 20:20:55 +0100 Subject: [PATCH 13/25] lib/rdcut.cpp MySQL v5.7+ date/time changes --- lib/rdcut.cpp | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/lib/rdcut.cpp b/lib/rdcut.cpp index 28f35dfb..2bfacc8f 100644 --- a/lib/rdcut.cpp +++ b/lib/rdcut.cpp @@ -1060,8 +1060,8 @@ void RDCut::setMetadata(RDWaveData *data) const } if(data->daypartStartTime().isValid()&&data->daypartEndTime().isValid()&& (data->daypartStartTime()daypartEndTime())) { - sql+="START_DAYPART=\""+data->daypartStartTime().toString("hh:mm:ss")+"\","+ - "END_DAYPART=\""+data->daypartEndTime().toString("hh:mm:ss")+"\","; + sql+="START_DAYPART=\""+RDCheckDateTime(data->daypartStartTime(),"hh:mm:ss")+"\","+ + "END_DAYPART=\""+RDCheckDateTime(data->daypartEndTime(),"hh:mm:ss")+"\","; } if((data->hookStartPos()>=data->startPos())&& (data->hookStartPos()<=data->endPos())&& @@ -1082,28 +1082,22 @@ void RDCut::setMetadata(RDWaveData *data) const if((data->startDate()>QDate(1900,1,1))&&(data->endDate().year()<8000)) { if(data->startTime().isValid()) { sql+=QString().sprintf("START_DATETIME=\"%s %s\",", - (const char *)data->startDate(). - toString("yyyy-MM-dd"), - (const char *)data->startTime(). - toString("hh:mm:ss")); + (const char *)RDCheckDateTime(data->startDate(),"yyyy-MM-dd"), + (const char *)RDCheckDateTime(data->startTime(),"hh:mm:ss")); } else { sql+=QString().sprintf("START_DATETIME=\"%s 00:00:00\",", - (const char *)data->startDate(). - toString("yyyy-MM-dd")); + (const char *)RDCheckDateTime(data->startDate(),"yyyy-MM-dd")); } if(data->endDate().isValid()&&(data->endDate().year()<8000)) { if(data->endTime().isValid()) { sql+=QString().sprintf("END_DATETIME=\"%s %s\",", - (const char *)data->endDate(). - toString("yyyy-MM-dd"), - (const char *)data->endTime(). - toString("hh:mm:ss")); + (const char *)RDCheckDateTime(data->endDate(),"yyyy-MM-dd"), + (const char *)RDCheckDateTime(data->endTime(),"hh:mm:ss")); } else { sql+=QString().sprintf("END_DATETIME=\"%s 23:59:59\",", - (const char *)data->endDate(). - toString("yyyy-MM-dd")); + (const char *)RDCheckDateTime(data->endDate(),"yyyy-MM-dd")); } } } @@ -1605,7 +1599,7 @@ void RDCut::SetRow(const QString ¶m,const QDateTime &value) const sql=QString().sprintf("UPDATE CUTS SET %s=\"%s\" WHERE CUT_NAME=\"%s\"", (const char *)param, - (const char *)value.toString("yyyy-MM-dd hh:mm:ss"), + (const char *)RDCheckDateTime(value,"yyyy-MM-dd hh:mm:ss"), (const char *)cut_name); q=new RDSqlQuery(sql,cut_db); delete q; @@ -1619,7 +1613,7 @@ void RDCut::SetRow(const QString ¶m,const QDate &value) const sql=QString().sprintf("UPDATE CUTS SET %s=\"%s\" WHERE CUT_NAME=\"%s\"", (const char *)param, - (const char *)value.toString("yyyy-MM-dd"), + (const char *)RDCheckDateTime(value,"yyyy-MM-dd"), (const char *)cut_name); q=new RDSqlQuery(sql,cut_db); delete q; @@ -1632,7 +1626,7 @@ void RDCut::SetRow(const QString ¶m,const QTime &value) const QString sql; sql=QString().sprintf("UPDATE CUTS SET %s=\"%s\" WHERE CUT_NAME=\"%s\"", (const char *)param, - (const char *)value.toString("hh:mm:ss"), + (const char *)RDCheckDateTime(value,"hh:mm:ss"), (const char *)cut_name); q=new RDSqlQuery(sql,cut_db); delete q; From b9452b8e8df50f5b84b31076eacb051f156f858a Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 20:27:14 +0100 Subject: [PATCH 14/25] lib/rdcart.cpp MySQL v5.7+ date/time changes --- lib/rdcart.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index c5016707..b448cda5 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -1207,14 +1207,14 @@ void RDCart::updateLength(bool enforce_length,unsigned length) } else { sql+=QString().sprintf("START_DATETIME=\"%s\",", - (const char *)start_datetime.toString("yyyy-MM-dd hh:mm:ss")); + (const char *)RDCheckDateTime(start_datetime,"yyyy-MM-dd hh:mm:ss")); } if(end_datetime.isNull()||(!dates_valid)) { sql+="END_DATETIME=NULL,"; } else { sql+=QString().sprintf("END_DATETIME=\"%s\",", - (const char *)end_datetime.toString("yyyy-MM-dd hh:mm:ss")); + (const char *)RDCheckDateTime(end_datetime,"yyyy-MM-dd hh:mm:ss")); } sql+=QString().sprintf("VALIDITY=%u where NUMBER=%u", cart_validity,cart_number); @@ -1740,7 +1740,7 @@ void RDCart::SetRow(const QString ¶m,const QDateTime &value) const sql=QString().sprintf("UPDATE CART SET %s=\"%s\" WHERE NUMBER=%u", (const char *)param, - (const char *)value.toString("yyyy-MM-dd hh:mm:ss"), + (const char *)RDCheckDateTime(value,"yyyy-MM-dd hh:mm:ss"), cart_number); q=new RDSqlQuery(sql); delete q; @@ -1754,7 +1754,7 @@ void RDCart::SetRow(const QString ¶m,const QDate &value) const sql=QString().sprintf("UPDATE CART SET %s=\"%s\" WHERE NUMBER=%u", (const char *)param, - (const char *)value.toString("yyyy-MM-dd"), + (const char *)RDCheckDateTime(value,"yyyy-MM-dd"), cart_number); q=new RDSqlQuery(sql); delete q; From 1bfd555d00a86848a8e10959eb1df6dfabd0c862 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 23:21:32 +0100 Subject: [PATCH 15/25] web/rdcastmanager/rdcastmanager.cpp MySQL v5.7+ date/time changes --- web/rdcastmanager/rdcastmanager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/rdcastmanager/rdcastmanager.cpp b/web/rdcastmanager/rdcastmanager.cpp index 8a2c9b3a..1cd73bff 100644 --- a/web/rdcastmanager/rdcastmanager.cpp +++ b/web/rdcastmanager/rdcastmanager.cpp @@ -1322,8 +1322,8 @@ void MainObject::CommitCast() (const char *)RDEscapeString(item_source_text), (const char *)RDEscapeString(item_source_url), shelf_life, - (const char *)RDLocalToUtc(effective_datetime). - toString("yyyy-MM-dd hh:mm:ss"), + (const char *)RDCheckDateTime(RDLocalToUtc(effective_datetime), + "yyyy-MM-dd hh:mm:ss"), cast_cast_id); q=new RDSqlQuery(sql); delete q; From 9eb97c5b275b386c00f791a9e90b917918dfba2d Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 23:22:05 +0100 Subject: [PATCH 16/25] rdairplay/log_traffic.cpp MySQL v5.7+ date/time changes --- rdairplay/log_traffic.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rdairplay/log_traffic.cpp b/rdairplay/log_traffic.cpp index f1cee81d..62cd812e 100644 --- a/rdairplay/log_traffic.cpp +++ b/rdairplay/log_traffic.cpp @@ -51,10 +51,10 @@ void LogTraffic(const QString &svcname,const QString &logname, QString().sprintf("CART_NUMBER=%u,",logline->cartNumber())+ "STATION_NAME=\""+RDEscapeString(rdstation_conf->name().utf8())+"\","+ "EVENT_DATETIME=\""+datetime.toString("yyyy-MM-dd")+" "+ - logline->startTime(RDLogLine::Actual).toString("hh:mm:ss")+"\","+ + RDCheckDateTime(logline->startTime(RDLogLine::Actual),"hh:mm:ss")+"\","+ QString().sprintf("EVENT_TYPE=%d,",action)+ QString().sprintf("EVENT_SOURCE=%d,",logline->source())+ - "EXT_START_TIME=\""+logline->extStartTime().toString("hh:mm:ss")+"\","+ + "EXT_START_TIME=\""+RDCheckDateTime(logline->extStartTime(),"hh:mm:ss")+"\","+ QString().sprintf("EXT_LENGTH=%d,",logline->extLength())+ "EXT_DATA=\""+RDEscapeString(logline->extData())+"\","+ "EXT_EVENT_ID=\""+RDEscapeString(logline->extEventId())+"\","+ @@ -64,8 +64,8 @@ void LogTraffic(const QString &svcname,const QString &logname, "EXT_CART_NAME=\""+RDEscapeString(logline->extCartName().utf8())+"\","+ "TITLE=\""+RDEscapeString(logline->title().utf8())+"\","+ "ARTIST=\""+RDEscapeString(logline->artist().utf8())+"\","+ - "SCHEDULED_TIME=\""+RDEscapeString(logline->startTime(RDLogLine::Logged). - toString("hh:mm:ss"))+"\","+ + "SCHEDULED_TIME=\""+RDCheckDateTime(logline->startTime(RDLogLine::Logged), + "hh:mm:ss")+"\","+ "ISRC=\""+RDEscapeString(logline->isrc().utf8())+"\","+ "PUBLISHER=\""+RDEscapeString(logline->publisher().utf8())+"\","+ "COMPOSER=\""+RDEscapeString(logline->composer().utf8())+"\","+ From 65be7b3f5fc8deb99128fe63c3109bce48c676bd Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 23:45:17 +0100 Subject: [PATCH 17/25] importers/rivendell_filter.cpp MySQL v5.7+ date/time changes Unsure if the times can be invalid but old MySQL values can have 0000-00-00 as dates but the 5.7+ can't. There is a null check for this but I'm not 100% sure whether 0000-00-00 passes the isNull. Put in a date check for both just in case. --- importers/rivendell_filter.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/importers/rivendell_filter.cpp b/importers/rivendell_filter.cpp index de6b68da..fdef11de 100644 --- a/importers/rivendell_filter.cpp +++ b/importers/rivendell_filter.cpp @@ -304,8 +304,7 @@ MainObject::MainObject(QObject *parent) (const char *)RDEscapeString(q->value(3).toString()), (const char *)RDEscapeString(q->value(4).toString()), (const char *)RDEscapeString(q->value(5).toString()), - (const char *)q->value(6).toDate(). - toString("yyyy-MM-dd"), + (const char *)RDCheckDateTime(q->value(6).toDate(),"yyyy-MM-dd"), (const char *)RDEscapeString(q->value(7).toString()), (const char *)RDEscapeString(q->value(8).toString()), (const char *)RDEscapeString(q->value(9).toString()), @@ -349,32 +348,32 @@ MainObject::MainObject(QObject *parent) } else { start_datetime=QString().sprintf("\"%s\"", - (const char *)q1->value(7). - toDateTime().toString("yyyy-MM-dd hh:mm:ss")); + (const char *)RDCheckDateTime(q1->value(7). + toDateTime(),"yyyy-MM-dd hh:mm:ss"));//Could be invalid (0000-00-00) } if(q1->value(8).isNull()) { end_datetime="null"; } else { end_datetime=QString().sprintf("\"%s\"", - (const char *)q1->value(8). - toDateTime().toString("yyyy-MM-dd hh:mm:ss")); + (const char *)RDCheckDateTime(q1->value(8). + toDateTime(),"yyyy-MM-dd hh:mm:ss"));//Could be invalid (0000-00-00) } if(q1->value(16).isNull()) { start_daypart="null"; } else { start_daypart=QString().sprintf("\"%s\"", - (const char *)q1->value(16). - toTime().toString("hh:mm:ss")); + (const char *)RDCheckDateTime(q1->value(16). + toTime(),"hh:mm:ss"));//Invalid possible? } if(q1->value(17).isNull()) { end_daypart="null"; } else { end_daypart=QString().sprintf("\"%s\"", - (const char *)q1->value(17). - toTime().toString("hh:mm:ss")); + (const char *)RDCheckDateTime(q1->value(17). + toTime(),"hh:mm:ss"));//Invalid possible? } sql=QString().sprintf("insert into CUTS set CART_NUMBER=%u,\ CUT_NAME=\"%s\",\ From 370fb3c0b2fcc20e57cea5c7e923c4f49cafab8f Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 23:48:06 +0100 Subject: [PATCH 18/25] rdcatchd/rdcatchd.cpp MySQL v5.7+ date/time changes Not sure if the wild card resolver is strictly unsafe but added a check anyway. --- rdcatchd/rdcatchd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdcatchd/rdcatchd.cpp b/rdcatchd/rdcatchd.cpp index 76c69758..54964716 100644 --- a/rdcatchd/rdcatchd.cpp +++ b/rdcatchd/rdcatchd.cpp @@ -2609,7 +2609,7 @@ void MainObject::ResolveErrorWildcards(CatchEvent *event, rml->replace("%d",event->description()); rml->replace("%e",err_desc); // Error Description rml->replace("%i",QString().sprintf("%u",event->id())); - rml->replace("%t",event->startTime().toString("hh:mm:ss")); + rml->replace("%t",RDCheckDateTime(event->startTime(),"hh:mm:ss")); rml->replace("%y",RDRecording::typeString(event->type())); switch(event->type()) { case RDRecording::Recording: From 45c33dc5787b56108d337fb8a818b23264f4e1de Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 23:49:01 +0100 Subject: [PATCH 19/25] tests/sas_switch_torture.cpp MySQL v5.7+ date/time changes --- tests/sas_switch_torture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sas_switch_torture.cpp b/tests/sas_switch_torture.cpp index ca3c20d0..a2112c19 100644 --- a/tests/sas_switch_torture.cpp +++ b/tests/sas_switch_torture.cpp @@ -129,7 +129,7 @@ void MainWidget::generateData() j+1, k+1, (const char *)desc, - (const char *)time.toString("hh:mm:ss")); + (const char *)RDCheckDateTime(time,"hh:mm:ss")); q=new RDSqlQuery(sql); delete q; } From 9dbcfd54b7c199beddd357e729079ffdafb7c7c7 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 23:49:26 +0100 Subject: [PATCH 20/25] tests/sas_torture.cpp MySQL v5.7+ date/time changes --- tests/sas_torture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sas_torture.cpp b/tests/sas_torture.cpp index 19fe6631..714f6947 100644 --- a/tests/sas_torture.cpp +++ b/tests/sas_torture.cpp @@ -141,7 +141,7 @@ void MainWidget::generateData() SAS_STATION, (const char *)desc, CART_START+j, - (const char *)time.toString("hh:mm:ss")); + (const char *)RDCheckDateTime(time,"hh:mm:ss")); q=new RDSqlQuery(sql); delete q; } From 575856c47fe0ddccb3693ed28e582ce5507d00ff Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 23:49:56 +0100 Subject: [PATCH 21/25] utsil/rddgimport/rddgimport.cpp MySQL v5.7+ date/time changes --- utils/rddgimport/rddgimport.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/rddgimport/rddgimport.cpp b/utils/rddgimport/rddgimport.cpp index 40cf3174..d1d55ca5 100644 --- a/utils/rddgimport/rddgimport.cpp +++ b/utils/rddgimport/rddgimport.cpp @@ -443,7 +443,7 @@ bool MainWidget::CheckSpot(const QString &isci) if(q->value(1).isNull()) { sql+="START_DATETIME=\""+today.toString("yyyy-MM-dd")+" 00:00:00\","; } - sql+="END_DATETIME=\""+killdate.toString("yyyy-MM-dd")+" 23:59:59\" "; + sql+="END_DATETIME=\""+RDCheckDateTime(killdate,"yyyy-MM-dd")+" 23:59:59\" "; sql+="where CUT_NAME=\""+q->value(0).toString()+"\""; q1=new RDSqlQuery(sql); delete q1; From 9f52968a02eb6e5062f46e95d43ddee1c32bf432 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Sat, 4 Jun 2016 23:50:26 +0100 Subject: [PATCH 22/25] utils/rdimport/rdimport.cpp MySQL v5.7+ date/time changes --- utils/rdimport/rdimport.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/rdimport/rdimport.cpp b/utils/rdimport/rdimport.cpp index f02218c7..ef47fda6 100644 --- a/utils/rdimport/rdimport.cpp +++ b/utils/rdimport/rdimport.cpp @@ -1867,12 +1867,12 @@ void MainObject::WriteTimestampCache(const QString &filename, FILE_DATETIME=\"%s\"", import_persistent_dropbox_id, (const char *)RDEscapeString(filename), - (const char *)dt.toString("yyyy-MM-dd hh:mm:ss")); + (const char *)RDCheckDateTime(dt,"yyyy-MM-dd hh:mm:ss")); } else { sql=QString().sprintf("update DROPBOX_PATHS set FILE_DATETIME=\"%s\" \ where (DROPBOX_ID=%d)&&(FILE_PATH=\"%s\")", - (const char *)dt.toString("yyyy-MM-dd hh:mm:ss"), + (const char *)RDCheckDateTime(dt,"yyyy-MM-dd hh:mm:ss"), import_persistent_dropbox_id, (const char *)RDEscapeString(filename)); } From f1175cd2f2d52ce204edff6ec42da4dd8864e8e3 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Thu, 9 Jun 2016 00:01:38 +0100 Subject: [PATCH 23/25] Fixes for invalid NULL sql on date/times Most files are simple swaps to get rid of extra " as a NULL return will give invalid SQL if used as follows UPDATE x SET y="NULL"; See github issue 121 for more info. Extra changes have been made to the following files: * lib/rdcartslot.cpp - Added a QDateTime variable to prevent EVENT_DATETIME becoming "2016-06-09" "NULL" as it was checked separately for date and time * lib/rdcut.cpp - Reworked START_DATETIME and END_DATETIME to save the SQL ifs. I believe this makes it easier to read and understand. - The >QDate(1900,1,1) and < 8000 is probably not needed but I left it there just in case. * lib/rdescape_string.cpp - Reworked to add extra " if the date is not NULL see issue 121 * lib/rdfeed.cpp && lib/rdpodcast.cpp - Had to add a SetRow for QDateTime as with the string conversion the existing SetRow would add an extra set of " * lib/rdsound_panel.cpp && rdairplay/log_traffic.cpp && utils/rddgimport/rddgimport.cpp - Added a QString to contain EVENT_DATETIME to prevent double checks of date and time separately (similar to lib/rdcartslot.cpp) * rdcatchd/rdcatchd.cpp - Reverted the changes. The RML here is not touching the DB so is fine, plus with the RDCheckDateTime changes you'd have extra " unless it was NULL * tests/sas_switch_torture.cpp && sas_torture.cpp - Included missing rdescape_string.h --- importers/rivendell_filter.cpp | 10 ++--- lib/rdcart.cpp | 8 ++-- lib/rdcartslot.cpp | 15 ++++---- lib/rdcut.cpp | 58 +++++++++++++++++------------ lib/rdescape_string.cpp | 6 +-- lib/rdevent_line.cpp | 2 +- lib/rdfeed.cpp | 18 ++++++++- lib/rdlog.cpp | 4 +- lib/rdlog_event.cpp | 2 +- lib/rdpodcast.cpp | 19 +++++++++- lib/rdrecording.cpp | 2 +- lib/rdreport.cpp | 10 ++--- lib/rdsound_panel.cpp | 10 ++++- lib/rdsvc.cpp | 2 +- rdairplay/log_traffic.cpp | 14 +++++-- rdcatchd/rdcatchd.cpp | 2 +- tests/sas_switch_torture.cpp | 3 +- tests/sas_torture.cpp | 3 +- utils/rddgimport/rddgimport.cpp | 8 +++- utils/rdimport/rdimport.cpp | 4 +- web/rdcastmanager/rdcastmanager.cpp | 2 +- 21 files changed, 131 insertions(+), 71 deletions(-) diff --git a/importers/rivendell_filter.cpp b/importers/rivendell_filter.cpp index fdef11de..d1ea9b58 100644 --- a/importers/rivendell_filter.cpp +++ b/importers/rivendell_filter.cpp @@ -274,7 +274,7 @@ MainObject::MainObject(QObject *parent) TITLE=\"%s\",\ ARTIST=\"%s\",\ ALBUM=\"%s\",\ - YEAR=\"%s\",\ + YEAR=%s,\ ISRC=\"%s\",\ LABEL=\"%s\",\ CLIENT=\"%s\",\ @@ -347,7 +347,7 @@ MainObject::MainObject(QObject *parent) start_datetime="null"; } else { - start_datetime=QString().sprintf("\"%s\"", + start_datetime=QString().sprintf("%s", (const char *)RDCheckDateTime(q1->value(7). toDateTime(),"yyyy-MM-dd hh:mm:ss"));//Could be invalid (0000-00-00) } @@ -355,7 +355,7 @@ MainObject::MainObject(QObject *parent) end_datetime="null"; } else { - end_datetime=QString().sprintf("\"%s\"", + end_datetime=QString().sprintf("%s", (const char *)RDCheckDateTime(q1->value(8). toDateTime(),"yyyy-MM-dd hh:mm:ss"));//Could be invalid (0000-00-00) } @@ -363,7 +363,7 @@ MainObject::MainObject(QObject *parent) start_daypart="null"; } else { - start_daypart=QString().sprintf("\"%s\"", + start_daypart=QString().sprintf("%s", (const char *)RDCheckDateTime(q1->value(16). toTime(),"hh:mm:ss"));//Invalid possible? } @@ -371,7 +371,7 @@ MainObject::MainObject(QObject *parent) end_daypart="null"; } else { - end_daypart=QString().sprintf("\"%s\"", + end_daypart=QString().sprintf("%s", (const char *)RDCheckDateTime(q1->value(17). toTime(),"hh:mm:ss"));//Invalid possible? } diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index b448cda5..28181c68 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -1206,14 +1206,14 @@ void RDCart::updateLength(bool enforce_length,unsigned length) sql+="START_DATETIME=NULL,"; } else { - sql+=QString().sprintf("START_DATETIME=\"%s\",", + sql+=QString().sprintf("START_DATETIME=%s,", (const char *)RDCheckDateTime(start_datetime,"yyyy-MM-dd hh:mm:ss")); } if(end_datetime.isNull()||(!dates_valid)) { sql+="END_DATETIME=NULL,"; } else { - sql+=QString().sprintf("END_DATETIME=\"%s\",", + sql+=QString().sprintf("END_DATETIME=%s,", (const char *)RDCheckDateTime(end_datetime,"yyyy-MM-dd hh:mm:ss")); } sql+=QString().sprintf("VALIDITY=%u where NUMBER=%u", @@ -1738,7 +1738,7 @@ void RDCart::SetRow(const QString ¶m,const QDateTime &value) const RDSqlQuery *q; QString sql; - sql=QString().sprintf("UPDATE CART SET %s=\"%s\" WHERE NUMBER=%u", + sql=QString().sprintf("UPDATE CART SET %s=%s WHERE NUMBER=%u", (const char *)param, (const char *)RDCheckDateTime(value,"yyyy-MM-dd hh:mm:ss"), cart_number); @@ -1752,7 +1752,7 @@ void RDCart::SetRow(const QString ¶m,const QDate &value) const RDSqlQuery *q; QString sql; - sql=QString().sprintf("UPDATE CART SET %s=\"%s\" WHERE NUMBER=%u", + sql=QString().sprintf("UPDATE CART SET %s=%s WHERE NUMBER=%u", (const char *)param, (const char *)RDCheckDateTime(value,"yyyy-MM-dd"), cart_number); diff --git a/lib/rdcartslot.cpp b/lib/rdcartslot.cpp index eaa43549..50073771 100644 --- a/lib/rdcartslot.cpp +++ b/lib/rdcartslot.cpp @@ -670,6 +670,8 @@ void RDCartSlot::LogPlayout(RDPlayDeck::State state) datetime.setDate(datetime.date().addDays(-1)); } if(!slot_svcname.isEmpty()) { + QDateTime eventDateTime=QDateTime::QDateTime(datetime::date(), + slot_logline->startTime(RDLogLine::Actual)); QString svctablename=slot_svcname; svctablename.replace(" ","_"); sql=QString("insert into `")+svctablename+"_SRT` set "+ @@ -687,19 +689,18 @@ void RDCartSlot::LogPlayout(RDPlayDeck::State state) slot_logline->usageCode(), slot_logline->startSource())+ "STATION_NAME=\""+RDEscapeString(slot_station->name())+"\","+ - "EVENT_DATETIME=\""+datetime.toString("yyyy-MM-dd")+ - " "+RDCheckDateTime( - slot_logline->startTime(RDLogLine::Actual),"hh:mm:ss")+"\","+ - "EXT_START_TIME=\""+RDCheckDateTime( - slot_logline->extStartTime(),"hh:mm:ss")+"\","+ + "EVENT_DATETIME="+RDCheckDateTime(eventDateTime,"yyyy-MM-dd hh:mm:ss")+ + ","+ + "EXT_START_TIME="+RDCheckDateTime( + slot_logline->extStartTime(),"hh:mm:ss")+","+ "EXT_DATA=\""+RDEscapeString(slot_logline->extData())+"\","+ "EXT_EVENT_ID=\""+RDEscapeString(slot_logline->extEventId())+"\","+ "EXT_ANNC_TYPE=\""+RDEscapeString(slot_logline->extAnncType())+"\","+ "EXT_CART_NAME=\""+RDEscapeString(slot_logline->extCartName())+"\","+ "TITLE=\""+RDEscapeString(slot_logline->title())+"\","+ "ARTIST=\""+RDEscapeString(slot_logline->artist())+"\","+ - "SCHEDULED_TIME=\""+RDCheckDateTime( - slot_logline->startTime(RDLogLine::Logged),"hh:mm:ss")+"\","+ + "SCHEDULED_TIME="+RDCheckDateTime( + slot_logline->startTime(RDLogLine::Logged),"hh:mm:ss")+","+ "ISRC=\""+RDEscapeString(slot_logline->isrc())+"\","+ "PUBLISHER=\""+RDEscapeString(slot_logline->publisher())+"\","+ "COMPOSER=\""+RDEscapeString(slot_logline->composer())+"\","+ diff --git a/lib/rdcut.cpp b/lib/rdcut.cpp index 2bfacc8f..f0572cfb 100644 --- a/lib/rdcut.cpp +++ b/lib/rdcut.cpp @@ -1060,8 +1060,8 @@ void RDCut::setMetadata(RDWaveData *data) const } if(data->daypartStartTime().isValid()&&data->daypartEndTime().isValid()&& (data->daypartStartTime()daypartEndTime())) { - sql+="START_DAYPART=\""+RDCheckDateTime(data->daypartStartTime(),"hh:mm:ss")+"\","+ - "END_DAYPART=\""+RDCheckDateTime(data->daypartEndTime(),"hh:mm:ss")+"\","; + sql+="START_DAYPART="+RDCheckDateTime(data->daypartStartTime(),"hh:mm:ss")+","+ + "END_DAYPART="+RDCheckDateTime(data->daypartEndTime(),"hh:mm:ss")+","; } if((data->hookStartPos()>=data->startPos())&& (data->hookStartPos()<=data->endPos())&& @@ -1079,26 +1079,36 @@ void RDCut::setMetadata(RDWaveData *data) const (data->fadeDownPos()<=data->endPos())) { sql+=QString().sprintf("FADEDOWN_POINT=%d,",data->fadeDownPos()); } - if((data->startDate()>QDate(1900,1,1))&&(data->endDate().year()<8000)) { - if(data->startTime().isValid()) { - sql+=QString().sprintf("START_DATETIME=\"%s %s\",", - (const char *)RDCheckDateTime(data->startDate(),"yyyy-MM-dd"), - (const char *)RDCheckDateTime(data->startTime(),"hh:mm:ss")); - } - else { - sql+=QString().sprintf("START_DATETIME=\"%s 00:00:00\",", - (const char *)RDCheckDateTime(data->startDate(),"yyyy-MM-dd")); - } + if(data->startDate().isValid() && + (data->startDate()>QDate(1900,1,1))&&(data->endDate().year()<8000)) { + + /* Reworked, + * if date not valid, do nothing + * if time valid use date + time + * else use date + 00:00:00 + */ + QDateTime startDateTime(data->startDate()); + + if(data->startTime().isValid()) + startDateTime.setTime(data->startTime()); + else + startDateTime.setTime(QTime(0,0,0)); + + sql+=QString().sprintf("START_DATETIME=%s,", + (const char *)RDCheckDateTime(startDateTime)); + if(data->endDate().isValid()&&(data->endDate().year()<8000)) { - if(data->endTime().isValid()) { - sql+=QString().sprintf("END_DATETIME=\"%s %s\",", - (const char *)RDCheckDateTime(data->endDate(),"yyyy-MM-dd"), - (const char *)RDCheckDateTime(data->endTime(),"hh:mm:ss")); - } - else { - sql+=QString().sprintf("END_DATETIME=\"%s 23:59:59\",", - (const char *)RDCheckDateTime(data->endDate(),"yyyy-MM-dd")); - } + + // Reworked as START_DATETIME + QDateTime endDateTime(data->endDate()); + + if(data->endTime().isValid()) + endDateTime.setTime(data->endTime()); + else + endDateTime.setTime(QTime(23,59,59)); + + sql+=QString().sprintf("END_DATETIME=%s,", + (const char *)RDCheckDateTime(endDateTime,"yyyy-MM-dd hh:mm:ss")); } } if(sql.right(1)==",") { @@ -1597,7 +1607,7 @@ void RDCut::SetRow(const QString ¶m,const QDateTime &value) const RDSqlQuery *q; QString sql; - sql=QString().sprintf("UPDATE CUTS SET %s=\"%s\" WHERE CUT_NAME=\"%s\"", + sql=QString().sprintf("UPDATE CUTS SET %s=%s WHERE CUT_NAME=\"%s\"", (const char *)param, (const char *)RDCheckDateTime(value,"yyyy-MM-dd hh:mm:ss"), (const char *)cut_name); @@ -1611,7 +1621,7 @@ void RDCut::SetRow(const QString ¶m,const QDate &value) const RDSqlQuery *q; QString sql; - sql=QString().sprintf("UPDATE CUTS SET %s=\"%s\" WHERE CUT_NAME=\"%s\"", + sql=QString().sprintf("UPDATE CUTS SET %s=%s WHERE CUT_NAME=\"%s\"", (const char *)param, (const char *)RDCheckDateTime(value,"yyyy-MM-dd"), (const char *)cut_name); @@ -1624,7 +1634,7 @@ void RDCut::SetRow(const QString ¶m,const QTime &value) const { RDSqlQuery *q; QString sql; - sql=QString().sprintf("UPDATE CUTS SET %s=\"%s\" WHERE CUT_NAME=\"%s\"", + sql=QString().sprintf("UPDATE CUTS SET %s=%s WHERE CUT_NAME=\"%s\"", (const char *)param, (const char *)RDCheckDateTime(value,"hh:mm:ss"), (const char *)cut_name); diff --git a/lib/rdescape_string.cpp b/lib/rdescape_string.cpp index 12af1d39..c2a1c6f7 100644 --- a/lib/rdescape_string.cpp +++ b/lib/rdescape_string.cpp @@ -34,7 +34,7 @@ QString RDCheckDateTime(QTime const &time, QString const &format) QString checkedValue = "NULL"; if(time.isValid()) - checkedValue = time.toString(format); + checkedValue = "\"" + time.toString(format) + "\""; return checkedValue; @@ -51,7 +51,7 @@ QString RDCheckDateTime(QDateTime const &datetime, QString const &format) QString checkedValue = "NULL"; if(datetime.isValid()) - checkedValue = datetime.toString(format); + checkedValue = "\"" + datetime.toString(format) + "\""; return checkedValue; @@ -68,7 +68,7 @@ QString RDCheckDateTime(QDate const &date, QString const &format) QString checkedValue = "NULL"; if(date.isValid()) - checkedValue = date.toString(format); + checkedValue = "\"" + date.toString(format) + "\""; return checkedValue; diff --git a/lib/rdevent_line.cpp b/lib/rdevent_line.cpp index 190cdc7e..6fd227ca 100644 --- a/lib/rdevent_line.cpp +++ b/lib/rdevent_line.cpp @@ -814,7 +814,7 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname, sql=QString().sprintf("insert into `%s_LOG` set ID=%d,COUNT=%d,TYPE=%d,\ SOURCE=%d,START_TIME=%d,GRACE_TIME=%d, \ CART_NUMBER=%u,TIME_TYPE=%d,POST_POINT=\"%s\", \ - TRANS_TYPE=%d,EXT_START_TIME=\"%s\",\ + TRANS_TYPE=%d,EXT_START_TIME=%s,\ EVENT_LENGTH=%d", (const char *)logname,count,count, RDLogLine::Cart,source, diff --git a/lib/rdfeed.cpp b/lib/rdfeed.cpp index 30d9ceca..d24a19d2 100644 --- a/lib/rdfeed.cpp +++ b/lib/rdfeed.cpp @@ -320,7 +320,7 @@ QDateTime RDFeed::lastBuildDateTime() const void RDFeed::setLastBuildDateTime(const QDateTime &datetime) const { - SetRow("LAST_BUILD_DATETIME",RDCheckDateTime(datetime,"yyyy-MM-dd hh:mm:ss")); + SetRow("LAST_BUILD_DATETIME",datetime,"yyyy-MM-dd hh:mm:ss"); } @@ -333,7 +333,7 @@ QDateTime RDFeed::originDateTime() const void RDFeed::setOriginDateTime(const QDateTime &datetime) const { - SetRow("ORIGIN_DATETIME",RDCheckDateTime(datetime,"yyyy-MM-dd hh:mm:ss")); + SetRow("ORIGIN_DATETIME",datetime,"yyyy-MM-dd hh:mm:ss"); } @@ -896,3 +896,17 @@ void RDFeed::SetRow(const QString ¶m,const QString &value) const q=new RDSqlQuery(sql); delete q; } + +void RDFeed::SetRow(const QString ¶m,const QDateTime &value, + const QString format) const +{ + RDSqlQuery *q; + QString sql; + + sql=QString().sprintf("UPDATE FEEDS SET %s=%s WHERE KEY_NAME=\"%s\"", + (const char *)param, + (const char *)RDCheckDateTime(value, format), + (const char *)feed_keyname); + q=new RDSqlQuery(sql); + delete q; +} \ No newline at end of file diff --git a/lib/rdlog.cpp b/lib/rdlog.cpp index e7617ea2..931d5955 100644 --- a/lib/rdlog.cpp +++ b/lib/rdlog.cpp @@ -661,7 +661,7 @@ void RDLog::SetRow(const QString ¶m,const QDate &value) const RDSqlQuery *q; QString sql; - sql=QString().sprintf("UPDATE LOGS SET %s=\"%s\" WHERE NAME=\"%s\"", + sql=QString().sprintf("UPDATE LOGS SET %s=%s WHERE NAME=\"%s\"", (const char *)param, (const char *)RDCheckDateTime(value,"yyyy/MM/dd"), (const char *)RDEscapeString(log_name)); @@ -675,7 +675,7 @@ void RDLog::SetRow(const QString ¶m,const QDateTime &value) const RDSqlQuery *q; QString sql; - sql=QString().sprintf("UPDATE LOGS SET %s=\"%s\" WHERE NAME=\"%s\"", + sql=QString().sprintf("UPDATE LOGS SET %s=%s WHERE NAME=\"%s\"", (const char *)param, (const char *)RDCheckDateTime(value,"yyyy-MM-dd hh:mm:ss"), (const char *)RDEscapeString(log_name)); diff --git a/lib/rdlog_event.cpp b/lib/rdlog_event.cpp index ea7ecd25..35e231bc 100644 --- a/lib/rdlog_event.cpp +++ b/lib/rdlog_event.cpp @@ -1186,7 +1186,7 @@ void RDLogEvent::InsertLines(QString values) { void RDLogEvent::InsertLineValues(QString *query, int line) { // one line to save query space - QString sql=QString().sprintf("(%d,%d,%u,%d,%d,%d,%d,%d,%d,%d,%d,\"%s\",\"%s\",%d,%d,\"%s\",%d,\"%s\",\"%s\",\"%s\",\"%s\",%d,%d,%d,%d,%d,\"%s\",%d,%d,%d,\"%s\",\"%s\",\"%s\",%d,%d,%d,%d,%d)", + QString sql=QString().sprintf("(%d,%d,%u,%d,%d,%d,%d,%d,%d,%d,%d,\"%s\",\"%s\",%d,%d,%s,%d,\"%s\",\"%s\",\"%s\",\"%s\",%d,%d,%d,%d,%d,\"%s\",%d,%d,%d,\"%s\",\"%s\",%s,%d,%d,%d,%d,%d)", log_line[line]->id(), line, log_line[line]->cartNumber(), diff --git a/lib/rdpodcast.cpp b/lib/rdpodcast.cpp index 28e56155..f0766f30 100644 --- a/lib/rdpodcast.cpp +++ b/lib/rdpodcast.cpp @@ -209,7 +209,7 @@ QDateTime RDPodcast::originDateTime() const void RDPodcast::setOriginDateTime(const QDateTime &datetime) const { - SetRow("ORIGIN_DATETIME",RDCheckDateTime(datetime,"yyyy-MM-dd hh:mm:ss")); + SetRow("ORIGIN_DATETIME",datetime,"yyyy-MM-dd hh:mm:ss"); } @@ -222,7 +222,7 @@ QDateTime RDPodcast::effectiveDateTime() const void RDPodcast::setEffectiveDateTime(const QDateTime &datetime) const { - SetRow("EFFECTIVE_DATETIME",RDCheckDateTime(datetime,"yyyy-MM-dd hh:mm:ss")); + SetRow("EFFECTIVE_DATETIME",datetime,"yyyy-MM-dd hh:mm:ss"); } @@ -398,3 +398,18 @@ void RDPodcast::SetRow(const QString ¶m,const QString &value) const q=new RDSqlQuery(sql); delete q; } + + +void RDPodcast::SetRow(const QString ¶m,const QDateTime &value, + const QString &format) const +{ + RDSqlQuery *q; + QString sql; + + sql=QString().sprintf("UPDATE PODCASTS SET %s=%s WHERE ID=%u", + (const char *)param, + (const char *)RDCheckDateTime(value, format), + podcast_id); + q=new RDSqlQuery(sql); + delete q; +} \ No newline at end of file diff --git a/lib/rdrecording.cpp b/lib/rdrecording.cpp index 72bbbb73..3b95ec09 100644 --- a/lib/rdrecording.cpp +++ b/lib/rdrecording.cpp @@ -945,7 +945,7 @@ void RDRecording::SetRow(const QString ¶m,const QTime &value) const RDSqlQuery *q; QString sql; - sql=QString().sprintf("update RECORDINGS set %s=\"%s\" where ID=%d", + sql=QString().sprintf("update RECORDINGS set %s=%s where ID=%d", (const char *)param, (const char *)RDCheckDateTime(value,"hh:mm:ss"),rec_id); q=new RDSqlQuery(sql); diff --git a/lib/rdreport.cpp b/lib/rdreport.cpp index 24db452b..71ee8fee 100644 --- a/lib/rdreport.cpp +++ b/lib/rdreport.cpp @@ -557,8 +557,8 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate, q1->value(1).toUInt(), q1->value(2).toInt())+ "STATION_NAME=\""+RDEscapeString(q1->value(3).toString())+"\","+ - "EVENT_DATETIME=\""+RDCheckDateTime(q1->value(4).toDateTime(), - "yyyy-MM-dd hh:mm:ss")+"\","+ + "EVENT_DATETIME="+RDCheckDateTime(q1->value(4).toDateTime(), + "yyyy-MM-dd hh:mm:ss")+","+ QString().sprintf("EVENT_TYPE=%d,",q1->value(5).toInt())+ "EXT_START_TIME=\""+RDEscapeString(q1->value(6).toString())+"\","+ QString().sprintf("EXT_LENGTH=%d,",q1->value(7).toInt())+ @@ -573,8 +573,8 @@ bool RDReport::generateReport(const QDate &startdate,const QDate &enddate, "LOG_NAME=\""+RDEscapeString(q1->value(15).toString())+"\","+ "TITLE=\""+RDEscapeString(q1->value(16).toString())+"\","+ "ARTIST=\""+RDEscapeString(q1->value(17).toString())+"\","+ - "SCHEDULED_TIME=\""+ - RDCheckDateTime(q1->value(18).toDate(),"yyyy-MM-dd hh:mm:ss")+"\","+ + "SCHEDULED_TIME="+ + RDCheckDateTime(q1->value(18).toDate(),"yyyy-MM-dd hh:mm:ss")+","+ QString().sprintf("START_SOURCE=%d,",q1->value(19).toInt())+ "PUBLISHER=\""+RDEscapeString(q1->value(20).toString())+"\","+ "COMPOSER=\""+RDEscapeString(q1->value(21).toString())+"\","+ @@ -923,7 +923,7 @@ void RDReport::SetRow(const QString ¶m,const QTime &value) const RDSqlQuery *q; QString sql; - sql=QString().sprintf("UPDATE REPORTS SET %s=\"%s\" WHERE NAME=\"%s\"", + sql=QString().sprintf("UPDATE REPORTS SET %s=%s WHERE NAME=\"%s\"", (const char *)param, (const char *)RDCheckDateTime(value, "hh:mm:ss"), (const char *)report_name); diff --git a/lib/rdsound_panel.cpp b/lib/rdsound_panel.cpp index bdabe5c9..22798402 100644 --- a/lib/rdsound_panel.cpp +++ b/lib/rdsound_panel.cpp @@ -1485,13 +1485,19 @@ void RDSoundPanel::LogTraffic(RDPanelButton *button) "CUTS.CUT_NAME=\""+RDEscapeString(button->cutName())+"\""; q=new RDSqlQuery(sql); if(q->first()) { + + QString eventDateTimeSQL = "NULL"; + + if(dateTime.isValid() && button->startTime().isValid()) + eventDateTimeSQL = RDCheckDateTime(QDateTime(dateTime.date(), + button->startTime()), "yyyy-MM-dd hh:mm:ss"); + sql=QString("insert into `")+panel_svcname+"_SRT` set "+ QString().sprintf("LENGTH=%d,",button->startTime(). msecsTo(datetime.time()))+ QString().sprintf("CART_NUMBER=%u,",button->cart())+ "STATION_NAME=\""+RDEscapeString(panel_station->name().utf8())+"\","+ - "EVENT_DATETIME=\""+datetime.toString("yyyy-MM-dd")+" "+ - RDCheckDateTime(button->startTime(),"hh:mm:ss")+"\","+ + "EVENT_DATETIME="+eventDateTimeSQL+","+ QString().sprintf("EVENT_TYPE=%d,",RDAirPlayConf::TrafficStop)+ QString().sprintf("EVENT_SOURCE=%d,",RDLogLine::SoundPanel)+ QString().sprintf("PLAY_SOURCE=%d,",RDLogLine::SoundPanel)+ diff --git a/lib/rdsvc.cpp b/lib/rdsvc.cpp index 8157fc06..c253d671 100644 --- a/lib/rdsvc.cpp +++ b/lib/rdsvc.cpp @@ -788,7 +788,7 @@ bool RDSvc::generateLog(const QDate &date,const QString &logname, SERVICE=\"%s\",DESCRIPTION=\"%s\",\ ORIGIN_USER=\"%s\",ORIGIN_DATETIME=now(),\ LINK_DATETIME=now(),MODIFIED_DATETIME=now(),\ - PURGE_DATE=\"%s\"", + PURGE_DATE=%s", (const char *)RDEscapeString(logname), (const char *)RDEscapeString(svc_name), (const char *)RDEscapeString(RDDateDecode(descriptionTemplate(),date)), diff --git a/rdairplay/log_traffic.cpp b/rdairplay/log_traffic.cpp index 62cd812e..2e42755e 100644 --- a/rdairplay/log_traffic.cpp +++ b/rdairplay/log_traffic.cpp @@ -44,14 +44,20 @@ void LogTraffic(const QString &svcname,const QString &logname, if((logline==NULL)||(svcname.isEmpty())) { return; } + + QString eventDateTimeSQL = "NULL"; + + if(datetime.isValid() && logline->startTime(RDLogLine::Actual).isValid()) + eventDateTimeSQL = RDCheckDateTime(QDateTime(datetime.date(), + logline->startTime(RDLogLine::Actual)), "yyyy-MM-dd hh:mm:ss"); + sql=QString("insert into `")+RDSvc::svcTableName(svcname)+"` set "+ QString().sprintf("LENGTH=%d,",length)+ "LOG_NAME=\""+RDEscapeString(logname.utf8())+"\","+ QString().sprintf("LOG_ID=%d,",logline->id())+ QString().sprintf("CART_NUMBER=%u,",logline->cartNumber())+ "STATION_NAME=\""+RDEscapeString(rdstation_conf->name().utf8())+"\","+ - "EVENT_DATETIME=\""+datetime.toString("yyyy-MM-dd")+" "+ - RDCheckDateTime(logline->startTime(RDLogLine::Actual),"hh:mm:ss")+"\","+ + "EVENT_DATETIME="+eventDateTimeSQL+","+ QString().sprintf("EVENT_TYPE=%d,",action)+ QString().sprintf("EVENT_SOURCE=%d,",logline->source())+ "EXT_START_TIME=\""+RDCheckDateTime(logline->extStartTime(),"hh:mm:ss")+"\","+ @@ -64,8 +70,8 @@ void LogTraffic(const QString &svcname,const QString &logname, "EXT_CART_NAME=\""+RDEscapeString(logline->extCartName().utf8())+"\","+ "TITLE=\""+RDEscapeString(logline->title().utf8())+"\","+ "ARTIST=\""+RDEscapeString(logline->artist().utf8())+"\","+ - "SCHEDULED_TIME=\""+RDCheckDateTime(logline->startTime(RDLogLine::Logged), - "hh:mm:ss")+"\","+ + "SCHEDULED_TIME="+RDCheckDateTime(logline->startTime(RDLogLine::Logged), + "hh:mm:ss")+","+ "ISRC=\""+RDEscapeString(logline->isrc().utf8())+"\","+ "PUBLISHER=\""+RDEscapeString(logline->publisher().utf8())+"\","+ "COMPOSER=\""+RDEscapeString(logline->composer().utf8())+"\","+ diff --git a/rdcatchd/rdcatchd.cpp b/rdcatchd/rdcatchd.cpp index 54964716..76c69758 100644 --- a/rdcatchd/rdcatchd.cpp +++ b/rdcatchd/rdcatchd.cpp @@ -2609,7 +2609,7 @@ void MainObject::ResolveErrorWildcards(CatchEvent *event, rml->replace("%d",event->description()); rml->replace("%e",err_desc); // Error Description rml->replace("%i",QString().sprintf("%u",event->id())); - rml->replace("%t",RDCheckDateTime(event->startTime(),"hh:mm:ss")); + rml->replace("%t",event->startTime().toString("hh:mm:ss")); rml->replace("%y",RDRecording::typeString(event->type())); switch(event->type()) { case RDRecording::Recording: diff --git a/tests/sas_switch_torture.cpp b/tests/sas_switch_torture.cpp index a2112c19..8e8bef87 100644 --- a/tests/sas_switch_torture.cpp +++ b/tests/sas_switch_torture.cpp @@ -29,6 +29,7 @@ #include #include #include +#include MainWidget::MainWidget(QWidget *parent) :QWidget(parent) @@ -123,7 +124,7 @@ void MainWidget::generateData() SUN=\'Y\',MON=\'Y\',TUE=\'Y\',WED=\'Y\',THU=\'Y\',\ FRI=\'Y\',SAT=\'Y\',DESCRIPTION=\"%s\",\ CUT_NAME=\"SAS_SWITCH_TORTURE\",\ - START_TIME=\"%s\",TYPE=1", + START_TIME=%s,TYPE=1", SAS_STATION, SAS_MATRIX, j+1, diff --git a/tests/sas_torture.cpp b/tests/sas_torture.cpp index 714f6947..c24ef3bc 100644 --- a/tests/sas_torture.cpp +++ b/tests/sas_torture.cpp @@ -29,6 +29,7 @@ #include #include #include +#include MainWidget::MainWidget(QWidget *parent) :QWidget(parent) @@ -137,7 +138,7 @@ void MainWidget::generateData() SUN=\'Y\',MON=\'Y\',TUE=\'Y\',WED=\'Y\',THU=\'Y\',\ FRI=\'Y\',SAT=\'Y\',DESCRIPTION=\"%s\",\ CUT_NAME=\"SAS_TORTURE\",MACRO_CART=%d,\ - START_TIME=\"%s\",TYPE=1", + START_TIME=%s,TYPE=1", SAS_STATION, (const char *)desc, CART_START+j, diff --git a/utils/rddgimport/rddgimport.cpp b/utils/rddgimport/rddgimport.cpp index d1d55ca5..75d9e741 100644 --- a/utils/rddgimport/rddgimport.cpp +++ b/utils/rddgimport/rddgimport.cpp @@ -431,6 +431,12 @@ bool MainWidget::CheckSpot(const QString &isci) QDate today=QDate::currentDate(); QDate killdate=dg_date_edit->date().addDays(RDDGIMPORT_KILLDATE_OFFSET); + QString endDateTimeSQL = "NULL"; + + if(killdate.isValid()) + endDateTimeSQL = RDCheckDateTime(QDateTime(killdate,QTime(23,59,59)), + "yyyy-MM-dd hh:mm:ss"); + sql=QString("select CUT_NAME,CUTS.START_DATETIME,CUTS.END_DATETIME ")+ "from CART left join CUTS on CART.NUMBER=CUTS.CART_NUMBER "+ "where (CART.GROUP_NAME=\""+RDEscapeString(dg_svc->autospotGroup())+"\")&&" @@ -443,7 +449,7 @@ bool MainWidget::CheckSpot(const QString &isci) if(q->value(1).isNull()) { sql+="START_DATETIME=\""+today.toString("yyyy-MM-dd")+" 00:00:00\","; } - sql+="END_DATETIME=\""+RDCheckDateTime(killdate,"yyyy-MM-dd")+" 23:59:59\" "; + sql+="END_DATETIME="+endDateTimeSQL+" "; sql+="where CUT_NAME=\""+q->value(0).toString()+"\""; q1=new RDSqlQuery(sql); delete q1; diff --git a/utils/rdimport/rdimport.cpp b/utils/rdimport/rdimport.cpp index ef47fda6..31c7faf7 100644 --- a/utils/rdimport/rdimport.cpp +++ b/utils/rdimport/rdimport.cpp @@ -1864,13 +1864,13 @@ void MainObject::WriteTimestampCache(const QString &filename, sql=QString().sprintf("insert into DROPBOX_PATHS set \ DROPBOX_ID=%d,\ FILE_PATH=\"%s\",\ - FILE_DATETIME=\"%s\"", + FILE_DATETIME=%s", import_persistent_dropbox_id, (const char *)RDEscapeString(filename), (const char *)RDCheckDateTime(dt,"yyyy-MM-dd hh:mm:ss")); } else { - sql=QString().sprintf("update DROPBOX_PATHS set FILE_DATETIME=\"%s\" \ + sql=QString().sprintf("update DROPBOX_PATHS set FILE_DATETIME=%s \ where (DROPBOX_ID=%d)&&(FILE_PATH=\"%s\")", (const char *)RDCheckDateTime(dt,"yyyy-MM-dd hh:mm:ss"), import_persistent_dropbox_id, diff --git a/web/rdcastmanager/rdcastmanager.cpp b/web/rdcastmanager/rdcastmanager.cpp index 1cd73bff..dadc75bd 100644 --- a/web/rdcastmanager/rdcastmanager.cpp +++ b/web/rdcastmanager/rdcastmanager.cpp @@ -1310,7 +1310,7 @@ void MainObject::CommitCast() ITEM_SOURCE_TEXT=\"%s\",\ ITEM_SOURCE_URL=\"%s\",\ SHELF_LIFE=%d,\ - EFFECTIVE_DATETIME=\"%s\" \ + EFFECTIVE_DATETIME=%s \ where ID=%d", status, (const char *)RDEscapeString(item_title), From 8baed5b1041d53efcc91e235076f8e6d466a3667 Mon Sep 17 00:00:00 2001 From: Wayne Merricks Date: Thu, 9 Jun 2016 22:46:07 +0100 Subject: [PATCH 24/25] Random Idiocy fixes Compilation fixes due to idiocy as usual (apologies) --- lib/rdcartslot.cpp | 2 +- lib/rdcut.cpp | 2 +- lib/rdfeed.cpp | 2 +- lib/rdfeed.h | 2 ++ lib/rdpodcast.h | 1 + lib/rdsound_panel.cpp | 4 ++-- 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/rdcartslot.cpp b/lib/rdcartslot.cpp index 50073771..d62ad774 100644 --- a/lib/rdcartslot.cpp +++ b/lib/rdcartslot.cpp @@ -670,7 +670,7 @@ void RDCartSlot::LogPlayout(RDPlayDeck::State state) datetime.setDate(datetime.date().addDays(-1)); } if(!slot_svcname.isEmpty()) { - QDateTime eventDateTime=QDateTime::QDateTime(datetime::date(), + QDateTime eventDateTime(datetime.date(), slot_logline->startTime(RDLogLine::Actual)); QString svctablename=slot_svcname; svctablename.replace(" ","_"); diff --git a/lib/rdcut.cpp b/lib/rdcut.cpp index f0572cfb..6e9c36c6 100644 --- a/lib/rdcut.cpp +++ b/lib/rdcut.cpp @@ -1095,7 +1095,7 @@ void RDCut::setMetadata(RDWaveData *data) const startDateTime.setTime(QTime(0,0,0)); sql+=QString().sprintf("START_DATETIME=%s,", - (const char *)RDCheckDateTime(startDateTime)); + (const char *)RDCheckDateTime(startDateTime,"yyyy-MM-dd hh:mm:ss")); if(data->endDate().isValid()&&(data->endDate().year()<8000)) { diff --git a/lib/rdfeed.cpp b/lib/rdfeed.cpp index d24a19d2..54d43c80 100644 --- a/lib/rdfeed.cpp +++ b/lib/rdfeed.cpp @@ -898,7 +898,7 @@ void RDFeed::SetRow(const QString ¶m,const QString &value) const } void RDFeed::SetRow(const QString ¶m,const QDateTime &value, - const QString format) const + const QString &format) const { RDSqlQuery *q; QString sql; diff --git a/lib/rdfeed.h b/lib/rdfeed.h index 67bd2c19..e64af84d 100644 --- a/lib/rdfeed.h +++ b/lib/rdfeed.h @@ -123,6 +123,8 @@ class RDFeed : public QObject QString GetTempFilename() const; void SetRow(const QString ¶m,int value) const; void SetRow(const QString ¶m,const QString &value) const; + void SetRow(const QString ¶m,const QDateTime &value, + const QString &format) const; QString feed_keyname; unsigned feed_id; }; diff --git a/lib/rdpodcast.h b/lib/rdpodcast.h index c4080e94..f89ec2f6 100644 --- a/lib/rdpodcast.h +++ b/lib/rdpodcast.h @@ -76,6 +76,7 @@ class RDPodcast private: void SetRow(const QString ¶m,int value) const; void SetRow(const QString ¶m,const QString &value) const; + void SetRow(const QString ¶m,const QDateTime &datetime,const QString &value) const; QString podcast_keyname; unsigned podcast_id; }; diff --git a/lib/rdsound_panel.cpp b/lib/rdsound_panel.cpp index 22798402..982c82d0 100644 --- a/lib/rdsound_panel.cpp +++ b/lib/rdsound_panel.cpp @@ -1488,8 +1488,8 @@ void RDSoundPanel::LogTraffic(RDPanelButton *button) QString eventDateTimeSQL = "NULL"; - if(dateTime.isValid() && button->startTime().isValid()) - eventDateTimeSQL = RDCheckDateTime(QDateTime(dateTime.date(), + if(datetime.isValid() && button->startTime().isValid()) + eventDateTimeSQL = RDCheckDateTime(QDateTime(datetime.date(), button->startTime()), "yyyy-MM-dd hh:mm:ss"); sql=QString("insert into `")+panel_svcname+"_SRT` set "+ From d90a226e7037047312ca250e69d96cf771620aaf Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Tue, 14 Jun 2016 12:31:02 -0400 Subject: [PATCH 25/25] Minor formatting tweaks --- lib/rdcartslot.cpp | 6 +++--- lib/rdcut.cpp | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/rdcartslot.cpp b/lib/rdcartslot.cpp index d62ad774..23bc740c 100644 --- a/lib/rdcartslot.cpp +++ b/lib/rdcartslot.cpp @@ -692,15 +692,15 @@ void RDCartSlot::LogPlayout(RDPlayDeck::State state) "EVENT_DATETIME="+RDCheckDateTime(eventDateTime,"yyyy-MM-dd hh:mm:ss")+ ","+ "EXT_START_TIME="+RDCheckDateTime( - slot_logline->extStartTime(),"hh:mm:ss")+","+ + slot_logline->extStartTime(),"hh:mm:ss")+","+ "EXT_DATA=\""+RDEscapeString(slot_logline->extData())+"\","+ "EXT_EVENT_ID=\""+RDEscapeString(slot_logline->extEventId())+"\","+ "EXT_ANNC_TYPE=\""+RDEscapeString(slot_logline->extAnncType())+"\","+ "EXT_CART_NAME=\""+RDEscapeString(slot_logline->extCartName())+"\","+ "TITLE=\""+RDEscapeString(slot_logline->title())+"\","+ "ARTIST=\""+RDEscapeString(slot_logline->artist())+"\","+ - "SCHEDULED_TIME="+RDCheckDateTime( - slot_logline->startTime(RDLogLine::Logged),"hh:mm:ss")+","+ + "SCHEDULED_TIME="+ + RDCheckDateTime(slot_logline->startTime(RDLogLine::Logged),"hh:mm:ss")+","+ "ISRC=\""+RDEscapeString(slot_logline->isrc())+"\","+ "PUBLISHER=\""+RDEscapeString(slot_logline->publisher())+"\","+ "COMPOSER=\""+RDEscapeString(slot_logline->composer())+"\","+ diff --git a/lib/rdcut.cpp b/lib/rdcut.cpp index 6e9c36c6..3c298577 100644 --- a/lib/rdcut.cpp +++ b/lib/rdcut.cpp @@ -1060,7 +1060,8 @@ void RDCut::setMetadata(RDWaveData *data) const } if(data->daypartStartTime().isValid()&&data->daypartEndTime().isValid()&& (data->daypartStartTime()daypartEndTime())) { - sql+="START_DAYPART="+RDCheckDateTime(data->daypartStartTime(),"hh:mm:ss")+","+ + sql+="START_DAYPART="+ + RDCheckDateTime(data->daypartStartTime(),"hh:mm:ss")+","+ "END_DAYPART="+RDCheckDateTime(data->daypartEndTime(),"hh:mm:ss")+","; } if((data->hookStartPos()>=data->startPos())&&