1package Qudo::Job;
2use strict;
3use warnings;
4
5sub new {
6    my ($class, %args) = @_;
7    bless {%args}, $class;
8}
9
10sub id       { $_[0]->{job_data}->{job_id}       }
11sub uniqkey  { $_[0]->{job_data}->{job_uniqkey}  }
12sub func_id  { $_[0]->{job_data}->{func_id}      }
13
14sub funcname {
15    my $self = shift;
16    $self->manager->funcid_to_name($self->func_id, $self->db);
17}
18
19sub retry_cnt     { $_[0]->{job_data}->{job_retry_cnt}     }
20sub grabbed_until { $_[0]->{job_data}->{job_grabbed_until} }
21sub priority { $_[0]->{job_data}->{job_priority} }
22sub arg : lvalue  { $_[0]->{job_data}->{job_arg}           }
23sub arg_origin : lvalue { $_[0]->{arg_origin} }
24sub db { $_[0]->{db} }
25
26sub manager  { $_[0]->{manager} }
27sub job_start_time : lvalue { $_[0]->{job_start_time} }
28
29sub completed {
30    my $self = shift;
31
32    $self->{_complete} = 1;
33
34    return unless $self->funcname->set_job_status;
35    $self->manager->set_job_status($self, 'completed');
36}
37
38sub is_completed { $_[0]->{_complete} }
39sub is_aborted   { $_[0]->{_abort}    }
40sub is_failed    { $_[0]->{_fail}    }
41
42sub reenqueue {
43    my ($self, $args) = @_;
44    $self->manager->reenqueue($self, $args);
45}
46
47sub dequeue {
48    my $self = shift;
49    $self->manager->dequeue($self);
50}
51
52sub error {
53    my ($self, ) = @_;
54    return $self->{_error}
55}
56
57sub failed {
58    my ($self, $error) = @_;
59
60    $self->{_fail} = 1;
61    $self->{_error} = $error;
62
63    if ($self->funcname->set_job_status) {
64        $self->manager->set_job_status($self, 'failed');
65    }
66    $self->manager->job_failed($self, $error);
67}
68
69sub abort {
70    my ($self, $error) = @_;
71
72    $self->{_abort} = 1;
73    $error ||= 'abort!!';
74    $self->{_error} = $error;
75
76    if ($self->funcname->set_job_status) {
77        $self->manager->set_job_status($self, 'abort');
78    }
79    $self->manager->job_failed($self, $error);
80}
81
82sub replace {
83    my ($self, @jobs) = @_;
84
85    my $db = $self->manager->driver_for($self->db);
86    $db->dbh->begin_work;
87
88        for my $job (@jobs) {
89            $self->manager->enqueue(@$job, $self->db);
90        }
91
92        $self->completed;
93
94    $db->dbh->commit;
95}
96
971;
98
99