=head1 NAME
-Gruntmaster::Data::Result::Job
+Gruntmaster::Data::Result::Job - List of jobs
=cut
data_type: 'text'
is_nullable: 1
+hostname:PID of daemon that last executed this job. NULL if never executed
+
=head2 date
data_type: 'bigint'
is_nullable: 0
+Unix time when job was submitted
+
=head2 errors
data_type: 'text'
is_nullable: 1
+Compiler errors
+
=head2 extension
data_type: 'text'
is_nullable: 0
+File extension of submitted program, without a leading dot
+
=head2 format
data_type: 'text'
is_nullable: 0
+Format (programming language) of submitted program
+
=head2 private
data_type: 'boolean'
is_foreign_key: 1
is_nullable: 0
+=head2 reference
+
+ data_type: 'integer'
+ is_nullable: 1
+
+If not null, this is a reference solution that should get this result. For example, set reference=0 on jobs that should be accepted, reference=3 on jobs that should get TLE, etc
+
=head2 result
data_type: 'integer'
is_nullable: 1
+Job result (integer constant from Gruntmaster::Daemon::Constants)
+
=head2 result_text
data_type: 'text'
is_nullable: 1
+Job result (human-readable text)
+
=head2 results
data_type: 'text'
is_nullable: 1
+Per-test results (JSON array of hashes with keys id (test number, counting from 1), result (integer constant from Gruntmaster::Daemon::Constants), result_text (human-readable text), time (execution time in decimal seconds))
+
=head2 source
data_type: 'text'
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
"problem",
{ data_type => "text", is_foreign_key => 1, is_nullable => 0 },
+ "reference",
+ { data_type => "integer", is_nullable => 1 },
"result",
{ data_type => "integer", is_nullable => 1 },
"result_text",
{
is_deferrable => 0,
join_type => "LEFT",
- on_delete => "NO ACTION",
+ on_delete => "CASCADE",
on_update => "NO ACTION",
},
);
"owner",
"Gruntmaster::Data::Result::User",
{ id => "owner" },
- { is_deferrable => 0, on_delete => "NO ACTION", on_update => "NO ACTION" },
+ { is_deferrable => 0, on_delete => "CASCADE", on_update => "NO ACTION" },
);
=head2 problem
"problem",
"Gruntmaster::Data::Result::Problem",
{ id => "problem" },
- { is_deferrable => 0, on_delete => "NO ACTION", on_update => "NO ACTION" },
+ { is_deferrable => 0, on_delete => "CASCADE", on_update => "NO ACTION" },
+);
+
+=head2 problem_statuses
+
+Type: has_many
+
+Related object: L<Gruntmaster::Data::Result::ProblemStatus>
+
+=cut
+
+__PACKAGE__->has_many(
+ "problem_statuses",
+ "Gruntmaster::Data::Result::ProblemStatus",
+ { "foreign.job" => "self.id" },
+ { cascade_copy => 0, cascade_delete => 0 },
);
-# Created by DBIx::Class::Schema::Loader v0.07039 @ 2014-03-26 15:24:46
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:dnYOXMU6Or/Wh0m5A1N5UA
+# Created by DBIx::Class::Schema::Loader v0.07042 @ 2015-03-16 15:40:48
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:aaVaCgk198pT0kBGMefkkA
+
+use Class::Method::Modifiers qw/after/;
+
+sub rawcontest { shift->get_column('contest') }
+sub rawowner { shift->get_column('owner') }
+sub rawproblem { shift->get_column('problem') }
sub rerun {
shift->update({daemon => undef, result => -2, result_text => undef});
}
+after qw/insert update delete/ => sub {
+ my ($self) = @_;
+ Gruntmaster::Data::purge '/us/';
+ Gruntmaster::Data::purge '/us/' . $self->rawowner;
+ Gruntmaster::Data::purge '/st/' . $self->rawcontest if $self->rawcontest;
+ Gruntmaster::Data::purge '/log/';
+ Gruntmaster::Data::purge '/log/' . $self->id;
+};
+
1;
__END__