The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Qudo::Job;
use strict;
use warnings;

sub new {
    my ($class, %args) = @_;
    bless {%args}, $class;
}

sub id       { $_[0]->{job_data}->{job_id}       }
sub uniqkey  { $_[0]->{job_data}->{job_uniqkey}  }
sub func_id  { $_[0]->{job_data}->{func_id}      }

sub funcname {
    my $self = shift;
    $self->manager->funcid_to_name($self->func_id, $self->db);
}

sub retry_cnt     { $_[0]->{job_data}->{job_retry_cnt}     }
sub grabbed_until { $_[0]->{job_data}->{job_grabbed_until} }
sub priority { $_[0]->{job_data}->{job_priority} }
sub arg : lvalue  { $_[0]->{job_data}->{job_arg}           }
sub arg_origin : lvalue { $_[0]->{arg_origin} }
sub db { $_[0]->{db} }

sub manager  { $_[0]->{manager} }
sub job_start_time : lvalue { $_[0]->{job_start_time} }

sub completed {
    my $self = shift;

    $self->{_complete} = 1;

    return unless $self->funcname->set_job_status;
    $self->manager->set_job_status($self, 'completed');
}

sub is_completed { $_[0]->{_complete} }
sub is_aborted   { $_[0]->{_abort}    }
sub is_failed    { $_[0]->{_fail}    }

sub reenqueue {
    my ($self, $args) = @_;
    $self->manager->reenqueue($self, $args);
}

sub dequeue {
    my $self = shift;
    $self->manager->dequeue($self);
}

sub error {
    my ($self, ) = @_;
    return $self->{_error}
}

sub failed {
    my ($self, $error) = @_;

    $self->{_fail} = 1;
    $self->{_error} = $error;

    if ($self->funcname->set_job_status) {
        $self->manager->set_job_status($self, 'failed');
    }
    $self->manager->job_failed($self, $error);
}

sub abort {
    my ($self, $error) = @_;

    $self->{_abort} = 1;
    $error ||= 'abort!!';
    $self->{_error} = $error;

    if ($self->funcname->set_job_status) {
        $self->manager->set_job_status($self, 'abort');
    }
    $self->manager->job_failed($self, $error);
}

sub replace {
    my ($self, @jobs) = @_;

    my $db = $self->manager->driver_for($self->db);
    $db->dbh->begin_work;

        for my $job (@jobs) {
            $self->manager->enqueue(@$job, $self->db);
        }

        $self->completed;

    $db->dbh->commit;
}

1;