Fred Gleason 4e851eedf3 2018-10-24 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in rddbmgr(8) that caused multiple default records
	to be created in 'SERVICE_PERMS' when creating a new database.
2018-10-24 16:15:44 -04:00

2807 lines
85 KiB
C++

// create.cpp
//
// Routines for --create for rddbmgr(8)
//
// (C) Copyright 2018 Fred Gleason <fredg@paravelsystems.com>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include <netdb.h>
#include <unistd.h>
#include <sys/stat.h>
#include <rd.h>
#include <rdconf.h>
#include <rddb.h>
#include <rdescape_string.h>
#include <rdpaths.h>
#include "rddbmgr.h"
bool MainObject::Create(const QString &station_name,bool gen_audio,
QString *err_msg) const
{
//
// Check that the DB is empty
//
QString sql=QString("show tables");
RDSqlQuery *q=new RDSqlQuery(sql,false);
if(q->first()) {
delete q;
*err_msg=tr("database is not empty, aborting");
return false;
}
//
// Create tables
//
if(!CreateNewDb(err_msg)) {
return false;
}
//
// Initialize
//
return InititalizeNewDb(station_name,gen_audio,err_msg);
}
bool MainObject::CreateNewDb(QString *err_msg) const
{
//
// Create a Rivendell DB of schema number 286
//
// Maintainer's Note:
//
// DO NOT alter the schema in this method! Rather, when adding schema
// changes, add the update to the 'UpdateSchema()' [updateschema.cpp]
// and the reversion to the 'RevertSchema()' [revertschema.cpp] methods.
//
QString sql;
bool ok=false;
//
// Create USERS table
//
sql=QString("create table if not exists USERS (")+
"LOGIN_NAME char(255) not null primary key,"+
"FULL_NAME char(255),"+
"PHONE_NUMBER char(20),"+
"DESCRIPTION char(255),"+
"PASSWORD char(32),"+
"WEBAPI_AUTH_TIMEOUT int not null default 3600,"+
"ENABLE_WEB enum('N','Y') default 'N',"+
"LOCAL_AUTH enum('N','Y') default 'Y',"+
"PAM_SERVICE char(32) default \"rivendell\","+
"ADMIN_USERS_PRIV enum('N','Y') not null default 'N',"+
"ADMIN_CONFIG_PRIV enum('N','Y') not null default 'N',"+
"CREATE_CARTS_PRIV enum('N','Y') not null default 'N',"+
"DELETE_CARTS_PRIV enum('N','Y') not null default 'N',"+
"MODIFY_CARTS_PRIV enum('N','Y') not null default 'N',"+
"EDIT_AUDIO_PRIV enum('N','Y') not null default 'N',"+
"WEBGET_LOGIN_PRIV enum('N','Y') not null default 'N',"+
"ASSIGN_CART_PRIV enum('N','Y') not null default 'N',"+
"CREATE_LOG_PRIV enum('N','Y') not null default 'N',"+
"DELETE_LOG_PRIV enum('N','Y') not null default 'N',"+
"DELETE_REC_PRIV enum('N','Y') not null default 'N',"+
"PLAYOUT_LOG_PRIV enum('N','Y') not null default 'N',"+
"ARRANGE_LOG_PRIV enum('N','Y') not null default 'N',"+
"MODIFY_TEMPLATE_PRIV enum('N','Y') not null default 'N',"+
"ADDTO_LOG_PRIV enum('N','Y') not null default 'N',"+
"REMOVEFROM_LOG_PRIV enum('N','Y') not null default 'N',"+
"CONFIG_PANELS_PRIV enum('N','Y') not null default 'N',"+
"VOICETRACK_LOG_PRIV enum('N','Y') not null default 'N',"+
"EDIT_CATCHES_PRIV enum('N','Y') not null default 'N',"+
"ADD_PODCAST_PRIV enum('N','Y') not null default 'N',"+
"EDIT_PODCAST_PRIV enum('N','Y') not null default 'N',"+
"DELETE_PODCAST_PRIV enum('N','Y') not null default 'N',"+
"INDEX FULL_NAME_IDX (FULL_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create STATIONS table
//
sql=QString("create table if not exists STATIONS (")+
"NAME char(64) primary key not null,"+
"SHORT_NAME char(64),"+
"DESCRIPTION char(64),"+
"USER_NAME char(255),"+
"DEFAULT_NAME char(255),"+
"IPV4_ADDRESS char(15) default \"127.0.0.2\","+
"HTTP_STATION char(64) default \"localhost\","+
"CAE_STATION char(64) default \"localhost\","+
"TIME_OFFSET int default 0,"+
"BACKUP_DIR char(255),"+
"BACKUP_LIFE int default 0,"+
"BROADCAST_SECURITY int unsigned default 0,"+
"HEARTBEAT_CART int unsigned default 0,"+
"HEARTBEAT_INTERVAL int unsigned default 0,"+
"STARTUP_CART int unsigned default 0,"+
"EDITOR_PATH char(255) default \"\","+
"FILTER_MODE int default 0,"+
"START_JACK enum('N','Y') default 'N',"+
"JACK_SERVER_NAME char(64),"+
"JACK_COMMAND_LINE char(255),"+
"CUE_CARD int default 0,"+
"CUE_PORT int default 0,"+
"CUE_START_CART int unsigned,"+
"CUE_STOP_CART int unsigned,"+
"CARTSLOT_COLUMNS int default 1,"+
"CARTSLOT_ROWS int default 8,"+
"ENABLE_DRAGDROP enum('N','Y') default 'Y',"+
"ENFORCE_PANEL_SETUP enum('N','Y') default 'N',"+
"SYSTEM_MAINT enum('N','Y') default 'Y',"+
"STATION_SCANNED enum('N','Y') default 'N',"+
"HAVE_OGGENC enum('N','Y') default 'N',"+
"HAVE_OGG123 enum('N','Y') default 'N',"+
"HAVE_FLAC enum('N','Y') default 'N',"+
"HAVE_TWOLAME enum('N','Y') default 'N',"+
"HAVE_LAME enum('N','Y') default 'N',"+
"HAVE_MPG321 enum('N','Y') default 'N',"+
"HAVE_MP4_DECODE enum('N','Y') default 'N',"+
"HPI_VERSION char(16),"+
"JACK_VERSION char(16),"+
"ALSA_VERSION char(16),"+
"INDEX DESCRIPTION_IDX (DESCRIPTION),"+
"index IPV4_ADDRESS_IDX (IPV4_ADDRESS))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create CART table
//
sql=QString("create table if not exists CART (")+
"NUMBER int unsigned not null primary key,"+
"TYPE int unsigned not null,"+
"GROUP_NAME char(10) not null,"+
"TITLE char(255),"+
"ARTIST char(255),"+
"ALBUM char(255),"+
"YEAR date,"+
"CONDUCTOR char(64),"+
"LABEL char(64),"+
"CLIENT char(64),"+
"AGENCY char(64),"+
"PUBLISHER char(64),"+
"COMPOSER char(64),"+
"USER_DEFINED char(255),"+
"SONG_ID char(32),"+
"BPM int unsigned default 0,"+
"USAGE_CODE int default 0,"+
"FORCED_LENGTH int unsigned,"+
"AVERAGE_LENGTH int unsigned,"+
"LENGTH_DEVIATION int unsigned default 0,"+
"AVERAGE_SEGUE_LENGTH int unsigned,"+
"AVERAGE_HOOK_LENGTH int unsigned default 0,"+
"CUT_QUANTITY int unsigned,"+
"LAST_CUT_PLAYED int unsigned,"+
"PLAY_ORDER int unsigned,"+
"VALIDITY int unsigned default 2,"+
"START_DATETIME datetime,"+
"END_DATETIME datetime,"+
"ENFORCE_LENGTH enum('N','Y') default 'N',"+
"PRESERVE_PITCH enum('N','Y') default 'N',"+
"USE_WEIGHTING enum('N','Y') default 'Y',"+
"ASYNCRONOUS enum('N','Y') default 'N',"+
"OWNER char(64),"+
"MACROS text,"+
"SCHED_CODES VARCHAR( 255 ) NULL default NULL,"+
"NOTES text,"+
"METADATA_DATETIME datetime,"+
"USE_EVENT_LENGTH enum('N','Y') default 'N',"+
"PENDING_STATION char(64),"+
"PENDING_PID int,"+
"PENDING_DATETIME datetime,"+
"index GROUP_NAME_IDX (GROUP_NAME),"+
"index TITLE_IDX (TITLE),"+
"index ARTIST_IDX (ARTIST),"+
"index ALBUM_IDX (ALBUM),"+
"index CONDUCTOR_IDX (CONDUCTOR),"+
"index LABEL_IDX (LABEL),"+
"index CLIENT_IDX (CLIENT),"+
"index AGENCY_IDX (AGENCY),"+
"index PUBLISHER_IDX (PUBLISHER),"+
"index COMPOSER_IDX (COMPOSER),"+
"index USER_DEFINED_IDX (USER_DEFINED),"+
"index SONG_ID_IDX (SONG_ID),"+
"index OWNER_IDX (OWNER),"+
"index METADATA_DATETIME_IDX (METADATA_DATETIME),"+
"index PENDING_STATION_IDX(PENDING_STATION),"+
"index PENDING_PID_IDX(PENDING_STATION,PENDING_PID),"+
"index PENDING_DATETIME_IDX(PENDING_DATETIME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create CUTS table
//
sql=QString("create table if not exists CUTS (")+
"CUT_NAME char(12) primary key not null,"+
"CART_NUMBER int unsigned not null,"+
"EVERGREEN enum('N','Y') default 'N',"+
"DESCRIPTION char(64),"+
"OUTCUE char(64),"+
"ISRC char(12),"+
"ISCI char(32),"+
"LENGTH int unsigned,"+
"SHA1_HASH char(40),"+
"ORIGIN_DATETIME datetime,"+
"START_DATETIME datetime,"+
"END_DATETIME datetime,"+
"SUN enum('N','Y') default 'Y',"+
"MON enum('N','Y') default 'Y',"+
"TUE enum('N','Y') default 'Y',"+
"WED enum('N','Y') default 'Y',"+
"THU enum('N','Y') default 'Y',"+
"FRI enum('N','Y') default 'Y',"+
"SAT enum('N','Y') default 'Y',"+
"START_DAYPART time,"+
"END_DAYPART time,"+
"ORIGIN_NAME char(64),"+
"ORIGIN_LOGIN_NAME char(255),"+
"SOURCE_HOSTNAME char(255),"+
"WEIGHT int unsigned default 1,"+
"PLAY_ORDER int,"+
"LAST_PLAY_DATETIME datetime,"+
"UPLOAD_DATETIME datetime,"+
"PLAY_COUNTER int unsigned default 0,"+
"LOCAL_COUNTER int unsigned default 0,"+
"VALIDITY int unsigned default 2,"+
"CODING_FORMAT int unsigned,"+
"SAMPLE_RATE int unsigned,"+
"BIT_RATE int unsigned,"+
"CHANNELS int unsigned,"+
"PLAY_GAIN int default 0,"+
"START_POINT int default -1,"+
"END_POINT int default -1,"+
"FADEUP_POINT int default -1,"+
"FADEDOWN_POINT int default -1,"+
"SEGUE_START_POINT int default -1,"+
"SEGUE_END_POINT int default -1,"+
QString().sprintf("SEGUE_GAIN int default %d,",RD_FADE_DEPTH)+
"HOOK_START_POINT int default -1,"+
"HOOK_END_POINT int default -1,"+
"TALK_START_POINT int default -1,"+
"TALK_END_POINT int default -1,"+
"index CART_NUMBER_IDX (CART_NUMBER),"+
"index DESCRIPTION_IDX (DESCRIPTION),"+
"index OUTCUE_IDX (OUTCUE),"+
"index ORIGIN_DATETIME_IDX (ORIGIN_DATETIME),"+
"index START_DATETIME_IDX (START_DATETIME),"+
"index END_DATETIME_IDX (END_DATETIME),"+
"index ISCI_IDX (ISCI),"+
"index ISRC_IDX (ISRC))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create CLIPBOARD table
//
sql=QString("create table if not exists CLIPBOARD (")+
"CUT_NAME char(12) primary key not null,"+
"CART_NUMBER int unsigned not null,"+
"DESCRIPTION char(64),"+
"OUTCUE char(64),"+
"LENGTH int unsigned,"+
"ORIGIN_DATETIME datetime,"+
"ORIGIN_NAME char(64),"+
"WEIGHT int unsigned default 1,"+
"LAST_PLAY_DATETIME datetime,"+
"PLAY_COUNTER int unsigned default 0,"+
"CODING_FORMAT int unsigned,"+
"SAMPLE_RATE int unsigned,"+
"BIT_RATE int unsigned,"+
"CHANNELS int unsigned,"+
"PLAY_GAIN int default 0,"+
"START_POINT int default -1,"+
"END_POINT int default -1,"+
"FADEUP_POINT int default -1,"+
"FADEDOWN_POINT int default -1,"+
"SEGUE_START_POINT int default -1,"+
"SEGUE_END_POINT int default -1,"+
"HOOK_START_POINT int default -1,"+
"HOOK_END_POINT int default -1,"+
"TALK_START_POINT int default -1,"+
"TALK_END_POINT int default -1,"+
"index CART_NUMBER_IDX (CART_NUMBER),"+
"index DESCRIPTION_IDX (DESCRIPTION),"+
"index OUTCUE_IDX (OUTCUE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create SERVICES table
//
sql=QString("create table if not exists SERVICES (")+
"NAME char(10) not null primary key,"+
"DESCRIPTION char(255),"+
"NAME_TEMPLATE char(255),"+
"DESCRIPTION_TEMPLATE char(255),"+
"PROGRAM_CODE char(255),"+
"CHAIN_LOG enum('N','Y') default 'N',"+
"TRACK_GROUP char(10),"+
"AUTOSPOT_GROUP char(10),"+
"AUTO_REFRESH enum('N','Y') default 'N',"+
"DEFAULT_LOG_SHELFLIFE int default -1,"+
"LOG_SHELFLIFE_ORIGIN int default 0,"+
"ELR_SHELFLIFE int default -1,"+
"TFC_PATH char(255),"+
"TFC_PREIMPORT_CMD text,"+
"TFC_WIN_PATH char(255),"+
"TFC_WIN_PREIMPORT_CMD text,"+
"TFC_IMPORT_TEMPLATE char(64) default \"Rivendell Standard Import\","+
"TFC_LABEL_CART char(32),"+
"TFC_TRACK_CART char(32),"+
"TFC_BREAK_STRING char(64),"+
"TFC_TRACK_STRING char(64),"+
"TFC_CART_OFFSET int,"+
"TFC_CART_LENGTH int,"+
"TFC_TITLE_OFFSET int,"+
"TFC_TITLE_LENGTH int,"+
"TFC_HOURS_OFFSET int,"+
"TFC_HOURS_LENGTH int,"+
"TFC_MINUTES_OFFSET int,"+
"TFC_MINUTES_LENGTH int,"+
"TFC_SECONDS_OFFSET int,"+
"TFC_SECONDS_LENGTH int,"+
"TFC_LEN_HOURS_OFFSET int,"+
"TFC_LEN_HOURS_LENGTH int,"+
"TFC_LEN_MINUTES_OFFSET int,"+
"TFC_LEN_MINUTES_LENGTH int,"+
"TFC_LEN_SECONDS_OFFSET int,"+
"TFC_LEN_SECONDS_LENGTH int,"+
"TFC_DATA_OFFSET int,"+
"TFC_DATA_LENGTH int,"+
"TFC_EVENT_ID_OFFSET int,"+
"TFC_EVENT_ID_LENGTH int,"+
"TFC_ANNC_TYPE_OFFSET int,"+
"TFC_ANNC_TYPE_LENGTH int,"+
"MUS_PATH char(255),"+
"MUS_PREIMPORT_CMD text,"+
"MUS_WIN_PATH char(255),"+
"MUS_WIN_PREIMPORT_CMD text,"+
"MUS_IMPORT_TEMPLATE char(64) default \"Rivendell Standard Import\","+
"MUS_LABEL_CART char(32),"+
"MUS_TRACK_CART char(32),"+
"MUS_BREAK_STRING char(64),"+
"MUS_TRACK_STRING char(64),"+
"MUS_CART_OFFSET int,"+
"MUS_CART_LENGTH int,"+
"MUS_TITLE_OFFSET int,"+
"MUS_TITLE_LENGTH int,"+
"MUS_HOURS_OFFSET int,"+
"MUS_HOURS_LENGTH int,"+
"MUS_MINUTES_OFFSET int,"+
"MUS_MINUTES_LENGTH int,"+
"MUS_SECONDS_OFFSET int,"+
"MUS_SECONDS_LENGTH int,"+
"MUS_LEN_HOURS_OFFSET int,"+
"MUS_LEN_HOURS_LENGTH int,"+
"MUS_LEN_MINUTES_OFFSET int,"+
"MUS_LEN_MINUTES_LENGTH int,"+
"MUS_LEN_SECONDS_OFFSET int,"+
"MUS_LEN_SECONDS_LENGTH int,"+
"MUS_DATA_OFFSET int,"+
"MUS_DATA_LENGTH int,"+
"MUS_EVENT_ID_OFFSET int,"+
"MUS_EVENT_ID_LENGTH int,"+
"MUS_ANNC_TYPE_OFFSET int,"+
"MUS_ANNC_TYPE_LENGTH int)"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create GROUPS table
//
sql=QString("create table if not exists GROUPS (")+
"NAME char(10) not null primary key,"+
"DESCRIPTION char(255),"+
"DEFAULT_CART_TYPE int unsigned default 1,"+
"DEFAULT_LOW_CART int unsigned default 0,"+
"DEFAULT_HIGH_CART int unsigned default 0,"+
"DEFAULT_CUT_LIFE int default -1,"+
"CUT_SHELFLIFE int default -1,"+
"DELETE_EMPTY_CARTS enum('N','Y') default 'N',"+
"DEFAULT_TITLE char(255) default \"Imported from %f.%e\","+
"ENFORCE_CART_RANGE enum('N','Y') default 'N',"+
"REPORT_TFC enum('N','Y') default 'Y',"+
"REPORT_MUS enum('N','Y') default 'Y',"+
"ENABLE_NOW_NEXT enum('N','Y') default 'N',"+
"COLOR char(7),"+
"index IDX_REPORT_TFC (REPORT_TFC),"+
"index IDX_REPORT_MUS (REPORT_MUS))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create AUDIO_PERMS table
//
sql=QString("create table if not exists AUDIO_PERMS (")+
"ID int unsigned AUTO_INCREMENT not null primary key,"+
"GROUP_NAME char(10),"+
"SERVICE_NAME char(10),"+
"index GROUP_IDX (GROUP_NAME),"+
"index SERVICE_IDX (SERVICE_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create RDLIBRARY table
//
sql=QString("create table if not exists RDLIBRARY (")+
"ID int unsigned primary key AUTO_INCREMENT,"+
"STATION char(40) not null,"+
"INSTANCE int unsigned not null,"+
"INPUT_CARD int default 0,"+
"INPUT_PORT int default 0,"+
"INPUT_TYPE enum('A','D') default 'A',"+
"OUTPUT_CARD int default 0,"+
"OUTPUT_PORT int default 0,"+
"VOX_THRESHOLD int default -5000,"+
"TRIM_THRESHOLD int default 0,"+
"DEFAULT_FORMAT int unsigned default 0,"+
"DEFAULT_CHANNELS int unsigned default 2,"+
"DEFAULT_LAYER int unsigned default 0,"+
"DEFAULT_BITRATE int unsigned default 0,"+
"DEFAULT_RECORD_MODE int unsigned default 0,"+
"DEFAULT_TRIM_STATE enum('N','Y') default 'N',"+
"MAXLENGTH int,"+
"TAIL_PREROLL int unsigned default 1500,"+
"RIPPER_DEVICE char(64) default \"/dev/cdrom\","+
"PARANOIA_LEVEL int default 0,"+
"RIPPER_LEVEL int default -1300,"+
"CDDB_SERVER char(64) default \"freedb.freedb.org\","+
"READ_ISRC enum('N','Y') default 'Y',"+
"ENABLE_EDITOR enum('N','Y') default 'N',"+
"SRC_CONVERTER int default 1,"+
"LIMIT_SEARCH int default 1,"+
"SEARCH_LIMITED enum('N','Y') default 'Y',"+
"index STATION_IDX (STATION,INSTANCE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create TRIGGERS table
//
sql=QString("create table if not exists TRIGGERS (")+
"ID int unsigned AUTO_INCREMENT not null primary key,"+
"CUT_NAME char(12),"+
"TRIGGER_CODE int unsigned,"+
"OFFSET int unsigned,"+
"index CUT_NAME_IDX (CUT_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create TTYS table
//
sql=QString("create table if not exists TTYS (")+
"ID int unsigned not null primary key AUTO_INCREMENT,"+
"PORT_ID int unsigned not null,"+
"ACTIVE enum('N','Y') not null default 'N',"+
"STATION_NAME char(64) not null,"+
"PORT char(20),"+
"BAUD_RATE int default 9600,"+
"DATA_BITS int default 8,"+
"STOP_BITS int default 1,"+
"PARITY int default 0,"+
"TERMINATION int default 0,"+
"index STATION_NAME_IDX (STATION_NAME),"+
"index ACTIVE_IDX (ACTIVE),"+
"index PORT_ID_IDX (PORT_ID))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create DECKS table
//
sql=QString("create table if not exists DECKS (")+
"ID int unsigned not null primary key AUTO_INCREMENT,"+
"STATION_NAME char(64) not null,"+
"CHANNEL int unsigned not null,"+
"CARD_NUMBER int default -1,"+
"STREAM_NUMBER int default -1,"+
"PORT_NUMBER int default -1,"+
"MON_PORT_NUMBER int default -1,"+
"DEFAULT_MONITOR_ON enum('N','Y') default 'N',"+
"PORT_TYPE enum('A','D') default 'A',"+
"DEFAULT_FORMAT int default 0,"+
"DEFAULT_CHANNELS int default 2,"+
"DEFAULT_BITRATE int default 0,"+
"DEFAULT_THRESHOLD int default 0,"+
"SWITCH_STATION char(64),"+
"SWITCH_MATRIX int default -1,"+
"SWITCH_OUTPUT int default -1,"+
"SWITCH_DELAY int default 0,"+
"index STATION_NAME_IDX (STATION_NAME),"+
"index CHANNEL_IDX (CHANNEL))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create RECORDINGS table
//
sql=QString("create table if not exists RECORDINGS (")+
"ID int unsigned not null primary key AUTO_INCREMENT,"+
"IS_ACTIVE enum('N','Y') default 'Y',"+
"STATION_NAME char(64) not null,"+
"TYPE int default 0,"+
"CHANNEL int unsigned not null,"+
"CUT_NAME char(12) not null,"+
"SUN enum('N','Y') default 'N',"+
"MON enum('N','Y') default 'N',"+
"TUE enum('N','Y') default 'N',"+
"WED enum('N','Y') default 'N',"+
"THU enum('N','Y') default 'N',"+
"FRI enum('N','Y') default 'N',"+
"SAT enum('N','Y') default 'N',"+
"DESCRIPTION char(64),"+
"START_TYPE int unsigned default 0,"+
"START_TIME time,"+
"START_LENGTH int default 0,"+
"START_MATRIX int default -1,"+
"START_LINE int default -1,"+
"START_OFFSET int default 0,"+
"END_TYPE int default 0,"+
"END_TIME time,"+
"END_LENGTH int default 0,"+
"END_MATRIX int default -1,"+
"END_LINE int default -1,"+
"LENGTH int unsigned,"+
"START_GPI int default -1,"+
"END_GPI int default -1,"+
"ALLOW_MULT_RECS enum('N','Y') default 'N',"+
"MAX_GPI_REC_LENGTH int unsigned default 3600000,"+
"TRIM_THRESHOLD int,"+
"NORMALIZE_LEVEL int default -1300,"+
"STARTDATE_OFFSET int unsigned default 0,"+
"ENDDATE_OFFSET int unsigned default 0,"+
"EVENTDATE_OFFSET int default 0,"+
"FORMAT int default 0,"+
"SAMPRATE int unsigned default 44100,"+
"CHANNELS int default 2,"+
"BITRATE int default 0,"+
"QUALITY int default 0,"+
"MACRO_CART int default -1,"+
"SWITCH_INPUT int default -1,"+
"SWITCH_OUTPUT int default -1,"+
"EXIT_CODE int default 0,"+
"EXIT_TEXT text,"+
"ONE_SHOT enum('N','Y') default 'N',"+
"URL char(255),"+
"URL_USERNAME char(64),"+
"URL_PASSWORD char(64),"+
"ENABLE_METADATA enum('N','Y') default 'N',"+
"FEED_ID int default -1,"+
"index STATION_NAME_IDX (STATION_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create LOGS table
//
sql=QString("create table if not exists LOGS (")+
"NAME char(64) not null primary key,"+
"LOG_EXISTS enum('N','Y') default 'Y',"+
"TYPE int not null default 0,"+
"SERVICE char(10) not null,"+
"DESCRIPTION char(64),"+
"ORIGIN_USER char(255) not null,"+
"ORIGIN_DATETIME datetime not null,"+
"LINK_DATETIME datetime,"+
"MODIFIED_DATETIME datetime not null,"+
"AUTO_REFRESH enum('N','Y') default 'N',"+
"START_DATE date,"+
"END_DATE date,"+
"PURGE_DATE date,"+
"IMPORT_DATE date,"+
"SCHEDULED_TRACKS int unsigned default 0,"+
"COMPLETED_TRACKS int unsigned default 0,"+
"MUSIC_LINKS int default 0,"+
"MUSIC_LINKED enum('N','Y') default 'N',"+
"TRAFFIC_LINKS int default 0,"+
"TRAFFIC_LINKED enum('N','Y') default 'N',"+
"NEXT_ID int default 0,"+
"LOCK_USER_NAME char(255),"+
"LOCK_STATION_NAME char(64),"+
"LOCK_IPV4_ADDRESS char(16),"+
"LOCK_DATETIME datetime,"+
"LOCK_GUID char(82),"+
"index NAME_IDX (NAME,LOG_EXISTS),"+
"index SERVICE_IDX (SERVICE),"+
"index DESCRIPTION_IDX (DESCRIPTION),"+
"index ORIGIN_USER_IDX (ORIGIN_USER),"+
"index START_DATE_IDX (START_DATE),"+
"index END_DATE_IDX (END_DATE),"+
"index TYPE_IDX(TYPE,LOG_EXISTS),"+
"index LOCK_GUID_IDX(LOCK_GUID))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create VERSION table
//
sql=QString("create table if not exists VERSION (")+
"DB int not null primary key,"+
"LAST_MAINT_DATETIME datetime default \"1970-01-01 00:00:00\","+
"LAST_ISCI_XREFERENCE datetime default \"1970-01-01 00:00:00\")"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create RDAIRPLAY Table
//
sql=QString("create table if not exists RDAIRPLAY (")+
"ID int not null primary key auto_increment,"+
"STATION char(40) not null,"+
"SEGUE_LENGTH int default 250,"+
"TRANS_LENGTH int default 50,"+
"LOG_MODE_STYLE int default 0,"+
"PIE_COUNT_LENGTH int default 15000,"+
"PIE_COUNT_ENDPOINT int default 0,"+
"CHECK_TIMESYNC enum('N','Y') default 'N',"+
"STATION_PANELS int default 3,"+
"USER_PANELS int default 3,"+
"SHOW_AUX_1 enum('N','Y') default 'Y',"+
"SHOW_AUX_2 enum('N','Y') default 'Y',"+
"CLEAR_FILTER enum('N','Y') default 'N',"+
"DEFAULT_TRANS_TYPE int default 0,"+
"BAR_ACTION int unsigned default 0,"+
"FLASH_PANEL enum('N','Y') default 'N',"+
"PANEL_PAUSE_ENABLED enum('N','Y') default 'N',"+
"BUTTON_LABEL_TEMPLATE char(32) default '%t',"+
"PAUSE_ENABLED enum('N','Y'),"+
"DEFAULT_SERVICE char(10),"+
"HOUR_SELECTOR_ENABLED enum('N','Y') default 'N',"+
"TITLE_TEMPLATE char(64) default '%t',"+
"ARTIST_TEMPLATE char(64) default '%a',"+
"OUTCUE_TEMPLATE char(64) default '%o',"+
"DESCRIPTION_TEMPLATE char(64) default '%i',"+
"EXIT_CODE int default 0,"+
"VIRTUAL_EXIT_CODE int default 0,"+
"EXIT_PASSWORD char(41) default \"\","+
"SKIN_PATH char(255) default \""+
RDEscapeString(RD_DEFAULT_RDAIRPLAY_SKIN)+"\","+
"SHOW_COUNTERS enum('N','Y') default 'N',"+
"AUDITION_PREROLL int default 10000,"+
"index STATION_IDX (STATION))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create PANELS Table
//
sql=QString("create table if not exists PANELS (")+
"ID int auto_increment not null primary key,"+
"TYPE int not null,"+
"OWNER char(64) not null,"+
"PANEL_NO int not null,"+
"ROW_NO int not null,"+
"COLUMN_NO int not null,"+
"LABEL char(64),"+
"CART int,"+
"DEFAULT_COLOR char(7),"+
"index LOAD_IDX (TYPE,OWNER,PANEL_NO),"+
"index SAVE_IDX (TYPE,OWNER,PANEL_NO,ROW_NO,COLUMN_NO))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create MATRICES Table
//
sql=QString("create table if not exists MATRICES (")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"NAME char(64),"+
"MATRIX int not null,"+
"TYPE int not null,"+
"LAYER int default 86,"+
"PORT_TYPE int default 0,"+
"PORT_TYPE_2 int default 0,"+
"CARD int default -1,"+
"PORT int not null default 0,"+
"PORT_2 int not null default 0,"+
"IP_ADDRESS char(16),"+
"IP_ADDRESS_2 char(16),"+
"IP_PORT int,"+
"IP_PORT_2 int,"+
"USERNAME char(32),"+
"USERNAME_2 char(32),"+
"PASSWORD char(32),"+
"PASSWORD_2 char(32),"+
"START_CART int unsigned,"+
"STOP_CART int unsigned,"+
"START_CART_2 int unsigned,"+
"STOP_CART_2 int unsigned,"+
"GPIO_DEVICE char(255),"+
"INPUTS int not null default 0,"+
"OUTPUTS int not null default 0,"+
"GPIS int not null default 0,"+
"GPOS int not null default 0,"+
"FADERS int default 0,"+
"DISPLAYS int default 0,"+
"index MATRIX_IDX (STATION_NAME,MATRIX))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create INPUTS Table
//
sql=QString("create table if not exists INPUTS (")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"MATRIX int not null,"+
"NUMBER int not null,"+
"NAME char(64),"+
"FEED_NAME char(8),"+
"CHANNEL_MODE int,"+
"ENGINE_NUM int default -1,"+
"DEVICE_NUM int default -1,"+
"NODE_HOSTNAME char(255),"+
"NODE_TCP_PORT int,"+
"NODE_SLOT int,"+
"index MATRIX_IDX (STATION_NAME,MATRIX,NUMBER),"+
"index NODE_IDX (STATION_NAME,MATRIX,NUMBER,NODE_HOSTNAME,NODE_TCP_PORT))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create OUTPUTS Table
//
sql=QString("create table if not exists OUTPUTS (")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"MATRIX int not null,"+
"NUMBER int not null,"+
"NAME char(64),"+
"ENGINE_NUM int default -1,"+
"DEVICE_NUM int default -1,"+
"NODE_HOSTNAME char(255),"+
"NODE_TCP_PORT int,"+
"NODE_SLOT int,"+
"index MATRIX_IDX (STATION_NAME,MATRIX,NUMBER),"+
"index NODE_IDX (STATION_NAME,MATRIX,NUMBER,NODE_HOSTNAME,NODE_TCP_PORT))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create GPIS Table
//
sql=QString("create table if not exists GPIS (")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"MATRIX int not null,"+
"NUMBER int not null,"+
"MACRO_CART int default 0,"+
"OFF_MACRO_CART int default 0,"+
"index MATRIX_IDX (STATION_NAME,MATRIX,NUMBER))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create EVENTS table
//
sql=QString("create table if not exists EVENTS (")+
"NAME char(64) not null primary key,"+
"PROPERTIES char(64),"+
"DISPLAY_TEXT char(64),"+
"NOTE_TEXT char(255),"+
"PREPOSITION int default -1,"+
"TIME_TYPE int default 0,"+
"GRACE_TIME int default 0,"+
"POST_POINT enum('N','Y') default 'N',"+
"USE_AUTOFILL enum('N','Y') default 'N',"+
"AUTOFILL_SLOP int default -1,"+
"USE_TIMESCALE enum('N','Y') default 'N',"+
"IMPORT_SOURCE int default 0,"+
"START_SLOP int default 0,"+
"END_SLOP int default 0,"+
"FIRST_TRANS_TYPE int default 0,"+
"DEFAULT_TRANS_TYPE int default 0,"+
"COLOR char(7),"+
"SCHED_GROUP VARCHAR(10),"+
"TITLE_SEP INT(10) unsigned,"+
"HAVE_CODE VARCHAR(10),"+
"HAVE_CODE2 VARCHAR(10),"+
"HOR_SEP INT(10) unsigned,"+
"HOR_DIST INT(10) unsigned,"+
"NESTED_EVENT char(64),"+
"REMARKS char(255))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create CLOCKS table
//
sql=QString("create table if not exists CLOCKS (")+
"NAME char(64) not null primary key,"+
"SHORT_NAME char(8),"+
"ARTISTSEP int(10) unsigned,"+
"COLOR char(7),"+
"REMARKS char(255))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create AUTOFILLS table
//
sql=QString("create table if not exists AUTOFILLS (")+
"ID int not null primary key auto_increment,"+
"SERVICE char(10),"+
"CART_NUMBER int unsigned,"+
"index SERVICE_IDX (SERVICE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create HOSTVARS table
//
sql=QString("create table if not exists HOSTVARS (")+
"ID int not null primary key auto_increment,"+
"STATION_NAME char(64) not null,"+
"NAME char(32) not null,"+
"VARVALUE char(255),"+
"REMARK char(255),"+
"index NAME_IDX (STATION_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create SERVICE_PERMS Table
//
sql=QString("create table if not exists SERVICE_PERMS (")+
"ID int unsigned auto_increment not null primary key,"+
"STATION_NAME char(64),"+
"SERVICE_NAME char(10),"+
"index STATION_IDX (STATION_NAME),"+
"index SERVICE_IDX (SERVICE_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create REPORTS Table
//
sql=QString("create table if not exists REPORTS (")+
"ID int unsigned auto_increment not null primary key,"+
"NAME char(64) not null unique,"+
"DESCRIPTION char(64),"+
"EXPORT_FILTER int,"+
"EXPORT_PATH char(255),"+
"POST_EXPORT_CMD text,"+
"WIN_EXPORT_PATH char(255),"+
"WIN_POST_EXPORT_CMD text,"+
"EXPORT_TFC enum('N','Y') default 'N',"+
"FORCE_TFC enum('N','Y') default 'N',"+
"EXPORT_MUS enum('N','Y') default 'N',"+
"FORCE_MUS enum('N','Y') default 'N',"+
"EXPORT_GEN enum('N','Y') default 'N',"+
"STATION_ID char(16),"+
"CART_DIGITS int unsigned default 6,"+
"USE_LEADING_ZEROS enum('N','Y') default 'N',"+
"LINES_PER_PAGE int default 66,"+
"SERVICE_NAME char(64),"+
"STATION_TYPE int default 0,"+
"STATION_FORMAT char(64),"+
"FILTER_ONAIR_FLAG enum('N','Y') default 'N',"+
"FILTER_GROUPS enum('N','Y') default 'N',"+
"START_TIME time,"+
"END_TIME time,"+
"index IDX_NAME (NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create REPORT_SERVICES Table
//
sql=QString("create table if not exists REPORT_SERVICES (")+
"ID int unsigned auto_increment not null primary key,"+
"REPORT_NAME char(64) not null,"+
"SERVICE_NAME char(10),"+
"index IDX_REPORT_NAME (REPORT_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create REPORT_STATIONS Table
//
sql=QString("create table if not exists REPORT_STATIONS (")+
"ID int unsigned auto_increment not null primary key,"+
"REPORT_NAME char(64) not null,"+
"STATION_NAME char(64),"+
"index IDX_REPORT_NAME (REPORT_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create REPORT_GROUPS Table
//
sql=QString("create table if not exists REPORT_GROUPS (")+
"ID int unsigned auto_increment not null primary key,"+
"REPORT_NAME char(64) not null,"+
"GROUP_NAME char(10),"+
"index IDX_REPORT_NAME (REPORT_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create CLOCK_PERMS Table
//
sql=QString("create table if not exists CLOCK_PERMS (")+
"ID int unsigned auto_increment not null primary key,"+
"CLOCK_NAME char(64),"+
"SERVICE_NAME char(10),"+
"index STATION_IDX (CLOCK_NAME),"+
"index SERVICE_IDX (SERVICE_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create EVENT_PERMS Table
//
sql=QString("create table if not exists EVENT_PERMS (")+
"ID int unsigned auto_increment not null primary key,"+
"EVENT_NAME char(64),"+
"SERVICE_NAME char(10),"+
"index STATION_IDX (EVENT_NAME),"+
"index SERVICE_IDX (SERVICE_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create USER_PERMS table
//
sql=QString("create table if not exists USER_PERMS (")+
"ID int unsigned auto_increment not null primary key,"+
"USER_NAME char(255),"+
"GROUP_NAME char(10),"+
"index USER_IDX (USER_NAME),"+
"index GROUP_IDX (GROUP_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create VGUEST_RESOURCES Table
//
sql=QString("create table if not exists VGUEST_RESOURCES (")+
"ID int unsigned auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"MATRIX_NUM int not null,"+
"VGUEST_TYPE int not null,"+
"NUMBER int not null,"+
"ENGINE_NUM int default -1,"+
"DEVICE_NUM int default -1,"+
"SURFACE_NUM int default 0,"+
"RELAY_NUM int default -1,"+
"BUSS_NUM int default -1,"+
"index STATION_MATRIX_IDX (STATION_NAME,MATRIX_NUM,VGUEST_TYPE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create RDLOGEDIT table
//
sql=QString("create table if not exists RDLOGEDIT (")+
"ID int unsigned primary key auto_increment,"+
"STATION char(64) not null,"+
"INPUT_CARD int default -1,"+
"INPUT_PORT int default 0,"+
"OUTPUT_CARD int default -1,"+
"OUTPUT_PORT int default 0,"+
"FORMAT int unsigned default 0,"+
"LAYER int unsigned default 0,"+
"BITRATE int unsigned default 0,"+
"ENABLE_SECOND_START enum('N','Y') default 'Y',"+
"DEFAULT_CHANNELS int unsigned default 2,"+
"MAXLENGTH int default 0,"+
"TAIL_PREROLL int unsigned default 2000,"+
"START_CART int unsigned default 0,"+
"END_CART int unsigned default 0,"+
"REC_START_CART int unsigned default 0,"+
"REC_END_CART int unsigned default 0,"+
"TRIM_THRESHOLD int default -3000,"+
"RIPPER_LEVEL int default -1300,"+
"DEFAULT_TRANS_TYPE int default 0,"+
"index STATION_IDX (STATION))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create RDCATCH table
//
sql=QString("create table if not exists RDCATCH (")+
"ID int unsigned primary key auto_increment,"+
"STATION char(64) not null,"+
"ERROR_RML char(255),"+
"index STATION_IDX (STATION))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create SCHED_CODES Table
//
sql=QString("create table if not exists SCHED_CODES")+
"(CODE varchar(10) not null primary key,"+
"DESCRIPTION varchar(255))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create DROPBOXES Table
//
sql=QString("create table if not exists DROPBOXES ")+
"(ID int auto_increment not null primary key,"+
"STATION_NAME char(64),"+
"GROUP_NAME char(10),"+
"PATH char(255),"+
"NORMALIZATION_LEVEL int default 1,"+
"AUTOTRIM_LEVEL int default 1,"+
"SINGLE_CART enum('N','Y') default 'N',"+
"TO_CART int unsigned default 0,"+
"FORCE_TO_MONO enum('N','Y') default 'N',"+
"SEGUE_LEVEL int(11) default 1,"+
"SEGUE_LENGTH int(11) default 0,"+
"USE_CARTCHUNK_ID enum('N','Y') default 'N',"+
"TITLE_FROM_CARTCHUNK_ID enum('N','Y') default 'N',"+
"DELETE_CUTS enum('N','Y') default 'N',"+
"DELETE_SOURCE enum('N','Y') default 'Y',"+
"METADATA_PATTERN char(64),"+
"STARTDATE_OFFSET int default 0,"+
"ENDDATE_OFFSET int default 0,"+
"FIX_BROKEN_FORMATS enum('N','Y') default 'N',"+
"LOG_PATH char(255),"+
"IMPORT_CREATE_DATES enum('N','Y') default 'N',"+
"CREATE_STARTDATE_OFFSET int default 0,"+
"CREATE_ENDDATE_OFFSET int default 0,"+
"SET_USER_DEFINED char(255),"+
"index STATION_NAME_IDX (STATION_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create RDPANEL Table
//
sql=QString("create table if not exists RDPANEL (")+
"ID int not null primary key auto_increment,"+
"STATION char(40) not null,"+
"STATION_PANELS int default 3,"+
"USER_PANELS int default 3,"+
"CLEAR_FILTER enum('N','Y') default 'N',"+
"FLASH_PANEL enum('N','Y') default 'N',"+
"PANEL_PAUSE_ENABLED enum('N','Y') default 'N',"+
"BUTTON_LABEL_TEMPLATE char(32) default \"%t\","+
"DEFAULT_SERVICE char(10),"+
"SKIN_PATH char(255) default \""+
RDEscapeString(RD_DEFAULT_RDPANEL_SKIN)+"\","+
"index STATION_IDX (STATION))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create EXTENDED_PANELS Table
//
sql=QString("create table if not exists EXTENDED_PANELS (")+
"ID int auto_increment not null primary key,"+
"TYPE int not null,"+
"OWNER char(64) not null,"+
"PANEL_NO int not null,"+
"ROW_NO int not null,"+
"COLUMN_NO int not null,"+
"LABEL char(64),"+
"CART int,"+
"DEFAULT_COLOR char(7),"+
"index LOAD_IDX (TYPE,OWNER,PANEL_NO),"+
"index SAVE_IDX (TYPE,OWNER,PANEL_NO,ROW_NO,COLUMN_NO))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create PANEL_NAMES Table
//
sql=QString("create table if not exists PANEL_NAMES (")+
"ID int auto_increment not null primary key,"+
"TYPE int not null,"+
"OWNER char(64) not null,"+
"PANEL_NO int not null,"+
"NAME char(64),"+
"index LOAD_IDX (TYPE,OWNER,PANEL_NO))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create EXTENDED_PANEL_NAMES Table
//
sql=QString("create table if not exists EXTENDED_PANEL_NAMES (")+
"ID int auto_increment not null primary key,"+
"TYPE int not null,"+
"OWNER char(64) not null,"+
"PANEL_NO int not null,"+
"NAME char(64),"+
"index LOAD_IDX (TYPE,OWNER,PANEL_NO))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create FEEDS Table
//
sql=QString("create table if not exists FEEDS (")+
"ID int unsigned auto_increment not null primary key,"+
"KEY_NAME char(8) unique not null,"+
"CHANNEL_TITLE char(255),"+
"CHANNEL_DESCRIPTION text,"+
"CHANNEL_CATEGORY char(64),"+
"CHANNEL_LINK char(255),"+
"CHANNEL_COPYRIGHT char(64),"+
"CHANNEL_WEBMASTER char(64),"+
"CHANNEL_LANGUAGE char(5) default \"en-us\","+
"BASE_URL char(255),"+
"BASE_PREAMBLE char(255),"+
"PURGE_URL char(255),"+
"PURGE_USERNAME char(64),"+
"PURGE_PASSWORD char(64),"+
"HEADER_XML text,"+
"CHANNEL_XML text,"+
"ITEM_XML text,"+
"CAST_ORDER enum('N','Y') default 'N',"+
"MAX_SHELF_LIFE int,"+
"LAST_BUILD_DATETIME datetime,"+
"ORIGIN_DATETIME datetime,"+
"ENABLE_AUTOPOST enum('N','Y') default 'N',"+
"KEEP_METADATA enum('N','Y') default 'Y',"+
"UPLOAD_FORMAT int default 2,"+
"UPLOAD_CHANNELS int default 2,"+
"UPLOAD_SAMPRATE int default 44100,"+
"UPLOAD_BITRATE int default 32000,"+
"UPLOAD_QUALITY int default 0,"+
"UPLOAD_EXTENSION char(16) default \"mp3\","+
"NORMALIZE_LEVEL int default -100,"+
"REDIRECT_PATH char(255),"+
"MEDIA_LINK_MODE int default 0,"+
"index KEY_NAME_IDX(KEY_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create PODCASTS Table
//
sql=QString("create table if not exists PODCASTS (")+
"ID int unsigned auto_increment not null primary key,"+
"FEED_ID int unsigned not null,"+
"STATUS int unsigned default 1,"+
"ITEM_TITLE char(255),"+
"ITEM_DESCRIPTION text,"+
"ITEM_CATEGORY char(64),"+
"ITEM_LINK char(255),"+
"ITEM_COMMENTS char(255),"+
"ITEM_AUTHOR char(255),"+
"ITEM_SOURCE_TEXT char(64),"+
"ITEM_SOURCE_URL char(255),"+
"AUDIO_FILENAME char(255),"+
"AUDIO_LENGTH int unsigned,"+
"AUDIO_TIME int unsigned,"+
"SHELF_LIFE int,"+
"ORIGIN_DATETIME datetime,"+
"EFFECTIVE_DATETIME datetime,"+
"index FEED_ID_IDX(FEED_ID,ORIGIN_DATETIME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create AUX_METADATA Table
//
sql=QString("create table if not exists AUX_METADATA (")+
"ID int unsigned auto_increment not null primary key,"+
"FEED_ID int unsigned,"+
"VAR_NAME char(16),"+
"CAPTION char(64),"+
"index FEED_ID_IDX(FEED_ID))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create FEED_PERMS table
//
sql=QString("create table if not exists FEED_PERMS (")+
"ID int unsigned auto_increment not null primary key,"+
"USER_NAME char(255),"+
"KEY_NAME char(8),"+
"index USER_IDX (USER_NAME),"+
"index KEYNAME_IDX (KEY_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create WEB_CONNECTIONS Table
//
sql=QString("create table if not exists WEB_CONNECTIONS (")+
"SESSION_ID int unsigned not null primary key,"+
"LOGIN_NAME char(255),"+
"IP_ADDRESS char(16),"+
"TIME_STAMP datetime)"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create SWITCHER_NODES Table
//
sql=QString("create table if not exists SWITCHER_NODES (")+
"ID int not null auto_increment primary key,"+
"STATION_NAME char(64),"+
"MATRIX int,"+
"BASE_OUTPUT int default 0,"+
"HOSTNAME char(64),"+
"PASSWORD char(64),"+
"TCP_PORT int,"+
"DESCRIPTION char(255),"+
"index STATION_IDX (STATION_NAME,MATRIX))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create ENCODERS Table
//
sql=QString("create table if not exists ENCODERS (")+
"ID int not null auto_increment primary key,"+
"NAME char(32) not null,"+
"STATION_NAME char(64),"+
"COMMAND_LINE char(255),"+
"DEFAULT_EXTENSION char(16),"+
"index NAME_IDX(NAME,STATION_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
RDSqlQuery::run(sql,&ok);
if(!ok) {
return false;
}
// Ensure that dynamic format IDs start after 100
sql=QString("insert into ENCODERS set ID=100,NAME=\"dummy\"");
RDSqlQuery::run(sql,&ok);
if(!ok) {
return false;
}
sql=QString("delete from ENCODERS where ID=100");
RDSqlQuery::run(sql,&ok);
if(!ok) {
return false;
}
//
// Create ENCODER_BITRATES Table
//
sql=QString("create table if not exists ENCODER_BITRATES (")+
"ID int not null auto_increment primary key,"+
"ENCODER_ID int not null,"+
"BITRATES int not null,"+
"index ENCODER_ID_IDX(ENCODER_ID))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create ENCODER_CHANNELS Table
//
sql=QString("create table if not exists ENCODER_CHANNELS (")+
"ID int not null auto_increment primary key,"+
"ENCODER_ID int not null,"+
"CHANNELS int not null,"+
"index ENCODER_ID_IDX(ENCODER_ID))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create ENCODER_SAMPLERATES Table
//
sql=QString("create table if not exists ENCODER_SAMPLERATES (")+
"ID int not null auto_increment primary key,"+
"ENCODER_ID int not null,"+
"SAMPLERATES int not null,"+
"index ENCODER_ID_IDX(ENCODER_ID))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create GPOS Table
//
sql=QString("create table if not exists GPOS (")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"MATRIX int not null,"+
"NUMBER int not null,"+
"MACRO_CART int default 0,"+
"OFF_MACRO_CART int default 0,"+
"index MATRIX_IDX (STATION_NAME,MATRIX,NUMBER))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// DROPBOX_PATHS Table
//
sql=QString("create table if not exists DROPBOX_PATHS (")+
"ID int auto_increment not null primary key,"+
"DROPBOX_ID int not null,"+
"FILE_PATH char(255) not null,"+
"FILE_DATETIME datetime,"+
"index FILE_PATH_IDX (DROPBOX_ID,FILE_PATH))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create NOWNEXT_PLUGINS Table
//
sql=QString("create table if not exists NOWNEXT_PLUGINS (")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"LOG_MACHINE int unsigned not null default 0,"+
"PLUGIN_PATH char(255),"+
"PLUGIN_ARG char(255),"+
"index STATION_IDX (STATION_NAME,LOG_MACHINE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create SYSTEM Table
//
sql=QString("create table if not exists SYSTEM (")+
"ID int auto_increment not null primary key,"+
QString().sprintf("SAMPLE_RATE int unsigned default %d,",
RD_DEFAULT_SAMPLE_RATE)+
"DUP_CART_TITLES enum('N','Y') not null default 'Y',"+
"FIX_DUP_CART_TITLES enum('N','Y') not null default 'Y',"+
QString().sprintf("MAX_POST_LENGTH int unsigned default %u,",
RD_DEFAULT_MAX_POST_LENGTH)+
"ISCI_XREFERENCE_PATH char(255),"+
"TEMP_CART_GROUP char(10),"+
"SHOW_USER_LIST enum('N','Y') not null default 'Y',"+
"NOTIFICATION_ADDRESS char(15) default \""+RD_NOTIFICATION_ADDRESS+"\")"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create IMPORT_TEMPLATES table
//
sql=QString("create table if not exists IMPORT_TEMPLATES (")+
"NAME char(64) not null primary key,"+
"CART_OFFSET int,"+
"CART_LENGTH int,"+
"TITLE_OFFSET int,"+
"TITLE_LENGTH int,"+
"HOURS_OFFSET int,"+
"HOURS_LENGTH int,"+
"MINUTES_OFFSET int,"+
"MINUTES_LENGTH int,"+
"SECONDS_OFFSET int,"+
"SECONDS_LENGTH int,"+
"LEN_HOURS_OFFSET int,"+
"LEN_HOURS_LENGTH int,"+
"LEN_MINUTES_OFFSET int,"+
"LEN_MINUTES_LENGTH int,"+
"LEN_SECONDS_OFFSET int,"+
"LEN_SECONDS_LENGTH int,"+
"LENGTH_OFFSET int,"+
"LENGTH_LENGTH int,"+
"DATA_OFFSET int,"+
"DATA_LENGTH int,"+
"EVENT_ID_OFFSET int,"+
"EVENT_ID_LENGTH int,"+
"ANNC_TYPE_OFFSET int,"+
"ANNC_TYPE_LENGTH int)"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
if(!InsertImportFormats(err_msg)) {
return false;
}
//
// Create REPLICATORS Table
//
sql=QString("create table if not exists REPLICATORS (")+
"NAME char(32) not null primary key,"+
"DESCRIPTION char(64),"+
"TYPE_ID int unsigned not null,"+
"STATION_NAME char(64),"+
"FORMAT int unsigned default 0,"+
"CHANNELS int unsigned default 2,"+
QString().sprintf("SAMPRATE int unsigned default %u,",
RD_DEFAULT_SAMPLE_RATE)+
"BITRATE int unsigned default 0,"+
"QUALITY int unsigned default 0,"+
"URL char(255),"+
"URL_USERNAME char(64),"+
"URL_PASSWORD char(64),"+
"ENABLE_METADATA enum('N','Y') default 'N',"+
"NORMALIZATION_LEVEL int default 0,"+
"index TYPE_ID_IDX (TYPE_ID))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create REPLICATOR_MAP Table
//
sql=QString("create table if not exists REPLICATOR_MAP (")+
"ID int unsigned not null auto_increment primary key,"+
"REPLICATOR_NAME char(32) not null,"+
"GROUP_NAME char(10) not null,"+
"index REPLICATOR_NAME_IDX(REPLICATOR_NAME),"+
"index GROUP_NAME_IDX(GROUP_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create REPL_CART_STATE Table
//
sql=QString("create table if not exists REPL_CART_STATE (")+
"ID int unsigned not null auto_increment primary key,"+
"REPLICATOR_NAME char(32) not null,"+
"CART_NUMBER int unsigned not null,"+
"POSTED_FILENAME char(255),"+
"ITEM_DATETIME datetime not null,"+
"REPOST enum('N','Y') default 'N',"+
"unique REPLICATOR_NAME_IDX(REPLICATOR_NAME,CART_NUMBER,POSTED_FILENAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create REPL_CUT_STATE Table
//
sql=QString("create table if not exists REPL_CUT_STATE (")+
"ID int unsigned not null auto_increment primary key,"+
"REPLICATOR_NAME char(32) not null,"+
"CUT_NAME char(12) not null,"+
"ITEM_DATETIME datetime not null,"+
"unique REPLICATOR_NAME_IDX(REPLICATOR_NAME,CUT_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create ISCI_XREFERENCE Table
//
sql=QString("create table if not exists ISCI_XREFERENCE (")+
"ID int unsigned not null auto_increment primary key,"+
"CART_NUMBER int unsigned not null,"+
"ISCI char(32) not null,"+
"FILENAME char(64) not null,"+
"LATEST_DATE date not null,"+
"TYPE char(1) not null,"+
"ADVERTISER_NAME char(30),"+
"PRODUCT_NAME char(35),"+
"CREATIVE_TITLE char(30),"+
"REGION_NAME char(80),"+
"index CART_NUMBER_IDX(CART_NUMBER),"+
"index TYPE_IDX(TYPE,LATEST_DATE),"+
"index LATEST_DATE_IDX(LATEST_DATE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create RDHOTKEYS table
//
sql=QString("create table if not exists RDHOTKEYS (")+
"ID int unsigned not null auto_increment primary key,"+
"STATION_NAME char(64),"+
"MODULE_NAME char(64),"+
"KEY_ID int,"+
"KEY_VALUE char(64),"+
"KEY_LABEL char(64))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create JACK_CLIENTS Table
//
sql=QString("create table if not exists JACK_CLIENTS (")+
"ID int unsigned auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"DESCRIPTION char(64),"+
"COMMAND_LINE text not null,"+
"index IDX_STATION_NAME (STATION_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create CARTSLOTS Table
//
sql=QString("create table if not exists CARTSLOTS (")+
"ID int unsigned auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"SLOT_NUMBER int unsigned not null,"+
"MODE int not null default 0,"+
"DEFAULT_MODE int not null default -1,"+
"STOP_ACTION int not null default 0,"+
"DEFAULT_STOP_ACTION int not null default -1,"+
"CART_NUMBER int default 0,"+
"DEFAULT_CART_NUMBER int not null default 0,"+
"HOOK_MODE int default 0,"+
"DEFAULT_HOOK_MODE int not null default -1,"+
"SERVICE_NAME char(10),"+
"CARD int not null default 0,"+
"INPUT_PORT int not null default 0,"+
"OUTPUT_PORT int not null default 0,"+
"index STATION_NAME_IDX(STATION_NAME,SLOT_NUMBER))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create LIVEWIRE_GPIO_SLOTS table
//
sql=QString("create table if not exists LIVEWIRE_GPIO_SLOTS (")+
"ID int unsigned auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"MATRIX int not null,"+
"SLOT int not null,"+
"IP_ADDRESS char(15),"+
"SOURCE_NUMBER int,"+
"index STATION_NAME_IDX(STATION_NAME,MATRIX))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create RDAIRPLAY_CHANNELS table
//
sql=QString("create table if not exists RDAIRPLAY_CHANNELS (")+
"ID int unsigned auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"INSTANCE int unsigned not null,"+
"CARD int not null default 0,"+
"PORT int not null default 0,"+
"START_RML char(255),"+
"STOP_RML char(255),"+
"GPIO_TYPE int unsigned default 0,"+
"START_GPI_MATRIX int not null default -1,"+
"START_GPI_LINE int not null default -1,"+
"START_GPO_MATRIX int not null default -1,"+
"START_GPO_LINE int not null default -1,"+
"STOP_GPI_MATRIX int not null default -1,"+
"STOP_GPI_LINE int not null default -1,"+
"STOP_GPO_MATRIX int not null default -1,"+
"STOP_GPO_LINE int not null default -1,"+
"index STATION_NAME_IDX(STATION_NAME,INSTANCE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create RDPANEL_CHANNELS table
//
sql=QString("create table if not exists RDPANEL_CHANNELS (")+
"ID int unsigned auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"INSTANCE int unsigned not null,"+
"CARD int not null default 0,"+
"PORT int not null default 0,"+
"START_RML char(255),"+
"STOP_RML char(255),"+
"GPIO_TYPE int unsigned default 0,"+
"START_GPI_MATRIX int not null default -1,"+
"START_GPI_LINE int not null default -1,"+
"START_GPO_MATRIX int not null default -1,"+
"START_GPO_LINE int not null default -1,"+
"STOP_GPI_MATRIX int not null default -1,"+
"STOP_GPI_LINE int not null default -1,"+
"STOP_GPO_MATRIX int not null default -1,"+
"STOP_GPO_LINE int not null default -1,"+
"index STATION_NAME_IDX(STATION_NAME,INSTANCE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create LOG_MODES table
//
sql=QString("create table if not exists LOG_MODES (")+
"ID int unsigned auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"MACHINE int unsigned not null,"+
"START_MODE int not null default 0,"+
"OP_MODE int not null default 2,"+
"index STATION_NAME_IDX(STATION_NAME,MACHINE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create DROPBOX_SCHED_CODES table
//
sql=QString("create table if not exists DROPBOX_SCHED_CODES(")+
"ID int auto_increment not null primary key,"+
"DROPBOX_ID int not null,"+
"SCHED_CODE char(11) not null,"
"index DROPBOX_ID_IDX(DROPBOX_ID),"+
"index SCHED_CODE_IDX(SCHED_CODE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create GPIO_EVENTS table
//
sql=QString("create table if not exists GPIO_EVENTS(")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"MATRIX int not null,"+
"NUMBER int not null,"+
"TYPE int not null,"+
"EDGE int not null,"+
"EVENT_DATETIME datetime not null,"+
"index STATION_NAME_IDX(STATION_NAME,MATRIX,TYPE,EVENT_DATETIME,EDGE))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create CUT_EVENTS table
//
sql=QString("create table if not exists CUT_EVENTS(")+
"ID int auto_increment not null primary key,"+
"CUT_NAME char(12) not null,"+
"NUMBER int not null,"+
"POINT int not null,"+
"index CUT_NAME_IDX(CUT_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create DECK_EVENTS table
//
sql=QString("create table if not exists DECK_EVENTS(")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"CHANNEL int unsigned not null,"+
"NUMBER int not null,"+
"CART_NUMBER int unsigned not null default 0,"+
"index STATION_NAME_IDX(STATION_NAME,CHANNEL))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create SERVICE_CLOCKS table
//
sql=QString("create table if not exists SERVICE_CLOCKS(")+
"ID int auto_increment not null primary key,"+
"SERVICE_NAME char(10) not null,"+
"HOUR int not null,"+
"CLOCK_NAME char(64) default null,"+
"index SERVICE_NAME_IDX(SERVICE_NAME,HOUR),"+
"index CLOCK_NAME_IDX(CLOCK_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create WEBAPI_AUTH table
//
sql=QString("create table if not exists WEBAPI_AUTHS(")+
"TICKET char(41) not null primary key,"+
"LOGIN_NAME char(255) not null,"+
"IPV4_ADDRESS char(16) not null,"+
"EXPIRATION_DATETIME datetime not null,"+
"index TICKET_IDX(TICKET,IPV4_ADDRESS,EXPIRATION_DATETIME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create USER_SERVICE_PERMS table
//
sql=QString("create table if not exists USER_SERVICE_PERMS (")+
"ID int auto_increment not null primary key,"+
"USER_NAME char(255) not null,"+
"SERVICE_NAME char(10) not null,"+
"index USER_NAME_IDX(USER_NAME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
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))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create AUDIO_CARDS table
//
sql=QString("create table if not exists AUDIO_CARDS (")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"CARD_NUMBER int not null,"+
"DRIVER int not null default 0,"+
"NAME char(64),"+
"INPUTS int not null default -1,"+
"OUTPUTS int not null default -1,"+
"CLOCK_SOURCE int not null default 0,"+
"unique index STATION_NAME_IDX(STATION_NAME,CARD_NUMBER))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create AUDIO_INPUTS table
//
sql=QString("create table if not exists AUDIO_INPUTS (")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"CARD_NUMBER int not null,"+
"PORT_NUMBER int not null,"+
"LEVEL int not null default 0,"+
"TYPE int not null default 0,"
"MODE int not null default 0,"+
"unique index STATION_NAME_IDX(STATION_NAME,CARD_NUMBER,PORT_NUMBER))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create AUDIO_OUTPUTS table
//
sql=QString("create table if not exists AUDIO_OUTPUTS (")+
"ID int auto_increment not null primary key,"+
"STATION_NAME char(64) not null,"+
"CARD_NUMBER int not null,"+
"PORT_NUMBER int not null,"+
"LEVEL int not null default 0,"+
"unique index STATION_NAME_IDX(STATION_NAME,CARD_NUMBER,PORT_NUMBER))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
return true;
}
bool MainObject::InititalizeNewDb(const QString &station_name,bool gen_audio,
QString *err_msg) const
{
QString sql;
RDSqlQuery *q;
//
// Create Default Admin Account
//
sql=QString("insert into USERS set ")+
"LOGIN_NAME=\""+RDEscapeString(RDA_LOGIN_NAME)+"\","+
"PASSWORD=\""+RDEscapeString(RDA_PASSWORD)+"\","+
"FULL_NAME=\""+RDEscapeString(RDA_FULLNAME)+"\","+
"DESCRIPTION=\""+RDEscapeString(RDA_DESCRIPTION)+"\","+
"ADMIN_USERS_PRIV=\"Y\","+
"ADMIN_CONFIG_PRIV=\"Y\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create Default User Account
//
sql=QString("insert into USERS set ")+
"LOGIN_NAME=\""+RDEscapeString(RD_USER_LOGIN_NAME)+"\","+
"PASSWORD=\""+RDEscapeString(RD_USER_PASSWORD)+"\","+
"FULL_NAME=\""+RDEscapeString(RD_USER_FULL_NAME)+"\","+
"DESCRIPTION=\""+RDEscapeString(RD_USER_DESCRIPTION)+"\","+
"CREATE_CARTS_PRIV=\"Y\","+
"DELETE_CARTS_PRIV=\"Y\","+
"MODIFY_CARTS_PRIV=\"Y\","+
"EDIT_AUDIO_PRIV=\"Y\","+
"ASSIGN_CART_PRIV=\"Y\","+
"CREATE_LOG_PRIV=\"Y\","+
"DELETE_LOG_PRIV=\"Y\","+
"DELETE_REC_PRIV=\"Y\","+
"PLAYOUT_LOG_PRIV=\"Y\","+
"ARRANGE_LOG_PRIV=\"Y\","+
"MODIFY_TEMPLATE_PRIV=\"Y\","+
"ADDTO_LOG_PRIV=\"Y\","+
"REMOVEFROM_LOG_PRIV=\"Y\","+
"CONFIG_PANELS_PRIV=\"Y\","+
"VOICETRACK_LOG_PRIV=\"Y\","+
"EDIT_CATCHES_PRIV=\"Y\","+
"ADD_PODCAST_PRIV=\"Y\","+
"EDIT_PODCAST_PRIV=\"Y\","+
"DELETE_PODCAST_PRIV=\"Y\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create Default System-wide Settings Record
//
sql="insert into SYSTEM set ID=1";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create Default Workstation
//
//
// Add Audio Cards
//
for(int i=0;i<RD_MAX_CARDS;i++) {
sql=QString("insert into AUDIO_CARDS set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("CARD_NUMBER=%d",i);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
//
// Add Audio Inputs / Outputs
//
for(int i=0;i<RD_MAX_CARDS;i++) {
for(int j=0;j<RD_MAX_PORTS;j++) {
sql=QString("insert into AUDIO_INPUTS set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("CARD_NUMBER=%d,",i)+
QString().sprintf("PORT_NUMBER=%d",j);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into AUDIO_OUTPUTS set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("CARD_NUMBER=%d,",i)+
QString().sprintf("PORT_NUMBER=%d",j);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
}
sql=QString("insert into STATIONS set ")+
"NAME=\""+RDEscapeString(station_name)+"\","+
"SHORT_NAME=\""+RDEscapeString(station_name)+"\","+
"DESCRIPTION=\"Workstation "+RDEscapeString(station_name)+"\","+
"USER_NAME=\"user\","+
"DEFAULT_NAME=\"user\"";
struct hostent *hostent=gethostbyname((const char *)station_name);
if(hostent!=NULL) {
sql+=QString().sprintf(",IPV4_ADDRESS=\"%d.%d.%d.%d\"",
0xFF&hostent->h_addr[0],0xFF&hostent->h_addr[1],
0xFF&hostent->h_addr[2],0xFF&hostent->h_addr[3]);
}
q=new RDSqlQuery(sql);
if(!q->isActive()) {
*err_msg=QObject::tr("Host already exists!");
delete q;
return false;
}
delete q;
//
// Create Default Service
//
sql=QString("insert into SERVICES set NAME=\"")+
RDEscapeString(RD_SERVICE_NAME)+"\","+
"NAME_TEMPLATE=\""+RDEscapeString(RD_SERVICE_NAME)+"-%m%d\","+
"DESCRIPTION_TEMPLATE=\""+RDEscapeString(RD_SERVICE_NAME)+" log for %d/%m/%Y\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
// Create Group Audio Perms
sql="select NAME from GROUPS";
q=new RDSqlQuery(sql);
while(q->next()) {
sql=QString("insert into AUDIO_PERMS set ")+
"GROUP_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+
"SERVICE_NAME=\""+RDEscapeString(RD_SERVICE_NAME)+"\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
delete q;
// Create Station Perms
sql="select NAME from STATIONS";
q=new RDSqlQuery(sql);
while(q->next()) {
sql=QString("insert into SERVICE_PERMS set ")+
"STATION_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+
"SERVICE_NAME=\""+RDEscapeString(RD_SERVICE_NAME)+"\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
delete q;
// Create User Perms
sql=QString("insert into USER_SERVICE_PERMS set ")+
"USER_NAME=\""+RDEscapeString(RD_USER_LOGIN_NAME)+"\","+
"SERVICE_NAME=\""+RDEscapeString(RD_SERVICE_NAME)+"\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
// Populate RDLogManager Grid
for(int i=0;i<168;i++) {
sql=QString("insert into SERVICE_CLOCKS set ")+
"SERVICE_NAME=\""+RDEscapeString(RD_SERVICE_NAME)+"\","+
QString().sprintf("HOUR=%d,",i)+
"CLOCK_NAME=null";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
if(!CreateReconciliationTable(RD_SERVICE_NAME,err_msg)) {
return false;
}
//
// RDAirPlay/RDPanel Channel Data
//
for(unsigned i=0;i<10;i++) {
sql=QString("insert into RDAIRPLAY_CHANNELS set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("INSTANCE=%u",i);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into RDPANEL_CHANNELS set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("INSTANCE=%u",i);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
for(int i=0;i<RD_RDVAIRPLAY_LOG_QUAN;i++) {
sql=QString("insert into RDAIRPLAY_CHANNELS set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("INSTANCE=%u",i+RD_RDVAIRPLAY_LOG_BASE);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
for(unsigned i=0;i<RD_CUT_EVENT_ID_QUAN;i++) {
for(unsigned j=0;j<MAX_DECKS;j++) {
sql=QString("insert into DECK_EVENTS set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("CHANNEL=%u,",j+129)+
QString().sprintf("NUMBER=%u",i+1);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
}
//
// RDAirPlay Log Modes
//
for(int i=0;i<RDAIRPLAY_LOG_QUANTITY;i++) {
sql=QString().sprintf("insert into LOG_MODES set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("MACHINE=%d",i);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
for(int i=0;i<RD_RDVAIRPLAY_LOG_QUAN;i++) {
sql=QString().sprintf("insert into LOG_MODES set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("MACHINE=%d",i+RD_RDVAIRPLAY_LOG_BASE);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
//
// Log Machine Parameters
//
for(int i=0;i<3;i++) {
sql=QString("insert into LOG_MACHINES set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
QString().sprintf("MACHINE=%d",i);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
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(station_name)+"\","+
QString().sprintf("MACHINE=%d",i);
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
//
// Create Test Tone Cart
//
sql=QString("insert into CART set ")+
"TYPE=1,"+
"NUMBER=999999,"+
"GROUP_NAME=\"TEST\","+
"TITLE=\"Test Tone\","+
"ARTIST=\"Rivendell Radio Automation\","+
"CUT_QUANTITY=1,"+
"FORCED_LENGTH=10000,"+
"METADATA_DATETIME=now()";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create Default Audio Cut
//
sql=QString("insert into CUTS set ")+
"CUT_NAME=\"999999_001\","+
"CART_NUMBER=999999,"+
"DESCRIPTION=\"1 kHz at Reference Level [-16 dBFS]\","+
"OUTCUE=\"[tone]\","+
"CODING_FORMAT=0,"+
"BIT_RATE=0,"+
"CHANNELS=2,"+
"LENGTH=10000,"+
"START_POINT=0,"+
"END_POINT=10000,"+
"ORIGIN_DATETIME=now(),"+
"ORIGIN_NAME=\"+RDGen\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create Clipboard Entry
//
sql=QString("insert into CLIPBOARD set ")+
"CUT_NAME=\"clip\","+
"CART_NUMBER=0,"+
"DESCRIPTION=\""+RDEscapeString("Default Clipboard")+"\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create Group Audio Perms
//
sql="select NAME from GROUPS";
q=new RDSqlQuery(sql);
while(q->next()) {
sql=QString().sprintf("insert into AUDIO_PERMS set\
GROUP_NAME=\"%s\",SERVICE_NAME=\"%s\"",
(const char *)
RDEscapeString(q->value(0).toString()),
(const char *)RDEscapeString(RD_SERVICE_NAME));
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
delete q;
for(int i=0;i<168;i++) {
sql=QString("insert into SERVICE_CLOCKS set ")+
"SERVICE_NAME=\""+RDEscapeString(RD_SERVICE_NAME)+"\","+
QString().sprintf("HOUR=%d,",i)+
"CLOCK_NAME=null";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
sql=QString("update SERVICES set ")+
"DESCRIPTION=\""+RDEscapeString(RD_SERVICE_DESCRIPTION)+"\" where "+
"NAME=\""+RDEscapeString(RD_SERVICE_NAME)+"\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Create Default Groups
//
struct Group
{
const char *group;
const char *description;
int start;
int end;
bool now_next;
bool rpt_traffic;
bool rpt_music;
bool macro;
};
static const struct Group group[] = {
{"TEMP","Temporary Carts",0,0,false,false,false,false},
{"TEST","Test Carts",0,0,false,false,false,false},
{"TRAFFIC","Traffic Carts",1,10000,false,true,false,false},
{"MUSIC","Music Carts",10001,40000,true,false,true,false},
{"BEDS","Music Bed Carts",40001,45000,false,false,false,false},
{"STINGS","Short stingers",45001,50000,false,false,false,false},
{"MACROS","Macro Carts",50001,60000,false,false,false,true},
{"LEGAL","Legal IDs",60001,60100,false,false,false,false},
{"IDENTS","General IDs",60101,60500,false,false,false,false},
{NULL,NULL,0,0,false,false,false,false},
};
for (const struct Group *g = group; g->group != NULL; g++){
// Create the group
sql=QString("insert into GROUPS set ")+
"NAME=\""+RDEscapeString(g->group)+"\","+
"DESCRIPTION=\""+RDEscapeString(g->description)+"\","+
QString().sprintf("DEFAULT_CART_TYPE=%d,",g->macro?2:1)+
QString().sprintf("DEFAULT_LOW_CART=%d,",g->start)+
QString().sprintf("DEFAULT_HIGH_CART=%d,",g->end)+
"REPORT_TFC=\""+RDYesNo(g->rpt_traffic)+"\","+
"REPORT_MUS=\""+RDYesNo(g->rpt_music)+"\","+
"ENABLE_NOW_NEXT=\""+RDYesNo(g->now_next)+"\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
// Add it to the user permissions table for the default user
sql=QString("insert into USER_PERMS set ")+
"USER_NAME=\""+RDEscapeString(RD_USER_LOGIN_NAME)+"\","+
"GROUP_NAME=\""+RDEscapeString(g->group)+"\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
// Add it to the audio permsmissions table
sql=QString("insert into AUDIO_PERMS set ")+
"GROUP_NAME=\""+RDEscapeString(g->group)+"\","+
"SERVICE_NAME=\""+RDEscapeString(RD_SERVICE_NAME)+"\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
//
// Create Sample Log
//
sql=QString("create table if not exists `SAMPLE_LOG`")+
"(ID int not null primary key,"+
"COUNT int NOT NULL,"+
"TYPE int DEFAULT 0,"+
"SOURCE int NOT NULL,"+
"START_TIME int,"+
"GRACE_TIME int default 0,"+
"CART_NUMBER int UNSIGNED NOT NULL default 0,"+
"TIME_TYPE int NOT NULL,"+
"POST_POINT enum('N','Y') default 'N',"+
"TRANS_TYPE int NOT NULL,"+
"START_POINT int NOT NULL DEFAULT -1,"+
"END_POINT int NOT NULL DEFAULT -1,"+
"FADEUP_POINT int default -1,"+
QString().sprintf("FADEUP_GAIN int default %d,",RD_FADE_DEPTH)+
"FADEDOWN_POINT int default -1,"+
QString().sprintf("FADEDOWN_GAIN int default %d,",RD_FADE_DEPTH)+
"SEGUE_START_POINT int NOT NULL DEFAULT -1,"+
"SEGUE_END_POINT int NOT NULL DEFAULT -1,"+
QString().sprintf("SEGUE_GAIN int default %d,",RD_FADE_DEPTH)+
"DUCK_UP_GAIN int default 0,"+
"DUCK_DOWN_GAIN int default 0,"+
"COMMENT char(255),"+
"LABEL char(64),"+
"ORIGIN_USER char(255),"+
"ORIGIN_DATETIME datetime,"+
"EVENT_LENGTH int default -1,"+
"LINK_EVENT_NAME char(64),"+
"LINK_START_TIME int,"+
"LINK_LENGTH int default 0,"+
"LINK_START_SLOP int default 0,"+
"LINK_END_SLOP int default 0,"+
"LINK_ID int default -1,"+
"LINK_EMBEDDED enum('N','Y') default 'N',"+
"EXT_START_TIME time,"+
"EXT_LENGTH int,"+
"EXT_CART_NAME char(32),"+
"EXT_DATA char(32),"+
"EXT_EVENT_ID char(32),"+
"EXT_ANNC_TYPE char(8),"+
"index COUNT_IDX (COUNT),"+
"index CART_NUMBER_IDX (CART_NUMBER),"+
"index LABEL_IDX (LABEL))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into LOGS set ")+
"NAME=\"SAMPLE\","+
"SERVICE=\""+RDEscapeString(RD_SERVICE_NAME)+"\","+
"DESCRIPTION=\"Sample Log\","+
"ORIGIN_USER=\""+RDEscapeString(RD_USER_LOGIN_NAME)+"\","+
"ORIGIN_DATETIME=now(),"
"MODIFIED_DATETIME=now()";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Generate Hotkey Definitions
//
if(!InsertRDAirplayHotkeys(station_name,err_msg)) {
return false;
}
//
// Generate Version Number
//
sql=QString("insert into VERSION set DB=286");
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
//
// Generate Audio
//
if(gen_audio) {
QString filename=
QString().sprintf("%s/999999_001.%s",
RDConfiguration()->audioRoot().ascii(),
RDConfiguration()->audioExtension().ascii());
QString cmd=QString().sprintf("rdgen -t 10 -l 16 %s",
(const char *)filename);
system((const char *)cmd);
if(getuid()==0) {
chown(filename,RDConfiguration()->uid(),RDConfiguration()->gid());
chmod (filename,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
}
}
return true;
}
bool MainObject::InsertImportFormats(QString *err_msg) const
{
QString sql;
sql=QString("insert into IMPORT_TEMPLATES set ")+
"NAME=\"Rivendell Standard Import\","+
"CART_OFFSET=10,"+
"CART_LENGTH=6,"+
"TITLE_OFFSET=25,"+
"TITLE_LENGTH=34,"+
"HOURS_OFFSET=0,"+
"HOURS_LENGTH=2,"+
"MINUTES_OFFSET=3,"+
"MINUTES_LENGTH=2,"+
"SECONDS_OFFSET=6,"+
"SECONDS_LENGTH=2,"+
"LEN_HOURS_OFFSET=60,"+
"LEN_HOURS_LENGTH=2,"+
"LEN_MINUTES_OFFSET=63,"+
"LEN_MINUTES_LENGTH=2,"+
"LEN_SECONDS_OFFSET=66,"+
"LEN_SECONDS_LENGTH=2,"+
"DATA_OFFSET=69,"+
"DATA_LENGTH=32";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into IMPORT_TEMPLATES set ")+
"NAME=\"PowerGold Music Scheduling\","+
"CART_OFFSET=10,"+
"CART_LENGTH=6,"+
"TITLE_OFFSET=25,"+
"TITLE_LENGTH=34,"+
"HOURS_OFFSET=0,"+
"HOURS_LENGTH=2,"+
"MINUTES_OFFSET=3,"+
"MINUTES_LENGTH=2,"+
"SECONDS_OFFSET=6,"+
"SECONDS_LENGTH=2,"+
"LEN_HOURS_OFFSET=60,"+
"LEN_HOURS_LENGTH=2,"+
"LEN_MINUTES_OFFSET=63,"+
"LEN_MINUTES_LENGTH=2,"+
"LEN_SECONDS_OFFSET=66,"+
"LEN_SECONDS_LENGTH=2,"+
"DATA_OFFSET=69,"+
"DATA_LENGTH=32";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into IMPORT_TEMPLATES set ")+
"NAME=\"RadioTraffic.com\","+
"CART_OFFSET=10,"+
"CART_LENGTH=6,"+
"TITLE_OFFSET=25,"+
"TITLE_LENGTH=34,"+
"HOURS_OFFSET=0,"+
"HOURS_LENGTH=2,"+
"MINUTES_OFFSET=3,"+
"MINUTES_LENGTH=2,"+
"SECONDS_OFFSET=6,"+
"SECONDS_LENGTH=2,"+
"LEN_HOURS_OFFSET=60,"+
"LEN_HOURS_LENGTH=2,"+
"LEN_MINUTES_OFFSET=63,"+
"LEN_MINUTES_LENGTH=2,"+
"LEN_SECONDS_OFFSET=66,"+
"LEN_SECONDS_LENGTH=2,"+
"DATA_OFFSET=69,"+
"DATA_LENGTH=32";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into IMPORT_TEMPLATES set ")+
"NAME=\"CounterPoint Traffic\","+
"CART_OFFSET=10,"+
"CART_LENGTH=6,"+
"TITLE_OFFSET=25,"+
"TITLE_LENGTH=34,"+
"HOURS_OFFSET=0,"+
"HOURS_LENGTH=2,"+
"MINUTES_OFFSET=3,"+
"MINUTES_LENGTH=2,"+
"SECONDS_OFFSET=6,"+
"SECONDS_LENGTH=2,"+
"LEN_HOURS_OFFSET=60,"+
"LEN_HOURS_LENGTH=2,"+
"LEN_MINUTES_OFFSET=63,"+
"LEN_MINUTES_LENGTH=2,"+
"LEN_SECONDS_OFFSET=66,"+
"LEN_SECONDS_LENGTH=2,"+
"EVENT_ID_OFFSET=69,"+
"EVENT_ID_LENGTH=32,"+
"DATA_OFFSET=102,"+
"DATA_LENGTH=32";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into IMPORT_TEMPLATES set ")+
"NAME=\"WideOrbit Traffic\","+
"CART_OFFSET=10,"+
"CART_LENGTH=6,"+
"TITLE_OFFSET=25,"+
"TITLE_LENGTH=34,"+
"HOURS_OFFSET=0,"+
"HOURS_LENGTH=2,"+
"MINUTES_OFFSET=3,"+
"MINUTES_LENGTH=2,"+
"SECONDS_OFFSET=6,"+
"SECONDS_LENGTH=2,"+
"LEN_HOURS_OFFSET=60,"+
"LEN_HOURS_LENGTH=2,"+
"LEN_MINUTES_OFFSET=63,"+
"LEN_MINUTES_LENGTH=2,"+
"LEN_SECONDS_OFFSET=66,"+
"LEN_SECONDS_LENGTH=2,"+
"EVENT_ID_OFFSET=69,"+
"EVENT_ID_LENGTH=32,"+
"DATA_OFFSET=102,"+
"DATA_LENGTH=32";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into IMPORT_TEMPLATES set ")+
"NAME=\"Visual Traffic\","+
"CART_OFFSET=14,"+
"CART_LENGTH=6,"+
"TITLE_OFFSET=25,"+
"TITLE_LENGTH=39,"+
"HOURS_OFFSET=5,"+
"HOURS_LENGTH=2,"+
"MINUTES_OFFSET=8,"+
"MINUTES_LENGTH=2,"+
"SECONDS_OFFSET=11,"+
"SECONDS_LENGTH=2,"+
"LEN_HOURS_OFFSET=0,"+
"LEN_HOURS_LENGTH=0,"+
"LEN_MINUTES_OFFSET=97,"+
"LEN_MINUTES_LENGTH=2,"+
"LEN_SECONDS_OFFSET=99,"+
"LEN_SECONDS_LENGTH=2,"+
"EVENT_ID_OFFSET=0,"+
"EVENT_ID_LENGTH=0,"+
"DATA_OFFSET=0,"+
"DATA_LENGTH=0";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into IMPORT_TEMPLATES set ")+
"NAME=\"Music 1\","+
"CART_OFFSET=10,"+
"CART_LENGTH=6,"+
"TITLE_OFFSET=25,"+
"TITLE_LENGTH=34,"+
"HOURS_OFFSET=0,"+
"HOURS_LENGTH=2,"+
"MINUTES_OFFSET=3,"+
"MINUTES_LENGTH=2,"+
"SECONDS_OFFSET=6,"+
"SECONDS_LENGTH=2,"+
"LEN_HOURS_OFFSET=60,"+
"LEN_HOURS_LENGTH=2,"+
"LEN_MINUTES_OFFSET=63,"+
"LEN_MINUTES_LENGTH=2,"+
"LEN_SECONDS_OFFSET=66,"+
"LEN_SECONDS_LENGTH=2,"+
"DATA_OFFSET=69,"+
"DATA_LENGTH=32";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("insert into IMPORT_TEMPLATES set ")+
"NAME=\"NaturalLog\","+
"CART_OFFSET=9,"+
"CART_LENGTH=6,"+
"TITLE_OFFSET=19,"+
"TITLE_LENGTH=40,"+
"HOURS_OFFSET=0,"+
"HOURS_LENGTH=2,"+
"MINUTES_OFFSET=3,"+
"MINUTES_LENGTH=2,"+
"SECONDS_OFFSET=6,"+
"SECONDS_LENGTH=2,"+
"LEN_HOURS_OFFSET=61,"+
"LEN_HOURS_LENGTH=2,"+
"LEN_MINUTES_OFFSET=64,"+
"LEN_MINUTES_LENGTH=2,"+
"LEN_SECONDS_OFFSET=67,"+
"LEN_SECONDS_LENGTH=2,"+
"DATA_OFFSET=0,"+
"DATA_LENGTH=0";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
return true;
}
bool MainObject::InsertRDAirplayHotkeys(const QString &station_name,
QString *err_msg) const
{
QString sql;
QStringList labels;
labels.push_back(QObject::tr("Start Line 1"));
labels.push_back(QObject::tr("Stop Line 1"));
labels.push_back(QObject::tr("Pause Line 1"));
labels.push_back(QObject::tr("Start Line 2"));
labels.push_back(QObject::tr("Stop Line 2"));
labels.push_back(QObject::tr("Pause Line 2"));
labels.push_back(QObject::tr("Start Line 3"));
labels.push_back(QObject::tr("Stop Line 3"));
labels.push_back(QObject::tr("Pause Line 3"));
labels.push_back(QObject::tr("Start Line 4"));
labels.push_back(QObject::tr("Stop Line 4"));
labels.push_back(QObject::tr("Pause Line 4"));
labels.push_back(QObject::tr("Start Line 5"));
labels.push_back(QObject::tr("Stop Line 5"));
labels.push_back(QObject::tr("Pause Line 5"));
labels.push_back(QObject::tr("Start Line 6"));
labels.push_back(QObject::tr("Stop Line 6"));
labels.push_back(QObject::tr("Pause Line 6"));
labels.push_back(QObject::tr("Start Line 7"));
labels.push_back(QObject::tr("Stop Line 7"));
labels.push_back(QObject::tr("Pause Line 7"));
labels.push_back(QObject::tr("Add"));
labels.push_back(QObject::tr("Delete"));
labels.push_back(QObject::tr("Copy"));
labels.push_back(QObject::tr("Move"));
labels.push_back(QObject::tr("Sound Panel"));
labels.push_back(QObject::tr("Main Log"));
labels.push_back(QObject::tr("Aux Log 1"));
labels.push_back(QObject::tr("Aux Log 2"));
for(int i=0;i<labels.size();i++) {
sql=QString("insert into RDHOTKEYS set ")+
"STATION_NAME=\""+RDEscapeString(station_name)+"\","+
"MODULE_NAME=\"airplay\","+
QString().sprintf("KEY_ID=%u,",i+1)+
"KEY_LABEL=\""+RDEscapeString(labels[i])+"\"";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
return true;
}
bool MainObject::CreateReconciliationTable(const QString &svc_name,
QString *err_msg) const
{
QString tablename=svc_name;
tablename.replace(" ","_");
QString sql=QString("create table `")+tablename+"_SRT` ("+
"ID int unsigned auto_increment primary key,"+
"LENGTH int,"+
"LOG_NAME char(64),"+
"LOG_ID int,"+
"CART_NUMBER int unsigned,"+
"CUT_NUMBER int,"+
"TITLE char(255),"+
"ARTIST char(255),"+
"PUBLISHER char(64),"+
"COMPOSER char(64),"+
"USER_DEFINED char(255),"+
"SONG_ID char(32),"+
"ALBUM char(255),"+
"LABEL char(64),"+
"CONDUCTOR char(64),"+
"USAGE_CODE int,"+
"DESCRIPTION char(64),"+
"OUTCUE char(64),"+
"ISRC char(12),"+
"ISCI char(32),"+
"STATION_NAME char(64),"+
"EVENT_DATETIME datetime,"+
"SCHEDULED_TIME time,"+
"EVENT_TYPE int,"+
"EVENT_SOURCE int,"+
"PLAY_SOURCE int,"+
"START_SOURCE int default 0,"+
"ONAIR_FLAG enum('N','Y') default 'N',"+
"EXT_START_TIME time,"+
"EXT_LENGTH int,"+
"EXT_CART_NAME char(32),"+
"EXT_DATA char(32),"+
"EXT_EVENT_ID char(8),"+
"EXT_ANNC_TYPE char(8),"+
"index EVENT_DATETIME_IDX(EVENT_DATETIME))"+
" charset latin1 collate latin1_swedish_ci"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
return true;
}