diff options
-rwxr-xr-x | lib/RHRD/rddb.pm | 149 | ||||
-rwxr-xr-x | utils/rd-show | 133 |
2 files changed, 204 insertions, 78 deletions
diff --git a/lib/RHRD/rddb.pm b/lib/RHRD/rddb.pm index 2ad8297..e3e4b0b 100755 --- a/lib/RHRD/rddb.pm +++ b/lib/RHRD/rddb.pm @@ -35,6 +35,7 @@ use constant { RD_MAX_CART => 999999, RD_MIN_CUT => 1, RD_MAX_CUT => 999, + RD_FADE_DEPTH => -3000, RHRD_CONFIG_FILE => '/etc/rhrd.conf', }; @@ -52,7 +53,7 @@ sub init $ctx{'config'}{'specialgroups'}{'shows'} = $cfg->val('specialgroups', 'shows', 'SHOWS'); $ctx{'config'}{'specialgroups'}{'allshows'} = $cfg->val('specialgroups', 'allshows', 'ALL_SHOWS'); $ctx{'config'}{'specialgroups'}{'allpools'} = $cfg->val('specialgroups', 'allpools', 'ALL_POOLS'); - $ctx{'config'}{'specialgroups'}{'allingles'} = $cfg->val('specialgroups', 'alljingles', 'ALL_JINGLE'); + $ctx{'config'}{'specialgroups'}{'alljingles'} = $cfg->val('specialgroups', 'alljingles', 'ALL_JINGLE'); @{$ctx{'config'}{'specialusers'}{'no-update-token'}} = split(' ', $cfg->val('specialusers', 'no-update-token', '')); @{$ctx{'config'}{'specialusers'}{'admins'}} = split(' ', $cfg->val('specialusers', 'admins', 'admin')); @@ -61,6 +62,11 @@ sub init $ctx{'config'}{'dropboxes'}{'dropbox-pseudo-station'} = $cfg->val('dropboxes', 'dropbox-pseudo-station', 'import-dropbox'); + $ctx{'config'}{'shows'}{'service'} = $cfg->val('shows', 'service', ''); + $ctx{'config'}{'shows'}{'defaultuser'} = $cfg->val('shows', 'defaultuser', ''); + @{$ctx{'config'}{'shows'}{'logprefix'}} = split(' ', $cfg->val('shows', 'logprefix', '')); + @{$ctx{'config'}{'shows'}{'logsuffix'}} = split(' ', $cfg->val('shows', 'logsuffix', '')); + my ($dbh, $status, $errorstring) = opendb(); unless(defined $dbh) { return ($dbh, $status, $errorstring); @@ -170,6 +176,88 @@ sub get_next_free_slot return ($low_cart, $high_cart); } +sub check_log_exists +{ + my ($ctx, $logname) = @_; + + my $sql = qq{select LOG_EXISTS from LOGS where NAME = ?;}; + my $sth = $ctx->{'dbh'}->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $ctx->{'dbh'}->errstr); + + $sth->execute($logname) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + my $log_exists = $sth->fetchrow_array(); + $sth->finish(); + + if(!defined $log_exists || $log_exists ne 'Y') { + return (0, 'OK', 'log does not exist'); + } + return (1, 'OK', 'log exists'); +} + +sub create_log_table +{ + my ($ctx, $logname) = @_; + + $logname=~s/ /_/g; + $logname = $ctx->{'dbh'}->quote_identifier($logname . '_LOG'); + my $sql = qq{ + create table if not exists $logname + (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, + 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, + FADEUP_GAIN int default ?, + FADEDOWN_POINT int default -1, + FADEDOWN_GAIN int default ?, + SEGUE_START_POINT INT NOT NULL DEFAULT -1, + SEGUE_END_POINT INT NOT NULL DEFAULT -1, + SEGUE_GAIN int default ?, + 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)); + }; + + my $sth = $ctx->{'dbh'}->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $ctx->{'dbh'}->errstr); + + $sth->execute(RD_FADE_DEPTH, RD_FADE_DEPTH, RD_FADE_DEPTH) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + return (1, 'OK', 'success'); +} + + ########################### TOKEN handling ########################### sub get_token @@ -850,25 +938,19 @@ sub get_show_carts return (undef, $status, $errorstring); } - my $sql = qq{select LOG_EXISTS from LOGS where NAME = ?;}; - my $sth = $ctx->{'dbh'}->prepare($sql) - or return (undef, 'ERROR', "Database Error: " . $ctx->{'dbh'}->errstr); - - $sth->execute($log) - or return (undef, 'ERROR', "Database Error: " . $sth->errstr); - - my $log_exists = $sth->fetchrow_array(); - $sth->finish(); - - if(!defined $log_exists || $log_exists ne 'Y') { + (my $log_exists, $status, $errorstring) = check_log_exists($ctx, $log); + unless (defined $log_exists) { + return (undef, $status, $errorstring); + } + unless($log_exists) { return (undef, 'ERROR', "Log with name '$log' does not exist") } $log=~s/ /_/g; $log = $ctx->{'dbh'}->quote_identifier($log . '_LOG'); - $sql = qq{select COUNT,CART_NUMBER from $log order by COUNT;}; + my $sql = qq{select COUNT,CART_NUMBER from $log order by COUNT;}; - $sth = $ctx->{'dbh'}->prepare($sql) + my $sth = $ctx->{'dbh'}->prepare($sql) or return (undef, 'ERROR', "Database Error: " . $ctx->{'dbh'}->errstr); $sth->execute() @@ -885,6 +967,45 @@ sub get_show_carts return @carts; } +sub create_show_log +{ + my ($ctx, $logname, $low_cart, $high_cart) = @_; + + my ($log_exists, $status, $errorstring) = check_log_exists($ctx, $logname); + unless (defined $log_exists) { + return (undef, $status, $errorstring); + } + if($log_exists) { + return (undef, 'ERROR', "Log with name '" . $logname . "' already exists") + } + + my $sql = qq{insert into LOGS set NAME = ?, LOG_EXISTS='N', TYPE=0, DESCRIPTION = ?, ORIGIN_USER = ?, ORIGIN_DATETIME=NOW(), LINK_DATETIME=NOW(), SERVICE = ?}; + + my $sth = $ctx->{'dbh'}->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $ctx->{'dbh'}->errstr); + + $sth->execute($logname, $logname . " log", $ctx->{'config'}{'shows'}{'defaultuser'}, $ctx->{'config'}{'shows'}{'service'}) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + (my $result, $status, $errorstring) = create_log_table($ctx, $logname); + unless (defined $result && defined $status) { + return (undef, $status, $errorstring); + } + +# TODO: fill up new log with cart references + my $next_id = 0; + + $sql = qq{update LOGS set LOG_EXISTS='Y', AUTO_REFRESH='Y', NEXT_ID = ? where NAME = ?}; + + $sth = $ctx->{'dbh'}->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $ctx->{'dbh'}->errstr); + + $sth->execute($next_id, $logname) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + return (1, 'OK', 'success'); +} + ########################### MUSICPOOL handling ########################### sub get_musicpools_cart_range diff --git a/utils/rd-show b/utils/rd-show index c2db583..c193f11 100755 --- a/utils/rd-show +++ b/utils/rd-show @@ -75,6 +75,67 @@ sub show +sub add__check_arguments +{ + my ($name, $title, $num_carts, $rhythm, $dow, $starttime, $len) = @_; + + if($name !~ m/^[a-zA-Z0-9_]{1,10}$/) { + print STDERR "name '" . $name . "' contains illegal characters or is too long/short\n"; + print STDERR " only a-z, A-Z, 0-9 and _ are allowed and the length must be between 1 and 10\n"; + return 1; + } + + if($num_carts <= 0) { + print STDERR "num-carts '" . $num_carts . "' must be > 0\n"; + return 1; + } + + if($rhythm !~ m/^[01]{4}$/ || $rhythm eq '0000') { + print STDERR "rhythm '" . $rhythm . "' contains illegal characters or is too long/short\n"; + print STDERR " only 0 or 1 are allowed and, length must be exactly 4 and it must not be '0000'\n"; + return 1; + } + + if($dow < 1 || $dow > 7) { + print STDERR "dow '" . $dow . "' is out of range, must be between 1 and 7 (1=Monday, ..., 7=Sunday)\n"; + return 1; + } + + if($starttime !~ m/^[0-2][0-9][0-5][0-9]$/ || $starttime > 2359) { + print STDERR "starttime '" . $starttime . "' is not a valid time must be HHMM\n"; + return 1; + } + + if($len <= 0) { + print STDERR "len '" . $len . "' must be > 0\n"; + return 1; + } + + return 0; +} + +sub add__get_show_carts +{ + my ($ctx, $groupname, $num_carts) = @_; + + my ($result, $status, $errorstring) = RHRD::rddb::check_group($ctx, $groupname); + unless(defined $result) { + print STDERR $status . ": " . $errorstring . "\n"; + return undef; + } + + my $low_cart = 0; + if($result) { + print " > using existing group '" . $groupname . "'\n"; + $low_cart = add__get_free_group_carts($ctx, $groupname, $num_carts); + } else { + print " > '" . $groupname . "' does not exist - creating it .. "; + $low_cart = add__create_group($ctx, $groupname); + } + + return $low_cart; +} + sub add__create_group { my ($ctx, $groupname) = @_; @@ -121,7 +182,7 @@ sub add__get_free_group_carts return undef; } - my @dropboxes = RHRD::rddb::get_dropboxes($ctx, 'player', $groupname, 'S'); + my @dropboxes = RHRD::rddb::get_dropboxes($ctx, $ctx->{'config'}{'shows'}{'defaultuser'}, $groupname, 'S'); if(!defined $dropboxes[0]) { if(defined $dropboxes[1]) { print STDERR "$dropboxes[1]: $dropboxes[2]"; @@ -146,74 +207,13 @@ sub add__get_free_group_carts $low_cart += 1; } if(($low_cart + $num_carts -1) > $high_cart) { - print STDERR "there are not enough carts free\n"; + print STDERR "there are not enough free carts\n"; return undef; } return $low_cart; } -sub add__get_show_carts -{ - my ($ctx, $groupname, $num_carts) = @_; - - my ($result, $status, $errorstring) = RHRD::rddb::check_group($ctx, $groupname); - unless(defined $result) { - print STDERR $status . ": " . $errorstring . "\n"; - return undef; - } - - my $low_cart = 0; - if($result) { - print " > using existing group '" . $groupname . "'\n"; - $low_cart = add__get_free_group_carts($ctx, $groupname, $num_carts); - } else { - print " > '" . $groupname . "' does not exist - creating it .. "; - $low_cart = add__create_group($ctx, $groupname); - } - - return $low_cart; -} - -sub add__check_arguments -{ - my ($name, $title, $num_carts, $rhythm, $dow, $starttime, $len) = @_; - - if($name !~ m/^[a-zA-Z0-9_]{1,10}$/) { - print STDERR "name '" . $name . "' contains illegal characters or is too long/short\n"; - print STDERR " only a-z, A-Z, 0-9 and _ are allowed and the length must be between 1 and 10\n"; - return 1; - } - - if($num_carts <= 0) { - print STDERR "num-carts '" . $num_carts . "' must be > 0\n"; - return 1; - } - - if($rhythm !~ m/^[01]{4}$/ || $rhythm eq '0000') { - print STDERR "rhythm '" . $rhythm . "' contains illegal characters or is too long/short\n"; - print STDERR " only 0 or 1 are allowed and, length must be exactly 4 and it must not be '0000'\n"; - return 1; - } - - if($dow < 1 || $dow > 7) { - print STDERR "dow '" . $dow . "' is out of range, must be between 1 and 7 (1=Monday, ..., 7=Sunday)\n"; - return 1; - } - - if($starttime !~ m/^[0-2][0-9][0-5][0-9]$/ || $starttime > 2359) { - print STDERR "starttime '" . $starttime . "' is not a valid time must be HHMM\n"; - return 1; - } - - if($len <= 0) { - print STDERR "len '" . $len . "' must be > 0\n"; - return 1; - } - - return 0; -} - sub add { my ($ctx, $groupname, $name, $title, $num_carts, $rhythm, $dow, $starttime, $len) = @_; @@ -230,8 +230,13 @@ sub add my $high_cart = $low_cart + $num_carts - 1; print " * will be using carts: " . $low_cart . " - " . $high_cart . "\n"; + my ($result, $status, $errorstring) = RHRD::rddb::create_show_log($ctx, $name, $low_cart, $high_cart); + unless(defined $result) { + print STDERR $status . ": " . $errorstring . "\n"; + return 1; + } + # TODO: - # create log named <name> and fill with $low_cart - $high_cart # create macro cart referencing log -> show-id # create dropbox for: groupname, show-id, $rhythm, $dow, $starttime, $len |