Fred Gleason 7f44ad5780 2021-04-22 Fred Gleason <fredg@paravelsystems.com>
* Escaped all SQL identifiers in 'utils/rddbmgr/'.
	* Replaced " with ' delimiters in all SQL literal strings in
	'utils/rddbmgr/'.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
2021-04-22 20:44:19 -04:00

2809 lines
89 KiB
C++

// create.cpp
//
// Routines for --create for rddbmgr(8)
//
// (C) Copyright 2018-2021 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(station_name.toUtf8());
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'",
RDEscapeString(q->value(0).toString()).
toUtf8().constData(),
RDEscapeString(RD_SERVICE_NAME).toUtf8().constData());
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().toUtf8().constData(),
RDConfiguration()->audioExtension().toUtf8().
constData());
QString cmd=QString().sprintf("rdgen -t 10 -l 16 %s",
filename.toUtf8().constData());
system(cmd.toUtf8());
if(getuid()==0) {
chown(filename.toUtf8(),RDConfiguration()->uid(),
RDConfiguration()->gid());
chmod (filename.toUtf8(),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;
}