File Coverage

blib/lib/DBIx/Class/Relationship/CascadeActions.pm
Criterion Covered Total %
statement 47 47 100.0
branch 10 12 83.3
condition 3 6 50.0
subroutine 6 6 100.0
pod 0 2 0.0
total 66 73 90.4


line stmt bran cond sub pod time code
1             package # hide from PAUSE
2             DBIx::Class::Relationship::CascadeActions;
3              
4 379     379   163816 use strict;
  379         742  
  379         10401  
5 379     379   1524 use warnings;
  379         728  
  379         8781  
6 379     379   1527 use DBIx::Class::Carp;
  379         658  
  379         2124  
7 379     379   1768 use namespace::clean;
  379         698  
  379         1887  
8              
9             our %_pod_inherit_config =
10             (
11             class_map => { 'DBIx::Class::Relationship::CascadeActions' => 'DBIx::Class::Relationship' }
12             );
13              
14             sub delete {
15 117     117 0 2630 my ($self, @rest) = @_;
16 117 50       422 return $self->next::method(@rest) unless ref $self;
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              
21 117         566 my $source = $self->result_source;
22 117         507 my %rels = map { $_ => $source->relationship_info($_) } $source->relationships;
  860         1362  
23 117         445 my @cascade = grep { $rels{$_}{attrs}{cascade_delete} } keys %rels;
  860         1659  
24              
25 117 100       384 if (@cascade) {
26 80         269 my $guard = $source->schema->txn_scope_guard;
27              
28 80         297 my $ret = $self->next::method(@rest);
29              
30 79         179 foreach my $rel (@cascade) {
31 274 100       382 if( my $rel_rs = eval{ $self->search_related($rel) } ) {
  274         1199  
32 265         876 $rel_rs->delete_all;
33             } else {
34 9         46 carp "Skipping cascade delete on relationship '$rel' - related resultsource '$rels{$rel}{class}' is not registered with this schema";
35 9         687 next;
36             }
37             }
38              
39 79         296 $guard->commit;
40 79         266 return $ret;
41             }
42              
43 37         133 $self->next::method(@rest);
44             }
45              
46             sub update {
47 818     818 0 87583 my ($self, @rest) = @_;
48 818 50       2310 return $self->next::method(@rest) unless ref $self;
49             # Because update cascades on a class *really* don't make sense!
50              
51 818         2344 my $source = $self->result_source;
52 818         3228 my %rels = map { $_ => $source->relationship_info($_) } $source->relationships;
  4222         7747  
53 818         2534 my @cascade = grep { $rels{$_}{attrs}{cascade_update} } keys %rels;
  4222         7487  
54              
55 818 100       2384 if (@cascade) {
56 90         234 my $guard = $source->schema->txn_scope_guard;
57              
58 90         269 my $ret = $self->next::method(@rest);
59              
60 90         198 foreach my $rel (@cascade) {
61             next if (
62             $rels{$rel}{attrs}{accessor}
63             &&
64             $rels{$rel}{attrs}{accessor} eq 'single'
65             &&
66 199 100 33     1459 !exists($self->{_relationship_data}{$rel})
      66        
67             );
68 1         9 $_->update for grep defined, $self->$rel;
69             }
70              
71 90         317 $guard->commit;
72 90         366 return $ret;
73             }
74              
75 728         2539 $self->next::method(@rest);
76             }
77              
78             1;