diff --git a/ChangeLog b/ChangeLog index 84f364d0..572b69d9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16807,3 +16807,6 @@ section of the 'User' dialog in rdadmin(1). 2018-05-09 Fred Gleason * Added rdvairplay(1). +2018-05-09 Fred Gleason + * Added a 'LOG_MACHINES' table to the database. + * Incremented the database version to 278. diff --git a/docs/tables/Makefile.am b/docs/tables/Makefile.am index 5f09446b..79c3d614 100644 --- a/docs/tables/Makefile.am +++ b/docs/tables/Makefile.am @@ -48,6 +48,7 @@ EXTRA_DIST = audio_perms.txt\ jack_clients.txt\ livewire_gpio_slots.txt\ log_format.txt\ + log_machines.txt\ log_modes.txt\ logs.txt\ nownext_plugins.txt\ diff --git a/docs/tables/log_machines.txt b/docs/tables/log_machines.txt new file mode 100644 index 00000000..22f3e43e --- /dev/null +++ b/docs/tables/log_machines.txt @@ -0,0 +1,26 @@ + LOG_MACHINES Table Layout for Rivendell + +The RDAIRPLAY_CHANNELS table holds configuration data for the RDAirPlay +channels assignments and related information. + +FIELD NAME TYPE REMARKS +------------------------------------------------------------------------------ +ID int(10) unsigned * Primary key, Auto Increment +STATION_NAME char(64) From STATIONS.NAME +MACHINE int(11) 1 = RDAirPlay Main Log + 2 = RDAirPlay Aux Log 1 + 3 = RDAirPlay Aux Log 2 + 101..124 = RDVAirPlay Log Machines +START_MODE int(11) +AUTO_RESTART enum('N','Y') +LOG_NAME char(64) +CURRENT_LOG char(64) +RUNNING enum('N','Y') +LOG_ID int(11) +LOG_LINE int(11) +NOW_CART int(10) unsigned +NEXT_CART int(10) unsigned +UDP_ADDR char(255) +UDP_PORT int(10) unsigned +UDP_STRING char(255) +LOG_RML char(255) diff --git a/docs/tables/rd_airplay.txt b/docs/tables/rd_airplay.txt index 2ad2075f..c39762ba 100644 --- a/docs/tables/rd_airplay.txt +++ b/docs/tables/rd_airplay.txt @@ -28,6 +28,8 @@ BUTTON_LABEL_TEMPLATE char(32) PAUSE_ENABLED enum('N','Y') DEFAULT_SERVICE char(10) From SERVICES.NAME HOUR_SELECTOR_ENABLED enum('N','Y') + +*** RETIRED *** UDP_ADDR0 char(255) UDP_PORT0 int(10) unsigned UDP_STRING0 char(255) @@ -40,6 +42,8 @@ UDP_ADDR2 char(255) UDP_PORT2 int(10) unsigned UDP_STRING2 char(255) LOG_RML2 char(255) +*** RETIRED *** + EXIT_CODE int(11) 0=clean, 1=dirty EXIT_PASSWORD char(41) SKIN_PATH char(255) @@ -49,6 +53,8 @@ TITLE_TEMPLATE char(64) ARTIST_TEMPLATE char(64) OUTCUE_TEMPLATE char(64) DESCRIPTION_TEMPLATE char(64) + +*** RETIRED *** LOG0_START_MODE int(11) 0=start empty, 1=load last, 2=load specified LOG0_AUTO_RESTART enum('N','Y') @@ -79,3 +85,4 @@ LOG2_LOG_ID int(11) LOG2_LOG_LINE int(11) LOG2_NOW_CART int(10) unsigned LOG2_NEXT_CART int(10) unsigned +*** RETIRED *** diff --git a/lib/dbversion.h b/lib/dbversion.h index 55808d65..44620352 100644 --- a/lib/dbversion.h +++ b/lib/dbversion.h @@ -24,7 +24,7 @@ /* * Current Database Version */ -#define RD_VERSION_DATABASE 277 +#define RD_VERSION_DATABASE 278 #endif // DBVERSION_H diff --git a/lib/rd.h b/lib/rd.h index cf024552..58a41250 100644 --- a/lib/rd.h +++ b/lib/rd.h @@ -582,5 +582,11 @@ */ #define RD_NOTIFICATION_PORT 20539 +/* + * RDVAirPlay Values + */ +#define RD_RDVAIRPLAY_LOG_BASE 100 +#define RD_RDVAIRPLAY_LOG_QUAN 1 + #endif // RD_H diff --git a/lib/rdairplay_conf.cpp b/lib/rdairplay_conf.cpp index 12d85b28..ec120e74 100644 --- a/lib/rdairplay_conf.cpp +++ b/lib/rdairplay_conf.cpp @@ -533,55 +533,108 @@ void RDAirPlayConf::setDescriptionTemplate(const QString &str) QHostAddress RDAirPlayConf::udpAddress(int logno) const { QHostAddress addr; - QString str(RDGetSqlValue(air_tablename,"ID",air_id, - QString().sprintf("UDP_ADDR%d",logno)).toString()); - addr.setAddress(str); + QString sql=QString("select UDP_ADDR ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",logno); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + addr.setAddress(q->value(0).toString()); + } + delete q; return addr; } void RDAirPlayConf::setUdpAddress(int logno,QHostAddress addr) const { - SetRow(QString().sprintf("UDP_ADDR%d",logno),addr.toString()); + QString sql=QString("update LOG_MACHINES set ")+ + "UDP_ADDR=\""+RDEscapeString(addr.toString())+"\" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",logno); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } Q_UINT16 RDAirPlayConf::udpPort(int logno) const { - return (Q_UINT16)RDGetSqlValue(air_tablename,"ID",air_id,QString(). - sprintf("UDP_PORT%d",logno)).toInt(); + Q_UINT16 ret=0; + QString sql=QString("select UDP_PORT ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",logno); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toUInt(); + } + delete q; + return ret; } void RDAirPlayConf::setUdpPort(int logno,Q_UINT16 port) const { - SetRow(QString().sprintf("UDP_PORT%d",logno),(int)port); + QString sql=QString("update LOG_MACHINES set ")+ + QString().sprintf("UDP_PORT=%u ",port)+"where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",logno); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } QString RDAirPlayConf::udpString(int logno) const { - return RDGetSqlValue(air_tablename,"ID",air_id, - QString().sprintf("UDP_STRING%d",logno)).toString(); + QString ret; + QString sql=QString("select UDP_STRING ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",logno); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toString(); + } + delete q; + return ret; } void RDAirPlayConf::setUdpString(int logno,const QString &str) const { - SetRow(QString().sprintf("UDP_STRING%d",logno),str); + QString sql=QString("update LOG_MACHINES set ")+ + "UDP_STRING=\""+RDEscapeString(str)+"\" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",logno); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } QString RDAirPlayConf::logRml(int logno) const { - return RDGetSqlValue(air_tablename,"ID",air_id, - QString().sprintf("LOG_RML%d",logno)).toString(); + QString ret; + QString sql=QString("select LOG_RML ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",logno); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toString(); + } + delete q; + return ret; } void RDAirPlayConf::setLogRml(int logno,const QString &str) const { - SetRow(QString().sprintf("LOG_RML%d",logno),str); + QString sql=QString("update LOG_MACHINES set ")+ + "LOG_RML=\""+RDEscapeString(str)+"\" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",logno); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } @@ -671,121 +724,244 @@ void RDAirPlayConf::setAuditionPreroll(int msecs) const RDAirPlayConf::StartMode RDAirPlayConf::startMode(int lognum) const { - return (RDAirPlayConf::StartMode) - RDGetSqlValue(air_tablename,"ID", - air_id,QString().sprintf("LOG%d_START_MODE",lognum)).toInt(); + RDAirPlayConf::StartMode ret=RDAirPlayConf::StartEmpty; + QString sql=QString("select START_MODE ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=(RDAirPlayConf::StartMode)q->value(0).toInt(); + } + delete q; + return ret; } void RDAirPlayConf::setStartMode(int lognum,RDAirPlayConf::StartMode mode) const { - SetRow(QString().sprintf("LOG%d_START_MODE",lognum),(int)mode); + QString sql=QString("update LOG_MACHINES set ")+ + QString().sprintf("START_MODE=%d ",mode)+" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } bool RDAirPlayConf::autoRestart(int lognum) const { - return RDBool(RDGetSqlValue(air_tablename,"ID",air_id, - QString().sprintf("LOG%d_AUTO_RESTART",lognum)). - toString()); + bool ret=false; + QString sql=QString("select AUTO_RESTART ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toString()=="Y"; + } + delete q; + return ret; } void RDAirPlayConf::setAutoRestart(int lognum,bool state) const { - SetRow(QString().sprintf("LOG%d_AUTO_RESTART",lognum),RDYesNo(state)); + QString sql=QString("update LOG_MACHINES set ")+ + "AUTO_RESTART=\""+RDYesNo(state)+"\" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } QString RDAirPlayConf::logName(int lognum) const { - return RDGetSqlValue(air_tablename,"ID",air_id,QString(). - sprintf("LOG%d_LOG_NAME",lognum)).toString(); + QString ret; + QString sql=QString("select LOG_NAME ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toString(); + } + delete q; + return ret; } void RDAirPlayConf::setLogName(int lognum,const QString &name) const { - SetRow(QString().sprintf("LOG%d_LOG_NAME",lognum),name); + QString sql=QString("update LOG_MACHINES set ")+ + "LOG_NAME=\""+RDEscapeString(name)+"\" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } QString RDAirPlayConf::currentLog(int lognum) const { - return RDGetSqlValue(air_tablename,"ID",air_id,QString(). - sprintf("LOG%d_CURRENT_LOG",lognum)).toString(); + QString ret; + QString sql=QString("select CURRENT_LOG ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toString(); + } + delete q; + return ret; } void RDAirPlayConf::setCurrentLog(int lognum,const QString &name) const { - SetRow(QString().sprintf("LOG%d_CURRENT_LOG",lognum),name); + QString sql=QString("update LOG_MACHINES set ")+ + "CURRENT_LOG=\""+RDEscapeString(name)+"\" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } bool RDAirPlayConf::logRunning(int lognum) const { - return RDBool(RDGetSqlValue(air_tablename,"ID",air_id, - QString().sprintf("LOG%d_RUNNING",lognum)). - toString()); + bool ret=false; + QString sql=QString("select RUNNING ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toString()=="Y"; + } + delete q; + return ret; } void RDAirPlayConf::setLogRunning(int lognum,bool state) const { - SetRow(QString().sprintf("LOG%d_RUNNING",lognum),RDYesNo(state)); + QString sql=QString("update LOG_MACHINES set ")+ + "RUNNING=\""+RDYesNo(state)+"\" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } int RDAirPlayConf::logId(int lognum) const { - return RDGetSqlValue(air_tablename,"ID",air_id,QString(). - sprintf("LOG%d_LOG_ID",lognum)).toInt(); + int ret=-1; + QString sql=QString("select LOG_ID ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toInt(); + } + delete q; + return ret; } void RDAirPlayConf::setLogId(int lognum,int id) const { - SetRow(QString().sprintf("LOG%d_LOG_ID",lognum),id); + QString sql=QString("update LOG_MACHINES set ")+ + QString().sprintf("LOG_ID=%d ",id)+" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } int RDAirPlayConf::logCurrentLine(int lognum) const { - return RDGetSqlValue(air_tablename,"ID",air_id,QString(). - sprintf("LOG%d_LOG_LINE",lognum)).toInt(); + int ret=-1; + QString sql=QString("select LOG_LINE ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toInt(); + } + delete q; + return ret; } void RDAirPlayConf::setLogCurrentLine(int lognum,int line) const { - SetRow(QString().sprintf("LOG%d_LOG_LINE",lognum),line); + QString sql=QString("update LOG_MACHINES set ")+ + QString().sprintf("LOG_LINE=%d ",line)+" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } unsigned RDAirPlayConf::logNowCart(int lognum) const { - return RDGetSqlValue(air_tablename,"ID",air_id,QString(). - sprintf("LOG%d_NOW_CART",lognum)).toUInt(); + unsigned ret=0; + QString sql=QString("select NOW_CART ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toUInt(); + } + delete q; + return ret; } void RDAirPlayConf::setLogNowCart(int lognum,unsigned cartnum) const { - SetRow(QString().sprintf("LOG%d_NOW_CART",lognum),cartnum); + QString sql=QString("update LOG_MACHINES set ")+ + QString().sprintf("NOW_CART=%u ",cartnum)+" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } unsigned RDAirPlayConf::logNextCart(int lognum) const { - return RDGetSqlValue(air_tablename,"ID",air_id,QString(). - sprintf("LOG%d_NEXT_CART",lognum)).toUInt(); + unsigned ret=0; + QString sql=QString("select NEXT_CART ")+ + "from LOG_MACHINES where STATION_NAME=\""+ + RDEscapeString(air_station)+"\" && "+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + if(q->first()) { + ret=q->value(0).toUInt(); + } + delete q; + return ret; } void RDAirPlayConf::setLogNextCart(int lognum,unsigned cartnum) const { - SetRow(QString().sprintf("LOG%d_NEXT_CART",lognum),cartnum); + QString sql=QString("update LOG_MACHINES set ")+ + QString().sprintf("NEXT_CART=%u ",cartnum)+" where "+ + "STATION_NAME=\""+RDEscapeString(air_station)+"\" &&"+ + QString().sprintf("MACHINE=%d",lognum); + RDSqlQuery *q=new RDSqlQuery(sql); + delete q; } diff --git a/lib/rdstation.cpp b/lib/rdstation.cpp index 813754b9..3aee862f 100644 --- a/lib/rdstation.cpp +++ b/lib/rdstation.cpp @@ -739,6 +739,24 @@ bool RDStation::create(const QString &name,QString *err_msg, q=new RDSqlQuery(sql); delete q; } + + // + // Log Machine Parameters + // + for(int i=0;i<3;i++) { + sql=QString("insert into LOG_MACHINES set ")+ + "STATION_NAME=\""+RDEscapeString(name)+"\","+ + QString().sprintf("MACHINE=%d",i); + q=new RDSqlQuery(sql); + delete q; + } + for(int i=RD_RDVAIRPLAY_LOG_BASE;i<(RD_RDVAIRPLAY_LOG_BASE+RD_RDVAIRPLAY_LOG_QUAN);i++) { + sql=QString("insert into LOG_MACHINES set ")+ + "STATION_NAME=\""+RDEscapeString(name)+"\","+ + QString().sprintf("MACHINE=%d",i); + q=new RDSqlQuery(sql); + delete q; + } } else { // Use Template Host sql=QString("select ")+ @@ -1046,21 +1064,9 @@ bool RDStation::create(const QString &name,QString *err_msg, "ARTIST_TEMPLATE,"+ // 22 "OUTCUE_TEMPLATE,"+ // 23 "DESCRIPTION_TEMPLATE,"+ // 24 - "UDP_ADDR0,"+ // 25 - "UDP_PORT0,"+ // 26 - "UDP_STRING0,"+ // 27 - "LOG_RML0,"+ // 28 - "UDP_ADDR1,"+ // 29 - "UDP_PORT1,"+ // 30 - "UDP_STRING1,"+ // 31 - "LOG_RML1,"+ // 32 - "UDP_ADDR2,"+ // 33 - "UDP_PORT2,"+ // 34 - "UDP_STRING2,"+ // 35 - "LOG_RML2,"+ // 36 - "EXIT_PASSWORD,"+ // 37 - "SKIN_PATH,"+ // 38 - "SHOW_COUNTERS "+ // 39 + "EXIT_PASSWORD,"+ // 25 + "SKIN_PATH,"+ // 26 + "SHOW_COUNTERS "+ // 27 "from RDAIRPLAY where "+ "STATION=\""+RDEscapeString(exemplar)+"\""; q=new RDSqlQuery(sql); @@ -1093,21 +1099,9 @@ bool RDStation::create(const QString &name,QString *err_msg, "ARTIST_TEMPLATE=\""+RDEscapeString(q->value(22).toString())+"\","+ "OUTCUE_TEMPLATE=\""+RDEscapeString(q->value(23).toString())+"\","+ "DESCRIPTION_TEMPLATE=\""+RDEscapeString(q->value(24).toString())+"\","+ - "UDP_ADDR0=\""+RDEscapeString(q->value(25).toString())+"\","+ - QString().sprintf("UDP_PORT0=%u,",q->value(26).toUInt())+ - "UDP_STRING0=\""+RDEscapeString(q->value(27).toString())+"\","+ - "LOG_RML0=\""+RDEscapeString(q->value(28).toString())+"\","+ - "UDP_ADDR1=\""+RDEscapeString(q->value(29).toString())+"\","+ - QString().sprintf("UDP_PORT1=%u,",q->value(30).toUInt())+ - "UDP_STRING1=\""+RDEscapeString(q->value(31).toString())+"\","+ - "LOG_RML1=\""+RDEscapeString(q->value(32).toString())+"\","+ - "UDP_ADDR2=\""+RDEscapeString(q->value(33).toString())+"\","+ - QString().sprintf("UDP_PORT2=%u,",q->value(34).toUInt())+ - "UDP_STRING2=\""+RDEscapeString(q->value(35).toString())+"\","+ - "LOG_RML2=\""+RDEscapeString(q->value(36).toString())+"\","+ - "EXIT_PASSWORD=\""+RDEscapeString(q->value(37).toString())+"\","+ - "SKIN_PATH=\""+RDEscapeString(q->value(38).toString())+"\","+ - "SHOW_COUNTERS=\","+RDEscapeString(q->value(39).toString())+"\","+ + "EXIT_PASSWORD=\""+RDEscapeString(q->value(25).toString())+"\","+ + "SKIN_PATH=\""+RDEscapeString(q->value(26).toString())+"\","+ + "SHOW_COUNTERS=\","+RDEscapeString(q->value(27).toString())+"\","+ "STATION=\""+RDEscapeString(name)+"\""; q1=new RDSqlQuery(sql); delete q1; @@ -1731,6 +1725,49 @@ bool RDStation::create(const QString &name,QString *err_msg, delete q1; } delete q; + + // + // Log Machine Parameters + // + sql=QString("select ")+ + "MACHINE,"+ // 00 + "START_MODE,"+ // 01 + "AUTO_RESTART,"+ // 02 + "LOG_NAME,"+ // 03 + "CURRENT_LOG,"+ // 04 + "RUNNING,"+ // 05 + "LOG_ID,"+ // 06 + "LOG_LINE,"+ // 07 + "NOW_CART,"+ // 08 + "NEXT_CART,"+ // 09 + "UDP_ADDR,"+ // 10 + "UDP_PORT,"+ // 11 + "UDP_STRING,"+ // 12 + "LOG_RML "+ // 13 + "from LOG_MACHINES where "; + "STATION_NAME=\""+RDEscapeString(exemplar)+"\""; + q=new RDSqlQuery(sql,false); + while(q->next()) { + sql=QString("insert into LOG_MACHINES set ")+ + "STATION_NAME=\""+RDEscapeString(name)+"\","+ + QString().sprintf("MACHINE=%d,",q->value(0).toInt())+ + QString().sprintf("START_MODE=%d,",q->value(1).toInt())+ + "AUTO_RESTART=\""+q->value(2).toString()+"\","+ + "LOG_NAME=\""+RDEscapeString(q->value(3).toString())+"\","+ + "CURRENT_LOG=\""+RDEscapeString(q->value(4).toString())+"\","+ + "RUNNING=\""+q->value(5).toString()+"\","+ + QString().sprintf("LOG_ID=%d,",q->value(6).toInt())+ + QString().sprintf("LOG_LINE=%d,",q->value(7).toInt())+ + QString().sprintf("NOW_CART=%u,",q->value(8).toUInt())+ + QString().sprintf("NEXT_CART=%u,",q->value(9).toUInt())+ + "UDP_ADDR=\""+RDEscapeString(q->value(10).toString())+"\","+ + QString().sprintf("UDP_PORT=%u,",q->value(11).toUInt())+ + "UDP_STRING=\""+RDEscapeString(q->value(12).toString())+"\","+ + "LOG_RML=\""+RDEscapeString(q->value(13).toString())+"\""; + q1=new RDSqlQuery(sql,false); + delete q1; + } + delete q; } return true; } @@ -1887,6 +1924,11 @@ void RDStation::remove(const QString &name) "STATION_NAME=\""+RDEscapeString(name)+"\""; q=new RDSqlQuery(sql); delete q; + + sql=QString("delete from LOG_MACHINES where ")+ + "STATION_NAME=\""+RDEscapeString(name)+"\""; + q=new RDSqlQuery(sql); + delete q; } diff --git a/rdadmin/createdb.cpp b/rdadmin/createdb.cpp index 5be715ac..21d5909a 100644 --- a/rdadmin/createdb.cpp +++ b/rdadmin/createdb.cpp @@ -2289,6 +2289,32 @@ bool CreateDb(QString name,QString pwd,RDConfig *config) return false; } + // + // Create LOG_MACHINES table + // + sql=QString("create table if not exists LOG_MACHINES (")+ + "ID int auto_increment not null primary key,"+ + "STATION_NAME char(64) not null,"+ + "MACHINE int not null,"+ + "START_MODE int not null default 0,"+ + "AUTO_RESTART enum('N','Y') not null default 'N',"+ + "LOG_NAME char(64),"+ + "CURRENT_LOG char(64),"+ + "RUNNING enum('N','Y') not null default 'N',"+ + "LOG_ID int not null default -1,"+ + "LOG_LINE int not null default -1,"+ + "NOW_CART int unsigned not null default 0,"+ + "NEXT_CART int unsigned not null default 0,"+ + "UDP_ADDR char(255),"+ + "UDP_PORT int unsigned,"+ + "UDP_STRING char(255),"+ + "LOG_RML char(255),"+ + "index STATION_NAME_IDX(STATION_NAME,MACHINE))"+ + config->createTablePostfix(); + if(!RunQuery(sql)) { + return false; + } + return true; } @@ -8043,6 +8069,133 @@ int UpdateDb(int ver,RDConfig *config) delete q; } + if(ver<278) { + sql=QString("create table if not exists LOG_MACHINES (")+ + "ID int auto_increment not null primary key,"+ + "STATION_NAME char(64) not null,"+ + "MACHINE int not null,"+ + "START_MODE int not null default 0,"+ + "AUTO_RESTART enum('N','Y') not null default 'N',"+ + "LOG_NAME char(64),"+ + "CURRENT_LOG char(64),"+ + "RUNNING enum('N','Y') not null default 'N',"+ + "LOG_ID int not null default -1,"+ + "LOG_LINE int not null default -1,"+ + "NOW_CART int unsigned not null default 0,"+ + "NEXT_CART int unsigned not null default 0,"+ + "UDP_ADDR char(255),"+ + "UDP_PORT int unsigned,"+ + "UDP_STRING char(255),"+ + "LOG_RML char(255),"+ + "index STATION_NAME_IDX(STATION_NAME,MACHINE))"+ + config->createTablePostfix(); + q=new RDSqlQuery(sql,false); + delete q; + + for(int i=0;i<3;i++) { + sql=QString("select ")+ + "STATION,"+ // 00 + QString().sprintf("LOG%d_START_MODE,",i)+ // 01 + QString().sprintf("LOG%d_AUTO_RESTART,",i)+ // 02 + QString().sprintf("LOG%d_LOG_NAME,",i)+ // 03 + QString().sprintf("LOG%d_CURRENT_LOG,",i)+ // 04 + QString().sprintf("LOG%d_RUNNING,",i)+ // 05 + QString().sprintf("LOG%d_LOG_ID,",i)+ // 06 + QString().sprintf("LOG%d_LOG_LINE,",i)+ // 07 + QString().sprintf("LOG%d_NOW_CART,",i)+ // 08 + QString().sprintf("LOG%d_NEXT_CART,",i)+ // 09 + QString().sprintf("UDP_ADDR%d,",i)+ // 10 + QString().sprintf("UDP_PORT%d,",i)+ // 11 + QString().sprintf("UDP_STRING%d,",i)+ // 12 + QString().sprintf("LOG_RML%d ",i)+ // 13 + "from RDAIRPLAY order by STATION"; + q=new RDSqlQuery(sql,false); + while(q->next()) { + sql=QString("insert into LOG_MACHINES set ")+ + "STATION_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+ + QString().sprintf("MACHINE=%d,",i)+ + QString().sprintf("START_MODE=%d,",q->value(1).toInt())+ + "AUTO_RESTART=\""+q->value(2).toString()+"\","+ + "LOG_NAME=\""+RDEscapeString(q->value(3).toString())+"\","+ + "CURRENT_LOG=\""+RDEscapeString(q->value(4).toString())+"\","+ + "RUNNING=\""+q->value(5).toString()+"\","+ + QString().sprintf("LOG_ID=%d,",q->value(6).toInt())+ + QString().sprintf("LOG_LINE=%d,",q->value(7).toInt())+ + QString().sprintf("NOW_CART=%u,",q->value(8).toUInt())+ + QString().sprintf("NEXT_CART=%u,",q->value(9).toUInt())+ + "UDP_ADDR=\""+RDEscapeString(q->value(10).toString())+"\","+ + QString().sprintf("UDP_PORT=%u,",q->value(11).toUInt())+ + "UDP_STRING=\""+RDEscapeString(q->value(12).toString())+"\","+ + "LOG_RML=\""+RDEscapeString(q->value(13).toString())+"\""; + q1=new RDSqlQuery(sql,false); + delete q1; + } + delete q; + } + for(int i=RD_RDVAIRPLAY_LOG_BASE;i<(RD_RDVAIRPLAY_LOG_BASE+RD_RDVAIRPLAY_LOG_QUAN);i++) { + sql=QString("insert into LOG_MACHINES set ")+ + "STATION_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+ + QString().sprintf("MACHINE=%d",i); + q=new RDSqlQuery(sql); + delete q; + } + + for(int i=0;i<3;i++) { + sql=QString().sprintf("alter table RDAIRPLAY drop column UDP_ADDR%d",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column UDP_PORT%d",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column UDP_STRING%d",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG_RML%d",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG%d_START_MODE",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG%d_AUTO_RESTART",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG%d_LOG_NAME",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG%d_CURRENT_LOG",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG%d_RUNNING",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG%d_LOG_ID",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG%d_LOG_LINE",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG%d_NOW_CART",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString().sprintf("alter table RDAIRPLAY drop column LOG%d_NEXT_CART",i); + q=new RDSqlQuery(sql,false); + delete q; + } + } + + // // Maintainer's Note: // diff --git a/rdvairplay/rdvairplay.h b/rdvairplay/rdvairplay.h index d2833b14..412ded2f 100644 --- a/rdvairplay/rdvairplay.h +++ b/rdvairplay/rdvairplay.h @@ -26,12 +26,11 @@ #include #include +#include #include #include #include -#define RD_RDVAIRPLAY_LOG_BASE 100 -#define RD_RDVAIRPLAY_LOG_QUAN 1 #define RDVAIRPLAY_USAGE "[options]\n" class MainObject : public QObject diff --git a/utils/rdrevert/rdrevert.cpp b/utils/rdrevert/rdrevert.cpp index ce86c8e4..fcc2f101 100644 --- a/utils/rdrevert/rdrevert.cpp +++ b/utils/rdrevert/rdrevert.cpp @@ -267,6 +267,10 @@ void MainObject::Revert(int schema) const case 277: Revert277(); break; + + case 278: + Revert278(); + break; } } @@ -859,6 +863,148 @@ void MainObject::Revert277() const } +void MainObject::Revert278() const +{ + QString sql; + RDSqlQuery *q; + RDSqlQuery *q1; + + for(int i=2;i>=0;i--) { + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG_RML%d char(255) after DESCRIPTION_TEMPLATE",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("UDP_STRING%d char(255) after DESCRIPTION_TEMPLATE",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("UDP_PORT%d int unsigned after DESCRIPTION_TEMPLATE",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("UDP_ADDR%d char(255) after DESCRIPTION_TEMPLATE",i); + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG%d_START_MODE int default 0 ",i)+ + "after AUDITION_PREROLL"; + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG%d_NEXT_CART int unsigned default 0 ",i)+ + "after AUDITION_PREROLL"; + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG%d_NOW_CART int unsigned default 0 ",i)+ + "after AUDITION_PREROLL"; + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG%d_LOG_LINE int default -1 ",i)+ + "after AUDITION_PREROLL"; + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG%d_LOG_ID int default -1 ",i)+ + "after AUDITION_PREROLL"; + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG%d_RUNNING enum('N','Y') default 'N' ",i)+ + "after AUDITION_PREROLL"; + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG%d_CURRENT_LOG char(64) ",i)+ + "after AUDITION_PREROLL"; + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG%d_LOG_NAME char(64) ",i)+ + "after AUDITION_PREROLL"; + q=new RDSqlQuery(sql,false); + delete q; + + sql=QString("alter table RDAIRPLAY add column ")+ + QString().sprintf("LOG%d_AUTO_RESTART enum('N','Y') default 'N' ",i)+ + "after AUDITION_PREROLL"; + q=new RDSqlQuery(sql,false); + delete q; + } + + sql=QString("select ")+ + "STATION_NAME,"+ // 00 + "MACHINE,"+ // 01 + "START_MODE,"+ // 02 + "AUTO_RESTART,"+ // 03 + "LOG_NAME,"+ // 04 + "CURRENT_LOG,"+ // 05 + "RUNNING,"+ // 06 + "LOG_ID,"+ // 07 + "LOG_LINE,"+ // 08 + "NOW_CART,"+ // 09 + "NEXT_CART,"+ // 10 + "UDP_ADDR,"+ // 11 + "UDP_PORT,"+ // 12 + "UDP_STRING,"+ // 13 + "LOG_RML "+ // 14 + "from LOG_MACHINES"; + q=new RDSqlQuery(sql,false); + while(q->next()) { + sql=QString("update RDAIRPLAY set ")+ + QString().sprintf("UDP_ADDR%d=\"",q->value(1).toInt())+ + RDEscapeString(q->value(11).toString())+"\","+ + QString().sprintf("UDP_PORT%d=%u,", + q->value(1).toInt(),q->value(12).toUInt())+ + QString().sprintf("UDP_STRING%d=\"",q->value(1).toInt())+ + RDEscapeString(q->value(13).toString())+"\","+ + QString().sprintf("LOG_RML%d=\"",q->value(1).toInt())+ + RDEscapeString(q->value(14).toString())+"\","+ + QString().sprintf("LOG%d_START_MODE=%d,", + q->value(1).toInt(),q->value(2).toInt())+ + QString().sprintf("LOG%d_AUTO_RESTART=\"",q->value(1).toInt())+ + RDEscapeString(q->value(3).toString())+"\","+ + QString().sprintf("LOG%d_LOG_NAME=\"",q->value(1).toInt())+ + RDEscapeString(q->value(4).toString())+"\","+ + QString().sprintf("LOG%d_CURRENT_LOG=\"",q->value(1).toInt())+ + RDEscapeString(q->value(5).toString())+"\","+ + QString().sprintf("LOG%d_RUNNING=\"",q->value(1).toInt())+ + RDEscapeString(q->value(6).toString())+"\","+ + QString().sprintf("LOG%d_LOG_ID=%d,", + q->value(1).toInt(),q->value(7).toInt())+ + QString().sprintf("LOG%d_LOG_LINE=%d,", + q->value(1).toInt(),q->value(8).toInt())+ + QString().sprintf("LOG%d_NOW_CART=%d,", + q->value(1).toInt(),q->value(9).toInt())+ + QString().sprintf("LOG%d_NEXT_CART=%d ", + q->value(1).toInt(),q->value(10).toInt())+ + "where STATION=\""+RDEscapeString(q->value(0).toString())+"\""; + q1=new RDSqlQuery(sql,false); + delete q1; + } + delete q; + + sql=QString("drop table LOG_MACHINES"); + q=new RDSqlQuery(sql,false); + delete q; + + SetVersion(277); +} + + int MainObject::GetVersion() const { QString sql; @@ -905,7 +1051,7 @@ int MainObject::MapSchema(const QString &ver) version_map["2.17"]=268; version_map["2.18"]=272; version_map["2.19"]=275; - version_map["2.20"]=277; + version_map["2.20"]=278; // // Normalize String diff --git a/utils/rdrevert/rdrevert.h b/utils/rdrevert/rdrevert.h index 44031f3b..51421e5e 100644 --- a/utils/rdrevert/rdrevert.h +++ b/utils/rdrevert/rdrevert.h @@ -73,6 +73,7 @@ class MainObject : public QObject void Revert275() const; void Revert276() const; void Revert277() const; + void Revert278() const; int GetVersion() const; void SetVersion(int schema) const; int MapSchema(const QString &ver);