line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package # hide from PAUSE |
2
|
|
|
|
|
|
|
DBIx::Class::Relationship::ManyToMany; |
3
|
|
|
|
|
|
|
|
4
|
379
|
|
|
379
|
|
169778
|
use strict; |
|
379
|
|
|
|
|
767
|
|
|
379
|
|
|
|
|
10350
|
|
5
|
379
|
|
|
379
|
|
1480
|
use warnings; |
|
379
|
|
|
|
|
650
|
|
|
379
|
|
|
|
|
9085
|
|
6
|
|
|
|
|
|
|
|
7
|
379
|
|
|
379
|
|
1512
|
use DBIx::Class::Carp; |
|
379
|
|
|
|
|
607
|
|
|
379
|
|
|
|
|
2459
|
|
8
|
379
|
|
|
379
|
|
1773
|
use Sub::Name 'subname'; |
|
379
|
|
|
|
|
885
|
|
|
379
|
|
|
|
|
20621
|
|
9
|
379
|
|
|
379
|
|
1776
|
use Scalar::Util 'blessed'; |
|
379
|
|
|
|
|
701
|
|
|
379
|
|
|
|
|
17490
|
|
10
|
379
|
|
|
379
|
|
1774
|
use DBIx::Class::_Util 'fail_on_internal_wantarray'; |
|
379
|
|
|
|
|
786
|
|
|
379
|
|
|
|
|
15611
|
|
11
|
379
|
|
|
379
|
|
1713
|
use namespace::clean; |
|
379
|
|
|
|
|
715
|
|
|
379
|
|
|
|
|
2021
|
|
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
our %_pod_inherit_config = |
14
|
|
|
|
|
|
|
( |
15
|
|
|
|
|
|
|
class_map => { 'DBIx::Class::Relationship::ManyToMany' => 'DBIx::Class::Relationship' } |
16
|
|
|
|
|
|
|
); |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
sub many_to_many { |
19
|
4602
|
|
|
4602
|
0
|
37590
|
my ($class, $meth, $rel, $f_rel, $rel_attrs) = @_; |
20
|
|
|
|
|
|
|
|
21
|
4602
|
50
|
|
|
|
37623
|
$class->throw_exception( |
22
|
|
|
|
|
|
|
"missing relation in many-to-many" |
23
|
|
|
|
|
|
|
) unless $rel; |
24
|
|
|
|
|
|
|
|
25
|
4602
|
50
|
|
|
|
8608
|
$class->throw_exception( |
26
|
|
|
|
|
|
|
"missing foreign relation in many-to-many" |
27
|
|
|
|
|
|
|
) unless $f_rel; |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
{ |
30
|
379
|
|
|
379
|
|
106385
|
no strict 'refs'; |
|
379
|
|
|
|
|
726
|
|
|
379
|
|
|
|
|
12664
|
|
|
4602
|
|
|
|
|
5427
|
|
31
|
379
|
|
|
379
|
|
1636
|
no warnings 'redefine'; |
|
379
|
|
|
|
|
770
|
|
|
379
|
|
|
|
|
351119
|
|
32
|
|
|
|
|
|
|
|
33
|
4602
|
|
|
|
|
9923
|
my $add_meth = "add_to_${meth}"; |
34
|
4602
|
|
|
|
|
7885
|
my $remove_meth = "remove_from_${meth}"; |
35
|
4602
|
|
|
|
|
7231
|
my $set_meth = "set_${meth}"; |
36
|
4602
|
|
|
|
|
7501
|
my $rs_meth = "${meth}_rs"; |
37
|
|
|
|
|
|
|
|
38
|
4602
|
|
|
|
|
8291
|
for ($add_meth, $remove_meth, $set_meth, $rs_meth) { |
39
|
18408
|
100
|
|
|
|
180139
|
if ( $class->can ($_) ) { |
40
|
2
|
100
|
|
|
|
16
|
carp (<<"EOW") unless $ENV{DBIC_OVERWRITE_HELPER_METHODS_OK}; |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
*************************************************************************** |
43
|
|
|
|
|
|
|
The many-to-many relationship '$meth' is trying to create a utility method |
44
|
|
|
|
|
|
|
called $_. |
45
|
|
|
|
|
|
|
This will completely overwrite one such already existing method on class |
46
|
|
|
|
|
|
|
$class. |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
You almost certainly want to rename your method or the many-to-many |
49
|
|
|
|
|
|
|
relationship, as the functionality of the original method will not be |
50
|
|
|
|
|
|
|
accessible anymore. |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
To disable this warning set to a true value the environment variable |
53
|
|
|
|
|
|
|
DBIC_OVERWRITE_HELPER_METHODS_OK |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
*************************************************************************** |
56
|
|
|
|
|
|
|
EOW |
57
|
|
|
|
|
|
|
} |
58
|
|
|
|
|
|
|
} |
59
|
|
|
|
|
|
|
|
60
|
4602
|
|
33
|
|
|
23858
|
$rel_attrs->{alias} ||= $f_rel; |
61
|
|
|
|
|
|
|
|
62
|
4602
|
|
|
|
|
9733
|
my $rs_meth_name = join '::', $class, $rs_meth; |
63
|
|
|
|
|
|
|
*$rs_meth_name = subname $rs_meth_name, sub { |
64
|
40
|
|
|
40
|
|
65
|
my $self = shift; |
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
|
45
|
|
|
|
65
|
40
|
100
|
66
|
|
|
211
|
my $attrs = @_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {}; |
66
|
|
|
|
|
|
|
my $rs = $self->search_related($rel)->search_related( |
67
|
40
|
100
|
|
|
|
263
|
$f_rel, @_ > 0 ? @_ : undef, { %{$rel_attrs||{}}, %$attrs } |
|
40
|
50
|
|
|
|
349
|
|
68
|
|
|
|
|
|
|
); |
69
|
40
|
|
|
|
|
155
|
return $rs; |
70
|
4602
|
|
|
|
|
42978
|
}; |
71
|
|
|
|
|
|
|
|
72
|
4602
|
|
|
|
|
9781
|
my $meth_name = join '::', $class, $meth; |
73
|
|
|
|
|
|
|
*$meth_name = subname $meth_name, sub { |
74
|
40
|
|
|
40
|
|
272
|
DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_WANTARRAY and my $sog = fail_on_internal_wantarray; |
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
75
|
40
|
|
|
|
|
77
|
my $self = shift; |
76
|
40
|
|
|
|
|
219
|
my $rs = $self->$rs_meth( @_ ); |
77
|
40
|
100
|
|
|
|
224
|
return (wantarray ? $rs->all : $rs); |
78
|
4602
|
|
|
|
|
37972
|
}; |
79
|
|
|
|
|
|
|
|
80
|
4602
|
|
|
|
|
10078
|
my $add_meth_name = join '::', $class, $add_meth; |
81
|
|
|
|
|
|
|
*$add_meth_name = subname $add_meth_name, sub { |
82
|
28
|
|
|
68
|
|
568
|
my $self = shift; |
83
|
28
|
100
|
|
|
|
90
|
@_ > 0 or $self->throw_exception( |
84
|
|
|
|
|
|
|
"${add_meth} needs an object or hashref" |
85
|
|
|
|
|
|
|
); |
86
|
27
|
|
|
|
|
134
|
my $source = $self->result_source; |
87
|
27
|
|
|
|
|
81
|
my $schema = $source->schema; |
88
|
27
|
|
|
|
|
82
|
my $rel_source_name = $source->relationship_info($rel)->{source}; |
89
|
27
|
|
|
|
|
88
|
my $rel_source = $schema->resultset($rel_source_name)->result_source; |
90
|
27
|
|
|
|
|
79
|
my $f_rel_source_name = $rel_source->relationship_info($f_rel)->{source}; |
91
|
27
|
|
50
|
|
|
79
|
my $f_rel_rs = $schema->resultset($f_rel_source_name)->search({}, $rel_attrs||{}); |
92
|
|
|
|
|
|
|
|
93
|
27
|
|
|
|
|
103
|
my $obj; |
94
|
27
|
50
|
|
|
|
69
|
if (ref $_[0]) { |
95
|
27
|
100
|
|
|
|
75
|
if (ref $_[0] eq 'HASH') { |
96
|
6
|
|
|
|
|
44
|
$obj = $f_rel_rs->find_or_create($_[0]); |
97
|
|
|
|
|
|
|
} else { |
98
|
21
|
|
|
|
|
26
|
$obj = $_[0]; |
99
|
|
|
|
|
|
|
} |
100
|
|
|
|
|
|
|
} else { |
101
|
0
|
|
|
|
|
0
|
$obj = $f_rel_rs->find_or_create({@_}); |
102
|
|
|
|
|
|
|
} |
103
|
|
|
|
|
|
|
|
104
|
27
|
100
|
100
|
|
|
149
|
my $link_vals = @_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {}; |
105
|
27
|
|
|
|
|
131
|
my $link = $self->search_related($rel)->new_result($link_vals); |
106
|
27
|
|
|
|
|
91
|
$link->set_from_related($f_rel, $obj); |
107
|
27
|
|
|
|
|
125
|
$link->insert(); |
108
|
27
|
|
|
|
|
135
|
return $obj; |
109
|
4602
|
|
|
|
|
43535
|
}; |
110
|
|
|
|
|
|
|
|
111
|
4602
|
|
|
|
|
10667
|
my $set_meth_name = join '::', $class, $set_meth; |
112
|
|
|
|
|
|
|
*$set_meth_name = subname $set_meth_name, sub { |
113
|
6
|
|
|
74
|
|
19
|
my $self = shift; |
114
|
6
|
50
|
|
|
|
19
|
@_ > 0 or $self->throw_exception( |
115
|
|
|
|
|
|
|
"{$set_meth} needs a list of objects or hashrefs" |
116
|
|
|
|
|
|
|
); |
117
|
6
|
100
|
|
|
|
27
|
my @to_set = (ref($_[0]) eq 'ARRAY' ? @{ $_[0] } : @_); |
|
4
|
|
|
|
|
9
|
|
118
|
|
|
|
|
|
|
# if there is a where clause in the attributes, ensure we only delete |
119
|
|
|
|
|
|
|
# rows that are within the where restriction |
120
|
6
|
100
|
33
|
|
|
31
|
if ($rel_attrs && $rel_attrs->{where}) { |
121
|
1
|
|
|
|
|
5
|
$self->search_related( $rel, $rel_attrs->{where},{join => $f_rel})->delete; |
122
|
|
|
|
|
|
|
} else { |
123
|
5
|
|
|
|
|
23
|
$self->search_related( $rel, {} )->delete; |
124
|
|
|
|
|
|
|
} |
125
|
|
|
|
|
|
|
# add in the set rel objects |
126
|
6
|
100
|
|
|
|
23
|
$self->$add_meth($_, ref($_[1]) ? $_[1] : {}) for (@to_set); |
127
|
4602
|
|
|
|
|
34197
|
}; |
128
|
|
|
|
|
|
|
|
129
|
4602
|
|
|
|
|
10407
|
my $remove_meth_name = join '::', $class, $remove_meth; |
130
|
|
|
|
|
|
|
*$remove_meth_name = subname $remove_meth_name, sub { |
131
|
5
|
|
|
79
|
|
497
|
my ($self, $obj) = @_; |
132
|
5
|
100
|
|
|
|
60
|
$self->throw_exception("${remove_meth} needs an object") |
133
|
|
|
|
|
|
|
unless blessed ($obj); |
134
|
4
|
|
|
|
|
18
|
my $rel_source = $self->search_related($rel)->result_source; |
135
|
4
|
|
|
|
|
9
|
my $cond = $rel_source->relationship_info($f_rel)->{cond}; |
136
|
4
|
|
|
|
|
18
|
my ($link_cond, $crosstable) = $rel_source->_resolve_condition( |
137
|
|
|
|
|
|
|
$cond, $obj, $f_rel, $f_rel |
138
|
|
|
|
|
|
|
); |
139
|
|
|
|
|
|
|
|
140
|
4
|
50
|
|
|
|
14
|
$self->throw_exception( |
141
|
|
|
|
|
|
|
"Relationship '$rel' does not resolve to a join-free condition, " |
142
|
|
|
|
|
|
|
."unable to use with the ManyToMany helper '$f_rel'" |
143
|
|
|
|
|
|
|
) if $crosstable; |
144
|
|
|
|
|
|
|
|
145
|
4
|
|
|
|
|
16
|
$self->search_related($rel, $link_cond)->delete; |
146
|
4602
|
|
|
|
|
43168
|
}; |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
} |
149
|
|
|
|
|
|
|
} |
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
1; |