Self-cleaning is not yet entirely stable - back it out for the time being
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / CascadeActions.pm
CommitLineData
c0e7b4e5 1package # hide from PAUSE
2 DBIx::Class::Relationship::CascadeActions;
4a07648a 3
bf5ecff9 4use strict;
5use warnings;
70c28808 6use DBIx::Class::Carp;
64c50e81 7use namespace::clean;
bf5ecff9 8
8273e845 9our %_pod_inherit_config =
044e70c7 10 (
11 class_map => { 'DBIx::Class::Relationship::CascadeActions' => 'DBIx::Class::Relationship' }
12 );
13
4a07648a 14sub delete {
15 my ($self, @rest) = @_;
147dd158 16 return $self->next::method(@rest) unless ref $self;
4a07648a 17 # I'm just ignoring this for class deletes because hell, the db should
18 # be handling this anyway. Assuming we have joins we probably actually
19 # *could* do them, but I'd rather not.
20
71e65b39 21 my $source = $self->result_source;
22 my %rels = map { $_ => $source->relationship_info($_) } $source->relationships;
4a07648a 23 my @cascade = grep { $rels{$_}{attrs}{cascade_delete} } keys %rels;
fb61e30c 24
25 if (@cascade) {
26 my $guard = $source->schema->txn_scope_guard;
27
28 my $ret = $self->next::method(@rest);
29
30 foreach my $rel (@cascade) {
51c9ead2 31 if( my $rel_rs = eval{ $self->search_related($rel) } ) {
32 $rel_rs->delete_all;
33 } else {
34 carp "Skipping cascade delete on relationship '$rel' - related resultsource '$rels{$rel}{class}' is not registered with this schema";
35 next;
36 }
fb61e30c 37 }
38
39 $guard->commit;
40 return $ret;
4a07648a 41 }
fb61e30c 42
43 $self->next::method(@rest);
4a07648a 44}
45
46sub update {
47 my ($self, @rest) = @_;
147dd158 48 return $self->next::method(@rest) unless ref $self;
4a07648a 49 # Because update cascades on a class *really* don't make sense!
50
71e65b39 51 my $source = $self->result_source;
52 my %rels = map { $_ => $source->relationship_info($_) } $source->relationships;
4a07648a 53 my @cascade = grep { $rels{$_}{attrs}{cascade_update} } keys %rels;
fb61e30c 54
55 if (@cascade) {
56 my $guard = $source->schema->txn_scope_guard;
57
58 my $ret = $self->next::method(@rest);
59
60 foreach my $rel (@cascade) {
61 next if (
62 $rels{$rel}{attrs}{accessor}
63 &&
64 $rels{$rel}{attrs}{accessor} eq 'single'
65 &&
66 !exists($self->{_relationship_data}{$rel})
67 );
68 $_->update for grep defined, $self->$rel;
69 }
70
71 $guard->commit;
72 return $ret;
4a07648a 73 }
fb61e30c 74
75 $self->next::method(@rest);
4a07648a 76}
77
781;