+sub take_job {
+ my ($daemon) = @_;
+ my $id = query(take_job_sth => $daemon)->list;
+ return $id ? job_full $id : undef;
+}
+
+sub finish_job {
+ my ($job, $private, %args) = @_;
+ db->update(jobs => \%args, {id => $job->{id}});
+ return if $private;
+ my $status = {
+ problem => $job->{problem},
+ owner => $job->{owner},
+ job => $job->{id},
+ solved => ($args{result} ? 0 : 1),
+ };
+ eval {
+ db->insert(problem_status => $status)
+ } or db->update(problem_status => $status, {owner => $job->{owner}, problem => $job->{problem}});
+}
+