X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRelationship%2FCascadeActions.pm;h=6b5b403107b4dbe748ae1bc749fd04c15d30fd30;hb=4b8a53eabdb1629bacdb95f04ca8fc3718ca7c58;hp=c3a66eaba1ead1493684d66374f7e82c5a83b8cd;hpb=b82c8a28bb4cb7d704496b8ce3966565d255d5b3;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Relationship/CascadeActions.pm b/lib/DBIx/Class/Relationship/CascadeActions.pm index c3a66ea..6b5b403 100644 --- a/lib/DBIx/Class/Relationship/CascadeActions.pm +++ b/lib/DBIx/Class/Relationship/CascadeActions.pm @@ -3,8 +3,9 @@ package # hide from PAUSE use strict; use warnings; +use DBIx::Class::Carp; -our %_pod_inherit_config = +our %_pod_inherit_config = ( class_map => { 'DBIx::Class::Relationship::CascadeActions' => 'DBIx::Class::Relationship' } ); @@ -16,15 +17,29 @@ sub delete { # be handling this anyway. Assuming we have joins we probably actually # *could* do them, but I'd rather not. - my $ret = $self->next::method(@rest); - my $source = $self->result_source; my %rels = map { $_ => $source->relationship_info($_) } $source->relationships; my @cascade = grep { $rels{$_}{attrs}{cascade_delete} } keys %rels; - foreach my $rel (@cascade) { - $self->search_related($rel)->delete_all; + + if (@cascade) { + my $guard = $source->schema->txn_scope_guard; + + my $ret = $self->next::method(@rest); + + foreach my $rel (@cascade) { + if( my $rel_rs = eval{ $self->search_related($rel) } ) { + $rel_rs->delete_all; + } else { + carp "Skipping cascade delete on relationship '$rel' - related resultsource '$rels{$rel}{class}' is not registered with this schema"; + next; + } + } + + $guard->commit; + return $ret; } - return $ret; + + $self->next::method(@rest); } sub update { @@ -32,22 +47,31 @@ sub update { return $self->next::method(@rest) unless ref $self; # Because update cascades on a class *really* don't make sense! - my $ret = $self->next::method(@rest); - my $source = $self->result_source; my %rels = map { $_ => $source->relationship_info($_) } $source->relationships; my @cascade = grep { $rels{$_}{attrs}{cascade_update} } keys %rels; - foreach my $rel (@cascade) { - next if ( - $rels{$rel}{attrs}{accessor} - && - $rels{$rel}{attrs}{accessor} eq 'single' - && - !exists($self->{_relationship_data}{$rel}) - ); - $_->update for grep defined, $self->$rel; + + if (@cascade) { + my $guard = $source->schema->txn_scope_guard; + + my $ret = $self->next::method(@rest); + + foreach my $rel (@cascade) { + next if ( + $rels{$rel}{attrs}{accessor} + && + $rels{$rel}{attrs}{accessor} eq 'single' + && + !exists($self->{_relationship_data}{$rel}) + ); + $_->update for grep defined, $self->$rel; + } + + $guard->commit; + return $ret; } - return $ret; + + $self->next::method(@rest); } 1;