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   176649 use strict;
  379         1183  
  379         11470  
5 379     379   2141 use warnings;
  379         1102  
  379         9575  
6 379     379   2178 use DBIx::Class::Carp;
  379         1156  
  379         2448  
7 379     379   2627 use namespace::clean;
  379         1243  
  379         2393  
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 2265 my ($self, @rest) = @_;
16 117 50       378 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         567 my $source = $self->result_source;
22 117         513 my %rels = map { $_ => $source->relationship_info($_) } $source->relationships;
  860         1714  
23 117         490 my @cascade = grep { $rels{$_}{attrs}{cascade_delete} } keys %rels;
  860         2170  
24              
25 117 100       389 if (@cascade) {
26 80         276 my $guard = $source->schema->txn_scope_guard;
27              
28 80         315 my $ret = $self->next::method(@rest);
29              
30 79         233 foreach my $rel (@cascade) {
31 274 100       582 if( my $rel_rs = eval{ $self->search_related($rel) } ) {
  274         1204  
32 265         992 $rel_rs->delete_all;
33             } else {
34 9         59 carp "Skipping cascade delete on relationship '$rel' - related resultsource '$rels{$rel}{class}' is not registered with this schema";
35 9         946 next;
36             }
37             }
38              
39 79         336 $guard->commit;
40 79         291 return $ret;
41             }
42              
43 37         152 $self->next::method(@rest);
44             }
45              
46             sub update {
47 836     836 0 82138 my ($self, @rest) = @_;
48 836 50       2660 return $self->next::method(@rest) unless ref $self;
49             # Because update cascades on a class *really* don't make sense!
50              
51 836         2432 my $source = $self->result_source;
52 836         3560 my %rels = map { $_ => $source->relationship_info($_) } $source->relationships;
  4438         9424  
53 836         3013 my @cascade = grep { $rels{$_}{attrs}{cascade_update} } keys %rels;
  4438         9696  
54              
55 836 100       2636 if (@cascade) {
56 108         336 my $guard = $source->schema->txn_scope_guard;
57              
58 108         483 my $ret = $self->next::method(@rest);
59              
60 108         303 foreach my $rel (@cascade) {
61             next if (
62             $rels{$rel}{attrs}{accessor}
63             &&
64             $rels{$rel}{attrs}{accessor} eq 'single'
65             &&
66 244 100 33     2022 !exists($self->{_relationship_data}{$rel})
      66        
67             );
68 1         10 $_->update for grep defined, $self->$rel;
69             }
70              
71 108         477 $guard->commit;
72 108         490 return $ret;
73             }
74              
75 728         2372 $self->next::method(@rest);
76             }
77              
78             1;