Revision 96670fe8
Von Moritz Bunkus vor mehr als 8 Jahren hinzugefügt
SL/DB/Object.pm | ||
---|---|---|
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;
|
||
}
|
||
... | ... | |
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;
|
||
}
|
Auch abrufbar als: Unified diff
»with_transaction« anstelle von »do_transaction« verwenden
Es sollte so selten wie möglich »do_transaction« verwndet werden, damit
man sich immer angewöhnt, »with_transaction« zu nutzen.
Hintergründe und Unterschiede zwischen den beiden Funktionen sind in der
Dokumentation von SL/DB.pm beschrieben.