X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FObject.pm;h=c258761d17b76eb7ca5c632521f7d99ce28264dd;hb=b269674b6b0e99818c3643d4fc3271a8ce83b8c6;hp=4ecaab2edf7838c76069a8613a16b22b40e9a732;hpb=da6a187ab3fc3cbb97e094559dc964a9809f347b;p=kivitendo-erp.git diff --git a/SL/DB/Object.pm b/SL/DB/Object.pm index 4ecaab2ed..c258761d1 100755 --- a/SL/DB/Object.pm +++ b/SL/DB/Object.pm @@ -12,6 +12,7 @@ use SL::DB; use SL::DB::Helper::Attr; use SL::DB::Helper::Metadata; use SL::DB::Helper::Manager; +use SL::DB::Helper::Presenter; use SL::DB::Object::Hooks; use base qw(Rose::DB::Object); @@ -140,21 +141,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->in_transaction ? $worker->() : $self->db->do_transaction($worker); + $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); - die $exception if $exception; + 1; + }) || die $self->db->error; return $result; } @@ -162,21 +157,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; - }; + my $result; - return $result; - }; + $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); - $self->db->in_transaction ? $worker->() : $self->db->do_transaction($worker); - - die $exception if $exception; + 1; + }) || die $self->db->error; return $result; } @@ -232,7 +221,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); @@ -250,6 +239,32 @@ sub clone_and_reset { return $clone; } +sub presenter { + my ($class_or_self) = @_; + + if (ref $class_or_self) { + my $class = ref $class_or_self; + $class =~ s{^SL::DB::}{SL::Presenter::}; + return SL::DB::Helper::Presenter->new($class, $class_or_self); + } else { + $class_or_self =~ s{^SL::DB::}{SL::Presenter::}; + return $class_or_self; + } +} + +sub as_debug_info { + my ($self) = @_; + + return { + map { + my $column_name = $_->name; + my $value = $self->$column_name; + $value = !defined($value) ? undef : "${value}"; + ($_ => $value) + } $self->meta->columns + }; +} + 1; __END__ @@ -336,6 +351,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 @@ -365,6 +388,20 @@ The difference between Rose's and this function is that this function will also skip setting the following fields if such columns exist for C<$self>: C, C. +=item C + +Returns a proxy wrapper that will dispatch all method calls to the presenter +with the same name as the class of the involking object. + +For the full documentation about its capabilites see +L + +=item C + +Returns a hash containing solely the essentials for dumping it with +L. The returned hash consists of the column names with +associated column values in stringified form. + =back =head1 AUTHOR