LXDebug: Flag SHOW_CALLER für Ausgabe Dateiname:Zeilennummer bei message() & dump()
[kivitendo-erp.git] / SL / DB / Object.pm
index 4ecaab2..485fab2 100755 (executable)
@@ -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;
 }
@@ -232,7 +220,7 @@ sub clone_and_reset {
   my @mutators            = $meta->column_mutator_method_names;
   my @column_names        =
     grep     { $_->[0] && $_->[1] && !$_skip_fields_when_cloning{ $_->[0] } }
-    pairwise { [ $a, $b] } @accessors, @mutators;
+    pairwise { no warnings qw(once); [ $a, $b] } @accessors, @mutators;
 
   my $clone = $class->new(map { my $method = $_->[0]; ($_->[1] => $self->$method) } @column_names);
 
@@ -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<SL::Request/cache>).
 
+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<cache_all> function. For example, if you expect to need all unit
+objects, you can use C<SL::DB::Manager::Unit-E<gt>cache_all> before
+you start the actual work. Later you can use
+C<SL::DB::Unit-E<gt>load_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
 C<SL::DB::Part-E<gt>load_cached(…)> and