X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FBackgroundJob.pm;h=743a6b5eac5dd55f4f9724abbeecd03d5be0845e;hb=89c9ff022d3f13e27ba6bda085df15707fcfb0eb;hp=e6b099f5534369fa9b86ae91f07f23688361676f;hpb=295e585ae307aa9b4d7f5028187d1954b44e76af;p=kivitendo-erp.git diff --git a/SL/DB/BackgroundJob.pm b/SL/DB/BackgroundJob.pm index e6b099f55..743a6b5ea 100644 --- a/SL/DB/BackgroundJob.pm +++ b/SL/DB/BackgroundJob.pm @@ -1,13 +1,70 @@ -# This file has been auto-generated only because it didn't exist. -# Feel free to modify it at will; it will not be overwritten automatically. - package SL::DB::BackgroundJob; use strict; +use DateTime::Event::Cron; +use English qw(-no_match_vars); + use SL::DB::MetaSetup::BackgroundJob; +use SL::DB::Manager::BackgroundJob; + +use SL::DB::BackgroundJobHistory; + +use SL::BackgroundJob::Test; + +sub update_next_run_at { + my $self = shift; + + my $cron = DateTime::Event::Cron->new_from_cron($self->cron_spec || '* * * * *'); + $self->update_attributes(next_run_at => $cron->next(DateTime->now_local)); + return $self; +} + +sub run { + my $self = shift; + + my $package = "SL::BackgroundJob::" . $self->package_name; + my $run_at = DateTime->now_local; + my $history; + + my $ok = eval { + my $result = $package->new->run($self); + + $history = SL::DB::BackgroundJobHistory + ->new(package_name => $self->package_name, + run_at => $run_at, + status => 'success', + result => $result, + data => $self->data); + $history->save; + + 1; + }; + + if (!$ok) { + my $error = $EVAL_ERROR; + $history = SL::DB::BackgroundJobHistory + ->new(package_name => $self->package_name, + run_at => $run_at, + status => 'failure', + error_col => $error, + data => $self->data); + $history->save; + + $::lxdebug->message(LXDebug->WARN(), "BackgroundJob ID " . $self->id . " execution error (first three lines): " . join("\n", (split(m/\n/, $error))[0..2])); + } + + $self->assign_attributes(last_run_at => $run_at)->update_next_run_at; + + return $history; +} -# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all. -__PACKAGE__->meta->make_manager_class; +sub data_as_hash { + my $self = shift; + return {} if !$self->data; + return $self->data if ref($self->{data}) eq 'HASH'; + return YAML::Load($self->{data}) if !ref($self->{data}); + return {}; +} 1;