From cc4a25de31ee1f2a211727cf1351f36b1f3a66a1 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Wed, 20 Aug 2025 18:53:49 -0400 Subject: [PATCH] 2025-08-20 Fred Gleason * Fixed a bug in 'RDCut::setMetadata()' where processing an 'RDWaveData' structure containing segue data but no endpoint data could result with a record where the value of 'CUTS.SEGUE_END_POINT' was greater than that of 'CUTS.END_POINT'. Signed-off-by: Fred Gleason --- ChangeLog | 5 +++++ lib/rdcart.cpp | 6 ++++++ lib/rdcart.h | 4 ++-- lib/rdcut.cpp | 30 +++++++++++++++++++++++------- lib/rdcut.h | 4 ++-- 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 36184c2c..147a2113 100644 --- a/ChangeLog +++ b/ChangeLog @@ -25028,3 +25028,8 @@ 2025-07-05 Fred Gleason * Fixed a bug in rdadmin(1) that thew a SQL error when creating a new Host record. +2025-08-20 Fred Gleason + * Fixed a bug in 'RDCut::setMetadata()' where processing an + 'RDWaveData' structure containing segue data but no endpoint data + could result with a record where the value of + 'CUTS.SEGUE_END_POINT' was greater than that of 'CUTS.END_POINT'. diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index 0ecb945b..aa881a99 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -919,6 +919,9 @@ void RDCart::setMacros(const QString &cmds) const void RDCart::getMetadata(RDWaveData *data) const { + // + // Load an RDWaveData instance with data from a DB CART record + // QString sql; RDSqlQuery *q; @@ -964,6 +967,9 @@ void RDCart::getMetadata(RDWaveData *data) const void RDCart::setMetadata(const RDWaveData *data) { + // + // Load a DB CART record with data from an RDWaveData instance + // QString sql="update `CART` set "; if(!data->title().isEmpty()) { sql+=QString("`TITLE`='")+RDEscapeString(data->title().left(191))+"',"; diff --git a/lib/rdcart.h b/lib/rdcart.h index 09dd9142..5bb6470d 100644 --- a/lib/rdcart.h +++ b/lib/rdcart.h @@ -138,8 +138,8 @@ class RDCart QString macros() const; void setMacros(const QString &cmds) const; bool validateLengths(int len) const; - void getMetadata(RDWaveData *data) const; - void setMetadata(const RDWaveData *data); + void getMetadata(RDWaveData *data) const; // DB=>FILE + void setMetadata(const RDWaveData *data); // FILE=>DB QString xml(bool include_cuts,bool absolute, RDSettings *settings=NULL,int cutnum=-1) const; void updateLength(); diff --git a/lib/rdcut.cpp b/lib/rdcut.cpp index b9d46a94..56fa9962 100644 --- a/lib/rdcut.cpp +++ b/lib/rdcut.cpp @@ -1016,6 +1016,9 @@ bool RDCut::copyTo(RDStation *station,RDUser *user, void RDCut::getMetadata(RDWaveData *data,bool incl_str_fields) const { + // + // Load an RDWaveData instance with data from a DB CUTS record + // QString sql; RDSqlQuery *q; @@ -1081,6 +1084,9 @@ void RDCut::getMetadata(RDWaveData *data,bool incl_str_fields) const void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const { + // + // Load a DB CUT record with data from an RDWaveData instance + // QString sql="update `CUTS` set "; if(!data->description().isEmpty()) { sql+=QString("`DESCRIPTION`='")+ @@ -1118,17 +1124,23 @@ void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const RDEscapeString(data->releaseMbId().left(40))+"',"; } sql+=QString::asprintf("`PLAY_GAIN`=%d,",data->playGain()); + + // + // Ensure sane START_POINT and END_POINT values + // if(data->startPos()>=0) { sql+=QString::asprintf("`START_POINT`=%d,",data->startPos()); } if(data->endPos()>=0) { - if(data->endPos()>length()) { - sql+=QString::asprintf("`END_POINT`=%d,",length()); - } - else { - sql+=QString::asprintf("`END_POINT`=%d,",data->endPos()); + if((unsigned)data->endPos()>length()) { + data->setEndPos(length()); } + sql+=QString::asprintf("`END_POINT`=%d,",data->endPos()); } + + // + // Ensure sane TALK_START_POINT and TALK_END_POINT values + // if((data->talkStartPos()==data->startPos())&& (data->talkEndPos()==data->endPos())) { sql+="`TALK_START_POINT`=-1,`TALK_END_POINT`=-1,"; @@ -1151,6 +1163,10 @@ void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const } } } + + // + // Ensure sane SEGUE_START_POINT and SEGUE_END_POINT values + // if(((data->segueStartPos()==data->startPos())&& (data->segueEndPos()==data->endPos()))||(data->segueStartPos()==0)) { sql+="`SEGUE_START_POINT`=-1,`SEGUE_END_POINT`=-1,"; @@ -1169,6 +1185,7 @@ void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const if(data->endPos()<0) { sql+=QString::asprintf("`SEGUE_END_POINT`=%d,", data->segueStartPos()+1); + // data->segueStartPos()+1); } else { sql+=QString::asprintf("`SEGUE_END_POINT`=%d,",data->endPos()); @@ -1232,8 +1249,7 @@ void RDCut::setMetadata(RDWaveData *data,bool incl_str_fields) const sql=sql.left(sql.length()-1); } sql+=QString(" where `CUT_NAME`='")+RDEscapeString(cut_name)+"'"; - RDSqlQuery *q=new RDSqlQuery(sql); - delete q; + RDSqlQuery::apply(sql); // // Sanity Check: NEVER permit the 'description' field to be empty. diff --git a/lib/rdcut.h b/lib/rdcut.h index 0dfc7269..d5532dae 100644 --- a/lib/rdcut.h +++ b/lib/rdcut.h @@ -134,8 +134,8 @@ class RDCut void logPlayout() const; bool copyTo(RDStation *station,RDUser *user,const QString &cutname, RDConfig *config) const; - void getMetadata(RDWaveData *data,bool incl_str_fields) const; - void setMetadata(RDWaveData *data,bool incl_str_fields) const; + void getMetadata(RDWaveData *data,bool incl_str_fields) const; // DB=>FILE + void setMetadata(RDWaveData *data,bool incl_str_fields) const; // FILE=>DB bool checkInRecording(const QString &station_name,const QString &user_name, QString src_hostname,RDSettings *settings, unsigned msecs) const;