use strict;
use warnings;
+ccbs::admin_only();
+
my $dbh = ccbs::db_connect();
my $cgi = new CGI;
$dbh->{AutoCommit} = 0;
+my $tournamentdata = $dbh->selectrow_hashref('SELECT * FROM tournaments NATURAL JOIN machines WHERE tournament=?',
+ undef, $tournament);
+
+my %checked_songs = ();
+
# Loop through all parameters and see what parameters differ between old- and current
# versions
for my $p ($cgi->param()) {
my $val = $cgi->param($p);
undef $val if ($val =~ /^\s*$/);
+ # _Before_ we do changes to the database, check if this is possibly something
+ # that will trigger a foreign key error. There will be an error if the tuple
+ # (song,playmode,difficulty) is set (ie. all members are set) and the combination
+ # doesn't exist in songratings, so check that. However, only check once per
+ # song (or else we'll be doing lots of unneeded database calls).
+ if ($p =~ /^(?:playmode|difficulty|song)(\d+)-(\d+)$/ && !defined($checked_songs{"$1-$2"})) {
+ # check that the entire triple is set
+ if (defined($cgi->param("playmode$1-$2")) && $cgi->param("playmode$1-$2") !~ /^\s*$/ &&
+ defined($cgi->param("difficulty$1-$2")) && $cgi->param("difficulty$1-$2") !~ /^\s*$/ &&
+ defined($cgi->param("song$1-$2")) && $cgi->param("song$1-$2") !~ /^\s*$/) {
+ my $ref = $dbh->selectrow_hashref('SELECT COUNT(*) AS num_songs FROM songratings WHERE song=? AND playmode=? AND difficulty=? AND machine=?',
+ undef, $cgi->param("song$1-$2"), $cgi->param("playmode$1-$2"),
+ $cgi->param("difficulty$1-$2"), $tournamentdata->{'machine'});
+ if ($ref->{'num_songs'} != 1) {
+ # Fetch the name of the song if we can
+ $ref = $dbh->selectrow_hashref('SELECT title FROM songs WHERE song=?',
+ undef, $cgi->param("song$1-$2"));
+ ccbs::user_error("Sangen $ref->{'title'} har ikke steps for " .
+ $cgi->param("playmode$1-$2") . " " . $cgi->param("difficulty$1-$2") . " på ".
+ $tournamentdata->{'machinename'} . ".");
+ }
+ $checked_songs{"$1-$2"} = 1;
+ }
+ }
+
if ($p =~ /^score(\d+)-(\d+)/) {
if (defined($val) && ($val < 0 || $val > 10000)) {
ccbs::user_error("Alle poengsummer må være mellom 0 og 10000 (inklusive).");
}
}
+$dbh->do('UPDATE bigscreen.active_groups SET last_updated=now() WHERE tournament=? AND round=? AND parallel=?',
+ undef, $tournament, $round, $group);
+$dbh->do('NOTIFY scores');
+
$dbh->commit;
$dbh->disconnect;
-ccbs::print_see_other('show-tournament.pl?id=' . $tournament);
+ccbs::print_see_other('show-tournament.pl?id=' . $tournament . '#round' . $round);