From d1874b868a904a9045c2a35d423e93f3c10fef44 Mon Sep 17 00:00:00 2001 From: Patrick Linstruth Date: Wed, 11 Sep 2019 12:01:40 -0700 Subject: [PATCH 1/5] Database changes for Nexus integration --- docs/tables/cart.txt | 2 + docs/tables/nexus_fields.txt | 13 +++ docs/tables/nexus_queue.txt | 12 +++ docs/tables/nexus_server.txt | 12 +++ docs/tables/nexus_stations.txt | 14 +++ lib/rdcart.cpp | 188 +++++++++++++++++++++------------ lib/rdcart.h | 4 + lib/rdwavedata.cpp | 23 ++++ lib/rdwavedata.h | 6 ++ utils/rddbmgr/schemamap.cpp | 2 +- utils/rddbmgr/updateschema.cpp | 96 +++++++++++++++++ 11 files changed, 302 insertions(+), 70 deletions(-) create mode 100644 docs/tables/nexus_fields.txt create mode 100644 docs/tables/nexus_queue.txt create mode 100644 docs/tables/nexus_server.txt create mode 100644 docs/tables/nexus_stations.txt diff --git a/docs/tables/cart.txt b/docs/tables/cart.txt index 3ba4e4bf..fd71824b 100644 --- a/docs/tables/cart.txt +++ b/docs/tables/cart.txt @@ -28,6 +28,8 @@ USAGE_CODE int(11) 0=Feature, 1=Theme Open, FORCED_LENGTH int(10) Playout this length, 0 = don't timeshift AVERAGE_LENGTH int(10) LENGTH_DEVIATION int(10) Maximum variation of underlying cuts +MINIMUM_TALK_LENGTH int(10) Minimum talk length of underlying cuts +MAXIMUM_TALK_LENGTH int(10) Maximum talk length of underlying cuts AVERAGE_SEGUE_LENGTH int(10) AVERAGE_HOOK_LENGTH int(10) CUT_QUANTITY int(10) > 1 for rotators diff --git a/docs/tables/nexus_fields.txt b/docs/tables/nexus_fields.txt new file mode 100644 index 00000000..3ac45d36 --- /dev/null +++ b/docs/tables/nexus_fields.txt @@ -0,0 +1,13 @@ + NEXUS_FIELDS Table Layout for Rivendell + +The NEXUS_FIELDS table contains mappings between Rivendell database rows +and MusicMaster Nexus fields. + +FIELD NAME TYPE REMARKS +-------------------------------------------------------------------------- +ID int(11) Primary Key +STATION varchar(255) Nexus Station (Database) +RD_NAME varchar(255) Rivendell Name +NEXUS_NAME varchar(255) MusicMaster Field Name +NEXUS_ID int(11) MusicMaster Field ID + diff --git a/docs/tables/nexus_queue.txt b/docs/tables/nexus_queue.txt new file mode 100644 index 00000000..7fe04c43 --- /dev/null +++ b/docs/tables/nexus_queue.txt @@ -0,0 +1,12 @@ + NEXUS_QUEUE Table Layout for Rivendell + +The NEXUS_QUEUE table holds notifications that could not be sent +to a MusicMaster Nexus server. + +FIELD NAME TYPE REMARKS +-------------------------------------------------------------------------- +ID int(11) Primary Key +NOTIFICATION varchar(255) +ERROR varchar(255) +CREATED timestamp + diff --git a/docs/tables/nexus_server.txt b/docs/tables/nexus_server.txt new file mode 100644 index 00000000..bdb45ea7 --- /dev/null +++ b/docs/tables/nexus_server.txt @@ -0,0 +1,12 @@ + NEXUS_SERVER Table Layout for Rivendell + +The NEXUS_SERVER table holds data concerning integration with +a MusicMaster Nexus server. + +FIELD NAME TYPE REMARKS +-------------------------------------------------------------------------- +NUMBER int(10) unsigned +ENABLED enum('N','Y') +ADDRESS varchar(50) +PORT int(11) +STATION_NAME varchar(64) diff --git a/docs/tables/nexus_stations.txt b/docs/tables/nexus_stations.txt new file mode 100644 index 00000000..1693a0ac --- /dev/null +++ b/docs/tables/nexus_stations.txt @@ -0,0 +1,14 @@ + NEXUS_STATIONS Table Layout for Rivendell + +The NEXUS_STATIONS table contains mappings and other information +between Rivendell and MusicMaster Nexus. + +FIELD NAME TYPE REMARKS +-------------------------------------------------------------------------- +STATION varchar(255) Nexus Station (Database) +CATEGORY varchar(10) Default MusicMaster Category +AUTO_MERGE enum('N','Y') Auto Merge MusicMaster Schedules +RD_SERVICE varchar(10) Rivendell Service +RD_GROUP_NAME varchar(10) Default Rivendell Group +RD_SCHED_CODE varchar(11) Default Rivendell Scheduler Code + diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index 6e97d302..386449ca 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -253,12 +253,7 @@ int RDCart::year() const void RDCart::setYear(int year) { - if((year>0)&&(year<10000)) { - SetRow("YEAR",QString().sprintf("%04d-01-01",year)); - } - else { - SetRow("YEAR"); - } + SetRow("YEAR",QString().sprintf("%04d-01-01",year)); metadata_changed=true; } @@ -619,6 +614,32 @@ void RDCart::setAverageLength(unsigned length) const } +unsigned RDCart::minimumTalkLength() const +{ + return RDGetSqlValue("CART","NUMBER",cart_number, + "MINIMUM_TALK_LENGTH").toUInt(); +} + + +void RDCart::setMinimumTalkLength(unsigned length) const +{ + SetRow("MINIMUM_TALK_LENGTH",length); +} + + +unsigned RDCart::maximumTalkLength() const +{ + return RDGetSqlValue("CART","NUMBER",cart_number, + "MAXIMUM_TALK_LENGTH").toUInt(); +} + + +void RDCart::setMaximumTalkLength(unsigned length) const +{ + SetRow("MAXIMUM_TALK_LENGTH",length); +} + + unsigned RDCart::averageSegueLength() const { return RDGetSqlValue("CART","NUMBER",cart_number, @@ -1016,6 +1037,8 @@ void RDCart::updateLength(bool enforce_length,unsigned length) long long total=0; long long segue_total=0; long long hook_total=0; + long long min_talk_len=LLONG_MAX; + long long max_talk_len=0; unsigned weight_total=0; unsigned weight = 0; QDateTime end_date; @@ -1025,7 +1048,8 @@ void RDCart::updateLength(bool enforce_length,unsigned length) QString sql=QString(). sprintf("select LENGTH,SEGUE_START_POINT,SEGUE_END_POINT,START_POINT,\ SUN,MON,TUE,WED,THU,FRI,SAT,START_DAYPART,END_DAYPART,\ - HOOK_START_POINT,HOOK_END_POINT,WEIGHT,END_DATETIME \ + HOOK_START_POINT,HOOK_END_POINT,WEIGHT,END_DATETIME,\ + TALK_START_POINT,TALK_END_POINT \ from CUTS where (CUT_NAME like \"%06d%%\")&&(LENGTH>0)", cart_number); RDSqlQuery *q=new RDSqlQuery(sql); @@ -1047,6 +1071,12 @@ void RDCart::updateLength(bool enforce_length,unsigned length) segue_total+=(q->value(1).toInt()-q->value(3).toInt()) * weight; } hook_total+=(q->value(14).toUInt()-q->value(13).toUInt()) * weight; + if(min_talk_len>q->value(18).toUInt()-q->value(17).toUInt()) { + min_talk_len=q->value(18).toUInt()-q->value(17).toUInt(); + } + if(max_talk_lenvalue(18).toUInt()-q->value(17).toUInt()) { + max_talk_len=q->value(18).toUInt()-q->value(17).toUInt(); + } weight_total += weight; } if(weight_total>0) { @@ -1065,6 +1095,8 @@ void RDCart::updateLength(bool enforce_length,unsigned length) setForcedLength(0); } } + setMinimumTalkLength(min_talk_len); + setMaximumTalkLength(max_talk_len); setCutQuantity(q->size()); delete q; @@ -1355,61 +1387,63 @@ QString RDCart::xmlSql(bool include_cuts) "CART.LENGTH_DEVIATION,"+ // 16 "CART.AVERAGE_SEGUE_LENGTH,"+ // 17 "CART.AVERAGE_HOOK_LENGTH,"+ // 18 - "CART.CUT_QUANTITY,"+ // 19 - "CART.LAST_CUT_PLAYED,"+ // 20 - "CART.VALIDITY,"+ // 21 - "CART.ENFORCE_LENGTH,"+ // 22 - "CART.ASYNCRONOUS,"+ // 23 - "CART.OWNER,"+ // 24 - "CART.METADATA_DATETIME,"+ // 25 - "CART.CONDUCTOR,"+ // 26 - "CART.MACROS,"+ // 27 - "CART.SONG_ID "; // 28 + "CART.MINIMUM_TALK_LENGTH,"+ // 19 + "CART.MAXIMUM_TALK_LENGTH,"+ // 20 + "CART.CUT_QUANTITY,"+ // 21 + "CART.LAST_CUT_PLAYED,"+ // 22 + "CART.VALIDITY,"+ // 23 + "CART.ENFORCE_LENGTH,"+ // 24 + "CART.ASYNCRONOUS,"+ // 25 + "CART.OWNER,"+ // 26 + "CART.METADATA_DATETIME,"+ // 27 + "CART.CONDUCTOR,"+ // 28 + "CART.MACROS,"+ // 29 + "CART.SONG_ID "; // 30 if(include_cuts) { sql+=QString(",")+ - "CUTS.CUT_NAME,"+ // 29 - "CUTS.EVERGREEN,"+ // 30 - "CUTS.DESCRIPTION,"+ // 31 - "CUTS.OUTCUE,"+ // 32 - "CUTS.ISRC,"+ // 33 - "CUTS.ISCI,"+ // 34 - "CUTS.LENGTH,"+ // 35 - "CUTS.ORIGIN_DATETIME,"+ // 36 - "CUTS.START_DATETIME,"+ // 37 - "CUTS.END_DATETIME,"+ // 38 - "CUTS.SUN,"+ // 39 - "CUTS.MON,"+ // 40 - "CUTS.TUE,"+ // 41 - "CUTS.WED,"+ // 42 - "CUTS.THU,"+ // 43 - "CUTS.FRI,"+ // 44 - "CUTS.SAT,"+ // 45 - "CUTS.START_DAYPART,"+ // 46 - "CUTS.END_DAYPART,"+ // 47 - "CUTS.ORIGIN_NAME,"+ // 48 - "CUTS.ORIGIN_LOGIN_NAME,"+ // 49 - "CUTS.SOURCE_HOSTNAME,"+ // 50 - "CUTS.WEIGHT,"+ // 51 - "CUTS.LAST_PLAY_DATETIME,"+ // 52 - "CUTS.PLAY_COUNTER,"+ // 53 - "CUTS.LOCAL_COUNTER,"+ // 54 - "CUTS.VALIDITY,"+ // 55 - "CUTS.CODING_FORMAT,"+ // 56 - "CUTS.SAMPLE_RATE,"+ // 57 - "CUTS.BIT_RATE,"+ // 58 - "CUTS.CHANNELS,"+ // 59 - "CUTS.PLAY_GAIN,"+ // 60 - "CUTS.START_POINT,"+ // 61 - "CUTS.END_POINT,"+ // 62 - "CUTS.FADEUP_POINT,"+ // 63 - "CUTS.FADEDOWN_POINT,"+ // 64 - "CUTS.SEGUE_START_POINT,"+ // 65 - "CUTS.SEGUE_END_POINT,"+ // 66 - "CUTS.SEGUE_GAIN,"+ // 67 - "CUTS.HOOK_START_POINT,"+ // 68 - "CUTS.HOOK_END_POINT,"+ // 69 - "CUTS.TALK_START_POINT,"+ // 70 - "CUTS.TALK_END_POINT "+ // 71 + "CUTS.CUT_NAME,"+ // 31 + "CUTS.EVERGREEN,"+ // 32 + "CUTS.DESCRIPTION,"+ // 33 + "CUTS.OUTCUE,"+ // 34 + "CUTS.ISRC,"+ // 35 + "CUTS.ISCI,"+ // 36 + "CUTS.LENGTH,"+ // 37 + "CUTS.ORIGIN_DATETIME,"+ // 38 + "CUTS.START_DATETIME,"+ // 39 + "CUTS.END_DATETIME,"+ // 40 + "CUTS.SUN,"+ // 41 + "CUTS.MON,"+ // 42 + "CUTS.TUE,"+ // 43 + "CUTS.WED,"+ // 44 + "CUTS.THU,"+ // 45 + "CUTS.FRI,"+ // 46 + "CUTS.SAT,"+ // 47 + "CUTS.START_DAYPART,"+ // 48 + "CUTS.END_DAYPART,"+ // 49 + "CUTS.ORIGIN_NAME,"+ // 50 + "CUTS.ORIGIN_LOGIN_NAME,"+ // 51 + "CUTS.SOURCE_HOSTNAME,"+ // 52 + "CUTS.WEIGHT,"+ // 53 + "CUTS.LAST_PLAY_DATETIME,"+ // 54 + "CUTS.PLAY_COUNTER,"+ // 55 + "CUTS.LOCAL_COUNTER,"+ // 56 + "CUTS.VALIDITY,"+ // 57 + "CUTS.CODING_FORMAT,"+ // 58 + "CUTS.SAMPLE_RATE,"+ // 59 + "CUTS.BIT_RATE,"+ // 60 + "CUTS.CHANNELS,"+ // 61 + "CUTS.PLAY_GAIN,"+ // 62 + "CUTS.START_POINT,"+ // 63 + "CUTS.END_POINT,"+ // 64 + "CUTS.FADEUP_POINT,"+ // 65 + "CUTS.FADEDOWN_POINT,"+ // 66 + "CUTS.SEGUE_START_POINT,"+ // 67 + "CUTS.SEGUE_END_POINT,"+ // 68 + "CUTS.SEGUE_GAIN,"+ // 69 + "CUTS.HOOK_START_POINT,"+ // 70 + "CUTS.HOOK_END_POINT,"+ // 71 + "CUTS.TALK_START_POINT,"+ // 72 + "CUTS.TALK_END_POINT "+ // 73 "from CART left join CUTS "+ "on CART.NUMBER=CUTS.CART_NUMBER "; } @@ -1465,18 +1499,22 @@ QString RDCart::xml(RDSqlQuery *q,bool include_cuts, "0"+RDGetTimeLength(q->value(17).toUInt(),true)); xml+=" "+RDXmlField("averageHookLength", "0"+RDGetTimeLength(q->value(18).toUInt(),true)); - xml+=" "+RDXmlField("cutQuantity",q->value(19).toUInt()); - xml+=" "+RDXmlField("lastCutPlayed",q->value(20).toUInt()); - xml+=" "+RDXmlField("enforceLength",RDBool(q->value(22).toString())); - xml+=" "+RDXmlField("asyncronous",RDBool(q->value(23).toString())); - xml+=" "+RDXmlField("owner",q->value(24).toString()); - xml+=" "+RDXmlField("metadataDatetime",q->value(25).toDateTime()); - xml+=" "+RDXmlField("songId",q->value(28).toString()); + xml+=" "+RDXmlField("minimumTalkLength", + "0"+RDGetTimeLength(q->value(19).toUInt(),true)); + xml+=" "+RDXmlField("maximumTalkLength", + "0"+RDGetTimeLength(q->value(20).toUInt(),true)); + xml+=" "+RDXmlField("cutQuantity",q->value(21).toUInt()); + xml+=" "+RDXmlField("lastCutPlayed",q->value(22).toUInt()); + xml+=" "+RDXmlField("enforceLength",RDBool(q->value(24).toString())); + xml+=" "+RDXmlField("asyncronous",RDBool(q->value(25).toString())); + xml+=" "+RDXmlField("owner",q->value(26).toString()); + xml+=" "+RDXmlField("metadataDatetime",q->value(27).toDateTime()); + xml+=" "+RDXmlField("songId",q->value(30).toString()); switch((RDCart::Type)q->value(1).toInt()) { case RDCart::Audio: if(include_cuts) { cartnum=q->value(0).toUInt(); - if(q->value(29).toString().isEmpty()) { + if(q->value(31).toString().isEmpty()) { xml+=" \n"; } else { @@ -1497,7 +1535,7 @@ QString RDCart::xml(RDSqlQuery *q,bool include_cuts, break; case RDCart::Macro: - mlist=q->value(27).toString().split("!"); + mlist=q->value(29).toString().split("!"); if(mlist.size()==0) { xml+=" \n"; } @@ -1845,6 +1883,18 @@ unsigned RDCart::readXml(std::vector *data,const QString &xml) toString())); cartdata.setMetadataFound(true); } + if(f0[i].contains("")) { + cartdata. + setMinimumTalkLength(RDSetTimeLength(GetXmlValue("minimumTalkLength",f0[i]). + toString())); + cartdata.setMetadataFound(true); + } + if(f0[i].contains("")) { + cartdata. + setMaximumTalkLength(RDSetTimeLength(GetXmlValue("maximumTalkLength",f0[i]). + toString())); + cartdata.setMetadataFound(true); + } if(f0[i].contains("")) { cartdata.setCutQuantity(GetXmlValue("cutQuantity",f0[i]).toInt()); cartdata.setMetadataFound(true); diff --git a/lib/rdcart.h b/lib/rdcart.h index fa5b284f..470a1c07 100644 --- a/lib/rdcart.h +++ b/lib/rdcart.h @@ -99,6 +99,10 @@ class RDCart unsigned calculateAverageLength(unsigned *max_dev=0) const; unsigned averageLength() const; void setAverageLength(unsigned length) const; + unsigned minimumTalkLength() const; + void setMinimumTalkLength(unsigned length) const; + unsigned maximumTalkLength() const; + void setMaximumTalkLength(unsigned length) const; unsigned averageSegueLength() const; void setAverageSegueLength(unsigned length) const; unsigned averageHookLength() const; diff --git a/lib/rdwavedata.cpp b/lib/rdwavedata.cpp index f37b5fdd..fd9ba1cd 100644 --- a/lib/rdwavedata.cpp +++ b/lib/rdwavedata.cpp @@ -485,6 +485,29 @@ void RDWaveData::setLengthDeviation(int msecs) } +int RDWaveData::minimumTalkLength() const +{ + return data_minimum_talk_length; +} + + +void RDWaveData::setMinimumTalkLength(int msecs) +{ + data_minimum_talk_length=msecs; +} + + +int RDWaveData::maximumTalkLength() const +{ + return data_maximum_talk_length; +} + + +void RDWaveData::setMaximumTalkLength(int msecs) +{ + data_maximum_talk_length=msecs; +} + int RDWaveData::averageSegueLength() const { return data_average_segue_length; diff --git a/lib/rdwavedata.h b/lib/rdwavedata.h index 5c0dd3fc..b992a132 100644 --- a/lib/rdwavedata.h +++ b/lib/rdwavedata.h @@ -111,6 +111,10 @@ class RDWaveData void setAverageLength(int msecs); int lengthDeviation() const; void setLengthDeviation(int msecs); + int minimumTalkLength() const; + void setMinimumTalkLength(int msecs); + int maximumTalkLength() const; + void setMaximumTalkLength(int msecs); int averageSegueLength() const; void setAverageSegueLength(int msecs); int averageHookLength() const; @@ -237,6 +241,8 @@ class RDWaveData int data_forced_length; int data_average_length; int data_length_deviation; + int data_minimum_talk_length; + int data_maximum_talk_length; int data_average_segue_length; int data_average_hook_length; int data_cut_quantity; diff --git a/utils/rddbmgr/schemamap.cpp b/utils/rddbmgr/schemamap.cpp index 868eacd7..58a8ed43 100644 --- a/utils/rddbmgr/schemamap.cpp +++ b/utils/rddbmgr/schemamap.cpp @@ -157,7 +157,7 @@ void MainObject::InitializeSchemaMap() { global_version_map["2.18"]=272; global_version_map["2.19"]=275; global_version_map["3.0"]=308; - global_version_map["3.1"]=309; + global_version_map["3.1"]=310; } diff --git a/utils/rddbmgr/updateschema.cpp b/utils/rddbmgr/updateschema.cpp index e0bc3f67..319ca9a7 100644 --- a/utils/rddbmgr/updateschema.cpp +++ b/utils/rddbmgr/updateschema.cpp @@ -9749,6 +9749,102 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) WriteSchemaVersion(++cur_schema); } + if((cur_schema<310)&&(set_schema>cur_schema)) { + sql="alter table CART add column MINIMUM_TALK_LENGTH int unsigned default 0 after AVERAGE_HOOK_LENGTH"; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + sql="alter table CART add column MAXIMUM_TALK_LENGTH int unsigned default 0 after MINIMUM_TALK_LENGTH"; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + sql=QString("create table if not exists NEXUS_FIELDS (")+ + "STATION varchar(255) NOT NULL,"+ + "RD_NAME varchar(255),"+ + "NEXUS_NAME varchar(255),"+ + "NEXUS_ID int(11))"+ + " charset utf8mb4 collate utf8mb4_general_ci"+ + db_table_create_postfix; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + sql=QString("create table if not exists NEXUS_QUEUE (")+ + "ID int auto_increment not null primary key,"+ + "NOTIFICATION varchar(255),"+ + "ERROR varchar(255),"+ + "CREATED timestamp default current_timestamp)"+ + " charset utf8mb4 collate utf8mb4_general_ci"+ + db_table_create_postfix; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + sql=QString("create table if not exists NEXUS_SERVER (")+ + "ENABLED enum('N','Y') default 'N',"+ + "ADDRESS varchar(50) NOT NULL,"+ + "PORT int(11) NOT NULL DEFAULT 8080,"+ + "STATION_NAME varchar(64))"+ + " charset utf8mb4 collate utf8mb4_general_ci"+ + db_table_create_postfix; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + sql=QString("create table if not exists NEXUS_STATIONS (")+ + "STATION varchar(255) not null,"+ + "CATEGORY varchar(10) not null,"+ + "AUTO_MERGE enum('N','Y') default 'N',"+ + "RD_SERVICE varchar(10) not null,"+ + "RD_GROUP_NAME varchar(10) not null,"+ + "RD_SCHED_CODE varchar(11) not null)"+ + " charset utf8mb4 collate utf8mb4_general_ci"+ + db_table_create_postfix; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + q=new RDSqlQuery("select NAME from SERVICES",false); + while(q->next()) { + sql=QString("insert into NEXUS_STATIONS set ")+ + "RD_SERVICE=\""+RDEscapeString(q->value(0).toString())+"\""; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + } + delete q; + + sql=QString("insert into IMPORT_TEMPLATES set ")+ + "NAME='MusicMaster Nexus',"+ + "HOURS_OFFSET=0,"+ + "HOURS_LENGTH=2,"+ + "MINUTES_OFFSET=3,"+ + "MINUTES_LENGTH=2,"+ + "SECONDS_OFFSET=6,"+ + "SECONDS_LENGTH=2,"+ + "DATA_OFFSET=10,"+ + "DATA_LENGTH=6,"+ + "CART_OFFSET=20,"+ + "CART_LENGTH=6,"+ + "TITLE_OFFSET=30,"+ + "TITLE_LENGTH=60,"+ + "LEN_HOURS_OFFSET=0,"+ + "LEN_HOURS_LENGTH=0,"+ + "LEN_MINUTES_OFFSET=95,"+ + "LEN_MINUTES_LENGTH=2,"+ + "LEN_SECONDS_OFFSET=98,"+ + "LEN_SECONDS_LENGTH=2,"+ + "EVENT_ID_OFFSET=101,"+ + "EVENT_ID_LENGTH=10"; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + length_update_required=true; + + WriteSchemaVersion(++cur_schema); + } // NEW SCHEMA UPDATES GO HERE... From fc0b71e028fe39afb09ef2238e321d0a43a7f2ac Mon Sep 17 00:00:00 2001 From: Patrick Linstruth Date: Wed, 11 Sep 2019 12:11:52 -0700 Subject: [PATCH 2/5] Forgot dbversion.h --- lib/dbversion.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dbversion.h b/lib/dbversion.h index 57e47ee0..fe18f340 100644 --- a/lib/dbversion.h +++ b/lib/dbversion.h @@ -24,7 +24,7 @@ /* * Current Database Version */ -#define RD_VERSION_DATABASE 309 +#define RD_VERSION_DATABASE 310 #endif // DBVERSION_H From 49acad6dde71fb149aa9d440d655e523006b166c Mon Sep 17 00:00:00 2001 From: Patrick Linstruth Date: Thu, 12 Sep 2019 12:59:44 -0700 Subject: [PATCH 3/5] Didn't make it into last commit --- utils/rddbmgr/revertschema.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/utils/rddbmgr/revertschema.cpp b/utils/rddbmgr/revertschema.cpp index 33279d30..3dfc7890 100644 --- a/utils/rddbmgr/revertschema.cpp +++ b/utils/rddbmgr/revertschema.cpp @@ -40,6 +40,26 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) // NEW SCHEMA REVERSIONS GO HERE... + // + // Revert 310 + // + if((cur_schema==310)&&(set_schema Date: Thu, 12 Sep 2019 12:59:58 -0700 Subject: [PATCH 4/5] Updated ChangeLog --- ChangeLog | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ChangeLog b/ChangeLog index 93fc8484..43bac2bc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19104,3 +19104,14 @@ on the title bar to have its last four characters truncated. 2019-09-09 Fred Gleason * Incremented the package version to 3.0.3int2. +2019-09-12 Patrick Linstruth + * Added minimum and maximum talk lengths to 'RDCart' and + 'RDWaveData' classes. + * Database changes for Nexus MusicMaster Integration. + * Added a 'CART.MINIMUM_TALK_LENGTH' field to the database. + * Added a 'CART.MAXIMUM_TALK_LENGTH' field to the database. + * Added 'NEXUS_FIELDS' table. + * Added 'NEXUS_QUEUE' table. + * Added 'NEXUS_SERVER' table. + * Added 'NEXUS_STATIONS' table. + * Incremented the database version to 310. From 5f5d3dbe798f9f2e6c56648b2425c5e99b2c5df5 Mon Sep 17 00:00:00 2001 From: Patrick Linstruth Date: Thu, 12 Sep 2019 13:04:47 -0700 Subject: [PATCH 5/5] Merge RDCart::setYear fix. --- lib/rdcart.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index 386449ca..43d21be8 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -253,7 +253,12 @@ int RDCart::year() const void RDCart::setYear(int year) { - SetRow("YEAR",QString().sprintf("%04d-01-01",year)); + if((year>0)&&(year<10000)) { + SetRow("YEAR",QString().sprintf("%04d-01-01",year)); + } + else { + SetRow("YEAR"); + } metadata_changed=true; }