-sub process{
- my $dir = $_[0];
-
- chdir $dir;
- mkdir "in";
- for (<*>) {
- cp $_, "in" unless $_ eq 'in';
- }
-
- my @results;
- my @full_results = ();
- my $meta = {};
- try {
- $meta = LoadFile "meta.yml";
- if (exists $meta->{problem}) {
- my $problem = $meta->{problem};
- die "No such problem: $problem" unless -d "../../pb/$problem";
- for (<../../pb/$problem/*>) {
- cp $_, '.' unless $_ eq "../../pb/$problem/meta.yml"
- }
-
- my $pbmeta = LoadFile "../../pb/$problem/meta.yml";
- $meta = {%$meta, %$pbmeta};
- }
+sub process_job {
+ my ($job) = @_;
+ my $meta = {
+ problem => $job->problem->id,
+ files => {
+ prog => {
+ name => 'prog.' . $job->extension,
+ format => $job->format,
+ content => $job->source,
+ },
+ },
+ map { $_ => $job->problem->get_column($_) } qw/generator runner judge precnt testcnt timeout olimit/
+ };
+ my $limit_override = $job->result_source->schema->limits->find($meta->{problem}, $job->format);
+ $meta->{timeout} = $limit_override->timeout if $limit_override;
+ $meta->{tests} = decode_json $job->problem->tests if $meta->{runner} eq 'File';
+ delete $meta->{precnt} unless $job->contest && $job->contest->is_running;
+ $meta->{testcnt} = $meta->{precnt} if $meta->{precnt};
+
+ $meta->{files}{ver} = {
+ name => 'ver.' . FORMAT_EXTENSION->{$job->problem->verformat},
+ format => $job->problem->verformat,
+ content => $job->problem->versource,
+ } if $job->problem->verformat;
+
+ process $meta;
+
+ $meta->{result_text} .= ' (pretests)' if $meta->{precnt};
+ $job->update({
+ result => $meta->{result},
+ result_text => $meta->{result_text},
+ ($meta->{results} ? (results => encode_json $meta->{results}) : ()),
+ $meta->{errors} ? (errors => $meta->{errors}) : ()
+ });
+
+ my $solved = $meta->{result} ? 0 : 1;
+ my $status = $db->problem_statuses->find($job->owner, $job->problem);
+ $db->problem_statuses->update_or_create({
+ problem => $job->problem,
+ owner => $job->owner,
+ job => $job->id,
+ solved => $solved}) if !$job->problem->private;
+}