X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FBackgroundJob.pm;h=b567d364e8bcdaf4c8e7c7dc993288c235e78566;hb=317450cb2e2514d838616562fc478dad2009d103;hp=253d0d380d0e05c9b3262e3fecd7b0e36e0bbd56;hpb=c5db99b7266c59922db2dcc519c3cfd2349b86cc;p=kivitendo-erp.git diff --git a/SL/DB/BackgroundJob.pm b/SL/DB/BackgroundJob.pm index 253d0d380..b567d364e 100644 --- a/SL/DB/BackgroundJob.pm +++ b/SL/DB/BackgroundJob.pm @@ -8,9 +8,18 @@ use English qw(-no_match_vars); use SL::DB::MetaSetup::BackgroundJob; use SL::DB::Manager::BackgroundJob; -use SL::DB::BackgroundJobHistory; +use SL::System::Process; -use SL::BackgroundJob::Test; +__PACKAGE__->meta->initialize; + +__PACKAGE__->before_save('_before_save_set_next_run_at'); + +sub _before_save_set_next_run_at { + my ($self) = @_; + + $self->update_next_run_at if !$self->next_run_at; + return 1; +} sub update_next_run_at { my $self = shift; @@ -27,13 +36,16 @@ sub run { my $run_at = DateTime->now_local; my $history; + require SL::DB::BackgroundJobHistory; + my $ok = eval { + eval "require $package" or die $@; my $result = $package->new->run($self); $history = SL::DB::BackgroundJobHistory ->new(package_name => $self->package_name, run_at => $run_at, - status => 'success', + status => SL::DB::BackgroundJobHistory::SUCCESS(), result => $result, data => $self->data); $history->save; @@ -42,13 +54,16 @@ sub run { }; if (!$ok) { + my $error = $EVAL_ERROR; $history = SL::DB::BackgroundJobHistory ->new(package_name => $self->package_name, run_at => $run_at, - status => 'failure', - error_col => $EVAL_ERROR, + status => SL::DB::BackgroundJobHistory::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; @@ -64,4 +79,34 @@ sub data_as_hash { return {}; } +sub set_data { + my ($self, %data) = @_; + + my $data = YAML::Load($self->data); + $data->{$_} = $data{$_} for keys %data; + $self->data(YAML::Dump($data)); + + $self; +} + +sub validate { + my ($self) = @_; + + my @errors; + + push @errors, $::locale->text('The execution type is invalid.') if ($self->type || '') !~ m/^(?: once | interval )$/x; + + if ( (($self->package_name || '') !~ m/^ [A-Z][A-Za-z0-9]+ $/x) + || ! -f (SL::System::Process::exe_dir() . "/SL/BackgroundJob/" . $self->package_name . ".pm")) { + push @errors, $::locale->text('The package name is invalid.'); + } + + eval { + DateTime::Event::Cron->new_from_cron($self->cron_spec || '* * * * *')->next(DateTime->now_local); + 1; + } or push @errors, $::locale->text('The execution schedule is invalid.'); + + return @errors; +} + 1;