X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=SL%2FDB%2FObject.pm;h=485fab2ceb5d0359d104d88063af79470a7661be;hb=ac9129294850cbe9f04119b3cbcf2a475ad8f4ba;hp=fa474643a8fe8f7d368a6fac0d98988f97346996;hpb=1aa3ce077e566920b86659b8d2f2bb88b922b83b;p=kivitendo-erp.git diff --git a/SL/DB/Object.pm b/SL/DB/Object.pm index fa474643a..485fab2ce 100755 --- a/SL/DB/Object.pm +++ b/SL/DB/Object.pm @@ -140,21 +140,15 @@ sub load { sub save { my ($self, @args) = @_; - my ($result, $exception); - my $worker = sub { - $exception = $EVAL_ERROR unless eval { - SL::DB::Object::Hooks::run_hooks($self, 'before_save'); - $result = $self->SUPER::save(@args); - SL::DB::Object::Hooks::run_hooks($self, 'after_save', $result); - 1; - }; + my $result; - return $result; - }; + $self->db->with_transaction(sub { + SL::DB::Object::Hooks::run_hooks($self, 'before_save'); + $result = $self->SUPER::save(@args); + SL::DB::Object::Hooks::run_hooks($self, 'after_save', $result); - $self->db->in_transaction ? $worker->() : $self->db->do_transaction($worker); - - die $exception if $exception; + 1; + }) || die $self->error; return $result; } @@ -162,21 +156,15 @@ sub save { sub delete { my ($self, @args) = @_; - my ($result, $exception); - my $worker = sub { - $exception = $EVAL_ERROR unless eval { - SL::DB::Object::Hooks::run_hooks($self, 'before_delete'); - $result = $self->SUPER::delete(@args); - SL::DB::Object::Hooks::run_hooks($self, 'after_delete', $result); - 1; - }; - - return $result; - }; + my $result; - $self->db->in_transaction ? $worker->() : $self->db->do_transaction($worker); + $self->db->with_transaction(sub { + SL::DB::Object::Hooks::run_hooks($self, 'before_delete'); + $result = $self->SUPER::delete(@args); + SL::DB::Object::Hooks::run_hooks($self, 'after_delete', $result); - die $exception if $exception; + 1; + }) || die $self->error; return $result; } @@ -336,6 +324,14 @@ Loads objects from the database which haven't been cached before and caches them for the duration of the current request (see L). +If you know in advance that you will likely need all objects of a +particular type then you can pre-cache them by calling the manager's +C function. For example, if you expect to need all unit +objects, you can use Ccache_all> before +you start the actual work. Later you can use +Cload_cached> to retrieve individual objects and be +sure that they're already cached. + This method can be called both as an instance method and a class method. It loads objects for the corresponding class (e.g. both Cload_cached(…)> and