File Coverage

blib/lib/DBIx/Class/Relationship/CascadeActions.pm
Criterion Covered Total %
statement 50 50 100.0
branch 10 12 83.3
condition 3 6 50.0
subroutine 8 8 100.0
pod 0 2 0.0
total 71 78 91.0


line stmt bran cond sub pod time code
1             package # hide from PAUSE
2             DBIx::Class::Relationship::CascadeActions;
3              
4 312     312   103192 use strict;
  312         2917  
  312         9421  
5 312     312   1770 use warnings;
  312         2316  
  312         8262  
6 312     312   1740 use DBIx::Class::Carp;
  312         686  
  312         1741  
7 312     312   1974 use DBIx::Class::_Util 'dbic_internal_try';
  312         756  
  312         14955  
8 312     312   1883 use namespace::clean;
  312         731  
  312         1850  
9              
10             our %_pod_inherit_config =
11             (
12             class_map => { 'DBIx::Class::Relationship::CascadeActions' => 'DBIx::Class::Relationship' }
13             );
14              
15             sub delete {
16 116     116 0 2140 my ($self, @rest) = @_;
17 116 50       395 return $self->next::method(@rest) unless ref $self;
18             # I'm just ignoring this for class deletes because hell, the db should
19             # be handling this anyway. Assuming we have joins we probably actually
20             # *could* do them, but I'd rather not.
21              
22 116         594 my $source = $self->result_source;
23 116         4220 my %rels = map { $_ => $source->relationship_info($_) } $source->relationships;
  860         12834  
24 116         537 my @cascade = grep { $rels{$_}{attrs}{cascade_delete} } keys %rels;
  860         2224  
25              
26 116 100       430 if (@cascade) {
27 80         293 my $guard = $source->schema->txn_scope_guard;
28              
29 80         297 my $ret = $self->next::method(@rest);
30              
31 79         256 foreach my $rel (@cascade) {
32 274 100   274   1505 if( my $rel_rs = dbic_internal_try { $self->related_resultset($rel) } ) {
  274         1275  
33 265         1038 $rel_rs->delete_all;
34             } else {
35 9         81 carp "Skipping cascade delete on relationship '$rel' - related resultsource '$rels{$rel}{class}' is not registered with this schema";
36 9         1168 next;
37             }
38             }
39              
40 79         325 $guard->commit;
41 79         278 return $ret;
42             }
43              
44 36         140 $self->next::method(@rest);
45             }
46              
47             sub update {
48 822     822 0 81564 my ($self, @rest) = @_;
49 822 50       3364 return $self->next::method(@rest) unless ref $self;
50             # Because update cascades on a class *really* don't make sense!
51              
52 822         3609 my $source = $self->result_source;
53 822         28314 my %rels = map { $_ => $source->relationship_info($_) } $source->relationships;
  4264         68790  
54 822         3887 my @cascade = grep { $rels{$_}{attrs}{cascade_update} } keys %rels;
  4264         12267  
55              
56 822 100       3300 if (@cascade) {
57 96         323 my $guard = $source->schema->txn_scope_guard;
58              
59 96         337 my $ret = $self->next::method(@rest);
60              
61 96         278 foreach my $rel (@cascade) {
62             next if (
63             $rels{$rel}{attrs}{accessor}
64             &&
65             $rels{$rel}{attrs}{accessor} eq 'single'
66             &&
67 211 100 33     1360 !exists($self->{_relationship_data}{$rel})
      66        
68             );
69 1         28 $_->update for grep defined, $self->$rel;
70             }
71              
72 96         436 $guard->commit;
73 96         554 return $ret;
74             }
75              
76 726         4459 $self->next::method(@rest);
77             }
78              
79             1;