line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package DBIx::Class::Schema; |
2
|
|
|
|
|
|
|
|
3
|
326
|
|
|
326
|
|
14699255
|
use strict; |
|
326
|
|
|
|
|
836
|
|
|
326
|
|
|
|
|
10701
|
|
4
|
326
|
|
|
326
|
|
1706
|
use warnings; |
|
326
|
|
|
|
|
704
|
|
|
326
|
|
|
|
|
11775
|
|
5
|
|
|
|
|
|
|
|
6
|
326
|
|
|
326
|
|
1848
|
use base 'DBIx::Class'; |
|
326
|
|
|
|
|
725
|
|
|
326
|
|
|
|
|
139520
|
|
7
|
|
|
|
|
|
|
|
8
|
326
|
|
|
326
|
|
1871
|
use DBIx::Class::Carp; |
|
326
|
|
|
|
|
626
|
|
|
326
|
|
|
|
|
2502
|
|
9
|
326
|
|
|
326
|
|
1572
|
use Try::Tiny; |
|
326
|
|
|
|
|
617
|
|
|
326
|
|
|
|
|
19948
|
|
10
|
326
|
|
|
326
|
|
1521
|
use Scalar::Util qw/weaken blessed/; |
|
326
|
|
|
|
|
597
|
|
|
326
|
|
|
|
|
16705
|
|
11
|
326
|
|
|
326
|
|
1477
|
use DBIx::Class::_Util qw(refcount quote_sub is_exception scope_guard); |
|
326
|
|
|
|
|
655
|
|
|
326
|
|
|
|
|
26207
|
|
12
|
326
|
|
|
326
|
|
153461
|
use Devel::GlobalDestruction; |
|
326
|
|
|
|
|
139831
|
|
|
326
|
|
|
|
|
2667
|
|
13
|
326
|
|
|
326
|
|
20785
|
use namespace::clean; |
|
326
|
|
|
|
|
620
|
|
|
326
|
|
|
|
|
1773
|
|
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
__PACKAGE__->mk_classdata('class_mappings' => {}); |
16
|
|
|
|
|
|
|
__PACKAGE__->mk_classdata('source_registrations' => {}); |
17
|
|
|
|
|
|
|
__PACKAGE__->mk_classdata('storage_type' => '::DBI'); |
18
|
|
|
|
|
|
|
__PACKAGE__->mk_classdata('storage'); |
19
|
|
|
|
|
|
|
__PACKAGE__->mk_classdata('exception_action'); |
20
|
|
|
|
|
|
|
__PACKAGE__->mk_classdata('stacktrace' => $ENV{DBIC_TRACE} || 0); |
21
|
|
|
|
|
|
|
__PACKAGE__->mk_classdata('default_resultset_attributes' => {}); |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
=head1 NAME |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
DBIx::Class::Schema - composable schemas |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
=head1 SYNOPSIS |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
package Library::Schema; |
30
|
|
|
|
|
|
|
use base qw/DBIx::Class::Schema/; |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
# load all Result classes in Library/Schema/Result/ |
33
|
|
|
|
|
|
|
__PACKAGE__->load_namespaces(); |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
package Library::Schema::Result::CD; |
36
|
|
|
|
|
|
|
use base qw/DBIx::Class::Core/; |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
__PACKAGE__->load_components(qw/InflateColumn::DateTime/); # for example |
39
|
|
|
|
|
|
|
__PACKAGE__->table('cd'); |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
# Elsewhere in your code: |
42
|
|
|
|
|
|
|
my $schema1 = Library::Schema->connect( |
43
|
|
|
|
|
|
|
$dsn, |
44
|
|
|
|
|
|
|
$user, |
45
|
|
|
|
|
|
|
$password, |
46
|
|
|
|
|
|
|
{ AutoCommit => 1 }, |
47
|
|
|
|
|
|
|
); |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
my $schema2 = Library::Schema->connect($coderef_returning_dbh); |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
# fetch objects using Library::Schema::Result::DVD |
52
|
|
|
|
|
|
|
my $resultset = $schema1->resultset('DVD')->search( ... ); |
53
|
|
|
|
|
|
|
my @dvd_objects = $schema2->resultset('DVD')->search( ... ); |
54
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
=head1 DESCRIPTION |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
Creates database classes based on a schema. This is the recommended way to |
58
|
|
|
|
|
|
|
use L and allows you to use more than one concurrent connection |
59
|
|
|
|
|
|
|
with your classes. |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
NB: If you're used to L it's worth reading the L |
62
|
|
|
|
|
|
|
carefully, as DBIx::Class does things a little differently. Note in |
63
|
|
|
|
|
|
|
particular which module inherits off which. |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
=head1 SETUP METHODS |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
=head2 load_namespaces |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=over 4 |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
=item Arguments: %options? |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=back |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
package MyApp::Schema; |
76
|
|
|
|
|
|
|
__PACKAGE__->load_namespaces(); |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
__PACKAGE__->load_namespaces( |
79
|
|
|
|
|
|
|
result_namespace => 'Res', |
80
|
|
|
|
|
|
|
resultset_namespace => 'RSet', |
81
|
|
|
|
|
|
|
default_resultset_class => '+MyApp::Othernamespace::RSet', |
82
|
|
|
|
|
|
|
); |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
With no arguments, this method uses L to load all of the |
85
|
|
|
|
|
|
|
Result and ResultSet classes under the namespace of the schema from |
86
|
|
|
|
|
|
|
which it is called. For example, C will by default find |
87
|
|
|
|
|
|
|
and load Result classes named C and ResultSet |
88
|
|
|
|
|
|
|
classes named C. |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
ResultSet classes are associated with Result class of the same name. |
91
|
|
|
|
|
|
|
For example, C will get the ResultSet class |
92
|
|
|
|
|
|
|
C if it is present. |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
Both Result and ResultSet namespaces are configurable via the |
95
|
|
|
|
|
|
|
C and C options. |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
Another option, C specifies a custom default |
98
|
|
|
|
|
|
|
ResultSet class for Result classes with no corresponding ResultSet. |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
All of the namespace and classname options are by default relative to |
101
|
|
|
|
|
|
|
the schema classname. To specify a fully-qualified name, prefix it |
102
|
|
|
|
|
|
|
with a literal C<+>. For example, C<+Other::NameSpace::Result>. |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
=head3 Warnings |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
You will be warned if ResultSet classes are discovered for which there |
107
|
|
|
|
|
|
|
are no matching Result classes like this: |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
load_namespaces found ResultSet class $classname with no corresponding Result class |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
If a ResultSource instance is found to already have a ResultSet class set |
112
|
|
|
|
|
|
|
using L to some |
113
|
|
|
|
|
|
|
other class, you will be warned like this: |
114
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
We found ResultSet class '$rs_class' for '$result_class', but it seems |
116
|
|
|
|
|
|
|
that you had already set '$result_class' to use '$rs_set' instead |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
=head3 Examples |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
# load My::Schema::Result::CD, My::Schema::Result::Artist, |
121
|
|
|
|
|
|
|
# My::Schema::ResultSet::CD, etc... |
122
|
|
|
|
|
|
|
My::Schema->load_namespaces; |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
# Override everything to use ugly names. |
125
|
|
|
|
|
|
|
# In this example, if there is a My::Schema::Res::Foo, but no matching |
126
|
|
|
|
|
|
|
# My::Schema::RSets::Foo, then Foo will have its |
127
|
|
|
|
|
|
|
# resultset_class set to My::Schema::RSetBase |
128
|
|
|
|
|
|
|
My::Schema->load_namespaces( |
129
|
|
|
|
|
|
|
result_namespace => 'Res', |
130
|
|
|
|
|
|
|
resultset_namespace => 'RSets', |
131
|
|
|
|
|
|
|
default_resultset_class => 'RSetBase', |
132
|
|
|
|
|
|
|
); |
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
# Put things in other namespaces |
135
|
|
|
|
|
|
|
My::Schema->load_namespaces( |
136
|
|
|
|
|
|
|
result_namespace => '+Some::Place::Results', |
137
|
|
|
|
|
|
|
resultset_namespace => '+Another::Place::RSets', |
138
|
|
|
|
|
|
|
); |
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
To search multiple namespaces for either Result or ResultSet classes, |
141
|
|
|
|
|
|
|
use an arrayref of namespaces for that option. In the case that the |
142
|
|
|
|
|
|
|
same result (or resultset) class exists in multiple namespaces, later |
143
|
|
|
|
|
|
|
entries in the list of namespaces will override earlier ones. |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
My::Schema->load_namespaces( |
146
|
|
|
|
|
|
|
# My::Schema::Results_C::Foo takes precedence over My::Schema::Results_B::Foo : |
147
|
|
|
|
|
|
|
result_namespace => [ 'Results_A', 'Results_B', 'Results_C' ], |
148
|
|
|
|
|
|
|
resultset_namespace => [ '+Some::Place::RSets', 'RSets' ], |
149
|
|
|
|
|
|
|
); |
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
=cut |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
# Pre-pends our classname to the given relative classname or |
154
|
|
|
|
|
|
|
# class namespace, unless there is a '+' prefix, which will |
155
|
|
|
|
|
|
|
# be stripped. |
156
|
|
|
|
|
|
|
sub _expand_relative_name { |
157
|
20
|
|
|
20
|
|
33
|
my ($class, $name) = @_; |
158
|
20
|
100
|
|
|
|
91
|
$name =~ s/^\+// or $name = "${class}::${name}"; |
159
|
20
|
|
|
|
|
46
|
return $name; |
160
|
|
|
|
|
|
|
} |
161
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
# Finds all modules in the supplied namespace, or if omitted in the |
163
|
|
|
|
|
|
|
# namespace of $class. Untaints all findings as they can be assumed |
164
|
|
|
|
|
|
|
# to be safe |
165
|
|
|
|
|
|
|
sub _findallmod { |
166
|
16
|
|
|
16
|
|
4012
|
require Module::Find; |
167
|
|
|
|
|
|
|
return map |
168
|
16
|
|
33
|
|
|
8495
|
{ $_ =~ /(.+)/ } # untaint result |
|
86
|
|
|
|
|
16549
|
|
169
|
|
|
|
|
|
|
Module::Find::findallmod( $_[1] || ref $_[0] || $_[0] ) |
170
|
|
|
|
|
|
|
; |
171
|
|
|
|
|
|
|
} |
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
# returns a hash of $shortname => $fullname for every package |
174
|
|
|
|
|
|
|
# found in the given namespaces ($shortname is with the $fullname's |
175
|
|
|
|
|
|
|
# namespace stripped off) |
176
|
|
|
|
|
|
|
sub _map_namespaces { |
177
|
16
|
|
|
16
|
|
32
|
my ($me, $namespaces) = @_; |
178
|
|
|
|
|
|
|
|
179
|
16
|
|
|
|
|
26
|
my %res; |
180
|
16
|
|
|
|
|
35
|
for my $ns (@$namespaces) { |
181
|
|
|
|
|
|
|
$res{ substr($_, length "${ns}::") } = $_ |
182
|
17
|
|
|
|
|
62
|
for $me->_findallmod($ns); |
183
|
|
|
|
|
|
|
} |
184
|
|
|
|
|
|
|
|
185
|
16
|
|
|
|
|
336
|
\%res; |
186
|
|
|
|
|
|
|
} |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
# returns the result_source_instance for the passed class/object, |
189
|
|
|
|
|
|
|
# or dies with an informative message (used by load_namespaces) |
190
|
|
|
|
|
|
|
sub _ns_get_rsrc_instance { |
191
|
240
|
|
|
240
|
|
269
|
my $me = shift; |
192
|
240
|
|
33
|
|
|
572
|
my $rs_class = ref ($_[0]) || $_[0]; |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
return try { |
195
|
240
|
|
|
240
|
|
14718
|
$rs_class->result_source_instance |
196
|
|
|
|
|
|
|
} catch { |
197
|
1
|
|
|
1
|
|
25
|
$me->throw_exception ( |
198
|
|
|
|
|
|
|
"Attempt to load_namespaces() class $rs_class failed - are you sure this is a real Result Class?: $_" |
199
|
|
|
|
|
|
|
); |
200
|
240
|
|
|
|
|
1534
|
}; |
201
|
|
|
|
|
|
|
} |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
sub load_namespaces { |
204
|
8
|
|
|
8
|
1
|
3563
|
my ($class, %args) = @_; |
205
|
|
|
|
|
|
|
|
206
|
8
|
|
100
|
|
|
57
|
my $result_namespace = delete $args{result_namespace} || 'Result'; |
207
|
8
|
|
100
|
|
|
43
|
my $resultset_namespace = delete $args{resultset_namespace} || 'ResultSet'; |
208
|
|
|
|
|
|
|
|
209
|
8
|
|
|
|
|
21
|
my $default_resultset_class = delete $args{default_resultset_class}; |
210
|
|
|
|
|
|
|
|
211
|
8
|
100
|
|
|
|
43
|
$default_resultset_class = $class->_expand_relative_name($default_resultset_class) |
212
|
|
|
|
|
|
|
if $default_resultset_class; |
213
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
$class->throw_exception('load_namespaces: unknown option(s): ' |
215
|
8
|
50
|
|
|
|
38
|
. join(q{,}, map { qq{'$_'} } keys %args)) |
|
0
|
|
|
|
|
0
|
|
216
|
|
|
|
|
|
|
if scalar keys %args; |
217
|
|
|
|
|
|
|
|
218
|
8
|
|
|
|
|
24
|
for my $arg ($result_namespace, $resultset_namespace) { |
219
|
16
|
100
|
66
|
|
|
98
|
$arg = [ $arg ] if ( $arg and ! ref $arg ); |
220
|
|
|
|
|
|
|
|
221
|
16
|
50
|
|
|
|
51
|
$class->throw_exception('load_namespaces: namespace arguments must be ' |
222
|
|
|
|
|
|
|
. 'a simple string or an arrayref') |
223
|
|
|
|
|
|
|
if ref($arg) ne 'ARRAY'; |
224
|
|
|
|
|
|
|
|
225
|
16
|
|
|
|
|
79
|
$_ = $class->_expand_relative_name($_) for (@$arg); |
226
|
|
|
|
|
|
|
} |
227
|
|
|
|
|
|
|
|
228
|
8
|
|
|
|
|
59
|
my $results_by_source_name = $class->_map_namespaces($result_namespace); |
229
|
8
|
|
|
|
|
46
|
my $resultsets_by_source_name = $class->_map_namespaces($resultset_namespace); |
230
|
|
|
|
|
|
|
|
231
|
8
|
|
|
|
|
16
|
my @to_register; |
232
|
|
|
|
|
|
|
{ |
233
|
326
|
|
|
326
|
|
281007
|
no warnings qw/redefine/; |
|
326
|
|
|
|
|
681
|
|
|
326
|
|
|
|
|
20323
|
|
|
8
|
|
|
|
|
11
|
|
234
|
8
|
|
|
0
|
|
12
|
local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO; |
235
|
326
|
|
|
326
|
|
1488
|
use warnings qw/redefine/; |
|
326
|
|
|
|
|
784
|
|
|
326
|
|
|
|
|
222867
|
|
236
|
|
|
|
|
|
|
|
237
|
|
|
|
|
|
|
# ensure classes are loaded and attached in inheritance order |
238
|
8
|
|
|
|
|
36
|
for my $result_class (values %$results_by_source_name) { |
239
|
118
|
|
|
|
|
6765
|
$class->ensure_class_loaded($result_class); |
240
|
|
|
|
|
|
|
} |
241
|
8
|
|
|
|
|
2658
|
my %inh_idx; |
242
|
|
|
|
|
|
|
my @source_names_by_subclass_last = sort { |
243
|
|
|
|
|
|
|
|
244
|
8
|
|
|
|
|
73
|
($inh_idx{$a} ||= |
245
|
57
|
|
|
|
|
311
|
scalar @{mro::get_linear_isa( $results_by_source_name->{$a} )} |
246
|
|
|
|
|
|
|
) |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
<=> |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
($inh_idx{$b} ||= |
251
|
114
|
|
100
|
|
|
303
|
scalar @{mro::get_linear_isa( $results_by_source_name->{$b} )} |
|
61
|
|
100
|
|
|
287
|
|
252
|
|
|
|
|
|
|
) |
253
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
} keys(%$results_by_source_name); |
255
|
|
|
|
|
|
|
|
256
|
8
|
|
|
|
|
32
|
foreach my $source_name (@source_names_by_subclass_last) { |
257
|
116
|
|
|
|
|
196
|
my $result_class = $results_by_source_name->{$source_name}; |
258
|
|
|
|
|
|
|
|
259
|
116
|
|
|
|
|
299
|
my $preset_resultset_class = $class->_ns_get_rsrc_instance ($result_class)->resultset_class; |
260
|
115
|
|
|
|
|
696
|
my $found_resultset_class = delete $resultsets_by_source_name->{$source_name}; |
261
|
|
|
|
|
|
|
|
262
|
115
|
100
|
66
|
|
|
794
|
if($preset_resultset_class && $preset_resultset_class ne 'DBIx::Class::ResultSet') { |
|
|
100
|
100
|
|
|
|
|
263
|
2
|
50
|
33
|
|
|
10
|
if($found_resultset_class && $found_resultset_class ne $preset_resultset_class) { |
264
|
0
|
|
|
|
|
0
|
carp "We found ResultSet class '$found_resultset_class' matching '$results_by_source_name->{$source_name}', but it seems " |
265
|
|
|
|
|
|
|
. "that you had already set the '$results_by_source_name->{$source_name}' resultet to '$preset_resultset_class' instead"; |
266
|
|
|
|
|
|
|
} |
267
|
|
|
|
|
|
|
} |
268
|
|
|
|
|
|
|
# elsif - there may be *no* default_resultset_class, in which case we fallback to |
269
|
|
|
|
|
|
|
# DBIx::Class::Resultset and there is nothing to check |
270
|
|
|
|
|
|
|
elsif($found_resultset_class ||= $default_resultset_class) { |
271
|
9
|
|
|
|
|
38
|
$class->ensure_class_loaded($found_resultset_class); |
272
|
9
|
100
|
|
|
|
4056
|
if(!$found_resultset_class->isa("DBIx::Class::ResultSet")) { |
273
|
2
|
|
|
|
|
20
|
carp "load_namespaces found ResultSet class '$found_resultset_class' that does not subclass DBIx::Class::ResultSet"; |
274
|
|
|
|
|
|
|
} |
275
|
|
|
|
|
|
|
|
276
|
9
|
|
|
|
|
47
|
$class->_ns_get_rsrc_instance ($result_class)->resultset_class($found_resultset_class); |
277
|
|
|
|
|
|
|
} |
278
|
|
|
|
|
|
|
|
279
|
115
|
|
33
|
|
|
384
|
my $source_name = $class->_ns_get_rsrc_instance ($result_class)->source_name || $source_name; |
280
|
|
|
|
|
|
|
|
281
|
115
|
|
|
|
|
5000
|
push(@to_register, [ $source_name, $result_class ]); |
282
|
|
|
|
|
|
|
} |
283
|
|
|
|
|
|
|
} |
284
|
|
|
|
|
|
|
|
285
|
7
|
|
|
|
|
55
|
foreach (sort keys %$resultsets_by_source_name) { |
286
|
4
|
|
|
|
|
32
|
carp "load_namespaces found ResultSet class '$resultsets_by_source_name->{$_}' " |
287
|
|
|
|
|
|
|
.'with no corresponding Result class'; |
288
|
|
|
|
|
|
|
} |
289
|
|
|
|
|
|
|
|
290
|
7
|
|
|
|
|
102
|
Class::C3->reinitialize if DBIx::Class::_ENV_::OLD_MRO; |
291
|
|
|
|
|
|
|
|
292
|
7
|
|
|
|
|
66
|
$class->register_class(@$_) for (@to_register); |
293
|
|
|
|
|
|
|
|
294
|
7
|
|
|
|
|
99
|
return; |
295
|
|
|
|
|
|
|
} |
296
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
=head2 load_classes |
298
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
=over 4 |
300
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
=item Arguments: @classes?, { $namespace => [ @classes ] }+ |
302
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
=back |
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
L is an alternative method to L, both of |
306
|
|
|
|
|
|
|
which serve similar purposes, each with different advantages and disadvantages. |
307
|
|
|
|
|
|
|
In the general case you should use L, unless you need to |
308
|
|
|
|
|
|
|
be able to specify that only specific classes are loaded at runtime. |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
With no arguments, this method uses L to find all classes under |
311
|
|
|
|
|
|
|
the schema's namespace. Otherwise, this method loads the classes you specify |
312
|
|
|
|
|
|
|
(using L |
313
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
It is possible to comment out classes with a leading C<#>, but note that perl |
315
|
|
|
|
|
|
|
will think it's a mistake (trying to use a comment in a qw list), so you'll |
316
|
|
|
|
|
|
|
need to add C before your load_classes call. |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
If any classes found do not appear to be Result class files, you will |
319
|
|
|
|
|
|
|
get the following warning: |
320
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
Failed to load $comp_class. Can't find source_name method. Is |
322
|
|
|
|
|
|
|
$comp_class really a full DBIC result class? Fix it, move it elsewhere, |
323
|
|
|
|
|
|
|
or make your load_classes call more specific. |
324
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
Example: |
326
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
My::Schema->load_classes(); # loads My::Schema::CD, My::Schema::Artist, |
328
|
|
|
|
|
|
|
# etc. (anything under the My::Schema namespace) |
329
|
|
|
|
|
|
|
|
330
|
|
|
|
|
|
|
# loads My::Schema::CD, My::Schema::Artist, Other::Namespace::Producer but |
331
|
|
|
|
|
|
|
# not Other::Namespace::LinerNotes nor My::Schema::Track |
332
|
|
|
|
|
|
|
My::Schema->load_classes(qw/ CD Artist #Track /, { |
333
|
|
|
|
|
|
|
Other::Namespace => [qw/ Producer #LinerNotes /], |
334
|
|
|
|
|
|
|
}); |
335
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
=cut |
337
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
sub load_classes { |
339
|
330
|
|
|
330
|
1
|
2157060
|
my ($class, @params) = @_; |
340
|
|
|
|
|
|
|
|
341
|
330
|
|
|
|
|
706
|
my %comps_for; |
342
|
|
|
|
|
|
|
|
343
|
330
|
100
|
|
|
|
1259
|
if (@params) { |
344
|
329
|
|
|
|
|
802
|
foreach my $param (@params) { |
345
|
12965
|
50
|
|
|
|
19421
|
if (ref $param eq 'ARRAY') { |
|
|
100
|
|
|
|
|
|
346
|
|
|
|
|
|
|
# filter out commented entries |
347
|
0
|
|
|
|
|
0
|
my @modules = grep { $_ !~ /^#/ } @$param; |
|
0
|
|
|
|
|
0
|
|
348
|
|
|
|
|
|
|
|
349
|
0
|
|
|
|
|
0
|
push (@{$comps_for{$class}}, @modules); |
|
0
|
|
|
|
|
0
|
|
350
|
|
|
|
|
|
|
} |
351
|
|
|
|
|
|
|
elsif (ref $param eq 'HASH') { |
352
|
|
|
|
|
|
|
# more than one namespace possible |
353
|
324
|
|
|
|
|
1235
|
for my $comp ( keys %$param ) { |
354
|
|
|
|
|
|
|
# filter out commented entries |
355
|
324
|
|
|
|
|
656
|
my @modules = grep { $_ !~ /^#/ } @{$param->{$comp}}; |
|
3240
|
|
|
|
|
5378
|
|
|
324
|
|
|
|
|
849
|
|
356
|
|
|
|
|
|
|
|
357
|
324
|
|
|
|
|
637
|
push (@{$comps_for{$comp}}, @modules); |
|
324
|
|
|
|
|
1741
|
|
358
|
|
|
|
|
|
|
} |
359
|
|
|
|
|
|
|
} |
360
|
|
|
|
|
|
|
else { |
361
|
|
|
|
|
|
|
# filter out commented entries |
362
|
12641
|
100
|
|
|
|
18659
|
push (@{$comps_for{$class}}, $param) if $param !~ /^#/; |
|
11993
|
|
|
|
|
15535
|
|
363
|
|
|
|
|
|
|
} |
364
|
|
|
|
|
|
|
} |
365
|
|
|
|
|
|
|
} else { |
366
|
1
|
|
|
|
|
8
|
my @comp = map { substr $_, length "${class}::" } |
|
54
|
|
|
|
|
93
|
|
367
|
|
|
|
|
|
|
$class->_findallmod($class); |
368
|
1
|
|
|
|
|
13
|
$comps_for{$class} = \@comp; |
369
|
|
|
|
|
|
|
} |
370
|
|
|
|
|
|
|
|
371
|
330
|
|
|
|
|
716
|
my @to_register; |
372
|
|
|
|
|
|
|
{ |
373
|
326
|
|
|
326
|
|
1806
|
no warnings qw/redefine/; |
|
326
|
|
|
|
|
655
|
|
|
326
|
|
|
|
|
19749
|
|
|
330
|
|
|
|
|
589
|
|
374
|
330
|
|
|
0
|
|
470
|
local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO; |
375
|
326
|
|
|
326
|
|
1463
|
use warnings qw/redefine/; |
|
326
|
|
|
|
|
638
|
|
|
326
|
|
|
|
|
327633
|
|
376
|
|
|
|
|
|
|
|
377
|
330
|
|
|
|
|
1008
|
foreach my $prefix (keys %comps_for) { |
378
|
330
|
50
|
|
|
|
556
|
foreach my $comp (@{$comps_for{$prefix}||[]}) { |
|
330
|
|
|
|
|
1489
|
|
379
|
14963
|
|
|
|
|
35244
|
my $comp_class = "${prefix}::${comp}"; |
380
|
14963
|
|
|
|
|
73024
|
$class->ensure_class_loaded($comp_class); |
381
|
|
|
|
|
|
|
|
382
|
14963
|
|
|
|
|
447215
|
my $snsub = $comp_class->can('source_name'); |
383
|
14963
|
100
|
|
|
|
33631
|
if(! $snsub ) { |
384
|
1
|
|
|
|
|
8
|
carp "Failed to load $comp_class. Can't find source_name method. Is $comp_class really a full DBIC result class? Fix it, move it elsewhere, or make your load_classes call more specific."; |
385
|
1
|
|
|
|
|
5
|
next; |
386
|
|
|
|
|
|
|
} |
387
|
14962
|
|
66
|
|
|
335202
|
$comp = $snsub->($comp_class) || $comp; |
388
|
|
|
|
|
|
|
|
389
|
14962
|
|
|
|
|
1455748
|
push(@to_register, [ $comp, $comp_class ]); |
390
|
|
|
|
|
|
|
} |
391
|
|
|
|
|
|
|
} |
392
|
|
|
|
|
|
|
} |
393
|
330
|
|
|
|
|
711
|
Class::C3->reinitialize if DBIx::Class::_ENV_::OLD_MRO; |
394
|
|
|
|
|
|
|
|
395
|
330
|
|
|
|
|
869
|
foreach my $to (@to_register) { |
396
|
14962
|
|
|
|
|
33727
|
$class->register_class(@$to); |
397
|
|
|
|
|
|
|
} |
398
|
|
|
|
|
|
|
} |
399
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
=head2 storage_type |
401
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
=over 4 |
403
|
|
|
|
|
|
|
|
404
|
|
|
|
|
|
|
=item Arguments: $storage_type|{$storage_type, \%args} |
405
|
|
|
|
|
|
|
|
406
|
|
|
|
|
|
|
=item Return Value: $storage_type|{$storage_type, \%args} |
407
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
=item Default value: DBIx::Class::Storage::DBI |
409
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
=back |
411
|
|
|
|
|
|
|
|
412
|
|
|
|
|
|
|
Set the storage class that will be instantiated when L is called. |
413
|
|
|
|
|
|
|
If the classname starts with C<::>, the prefix C is |
414
|
|
|
|
|
|
|
assumed by L. |
415
|
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
You want to use this to set subclasses of L |
417
|
|
|
|
|
|
|
in cases where the appropriate subclass is not autodetected. |
418
|
|
|
|
|
|
|
|
419
|
|
|
|
|
|
|
If your storage type requires instantiation arguments, those are |
420
|
|
|
|
|
|
|
defined as a second argument in the form of a hashref and the entire |
421
|
|
|
|
|
|
|
value needs to be wrapped into an arrayref or a hashref. We support |
422
|
|
|
|
|
|
|
both types of refs here in order to play nice with your |
423
|
|
|
|
|
|
|
Config::[class] or your choice. See |
424
|
|
|
|
|
|
|
L for an example of this. |
425
|
|
|
|
|
|
|
|
426
|
|
|
|
|
|
|
=head2 exception_action |
427
|
|
|
|
|
|
|
|
428
|
|
|
|
|
|
|
=over 4 |
429
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
=item Arguments: $code_reference |
431
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
=item Return Value: $code_reference |
433
|
|
|
|
|
|
|
|
434
|
|
|
|
|
|
|
=item Default value: None |
435
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
=back |
437
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
When L is invoked and L is set to a code |
439
|
|
|
|
|
|
|
reference, this reference will be called instead of |
440
|
|
|
|
|
|
|
L, with the exception message passed as the only |
441
|
|
|
|
|
|
|
argument. |
442
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
Your custom throw code B rethrow the exception, as L is |
444
|
|
|
|
|
|
|
an integral part of DBIC's internal execution control flow. |
445
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
Example: |
447
|
|
|
|
|
|
|
|
448
|
|
|
|
|
|
|
package My::Schema; |
449
|
|
|
|
|
|
|
use base qw/DBIx::Class::Schema/; |
450
|
|
|
|
|
|
|
use My::ExceptionClass; |
451
|
|
|
|
|
|
|
__PACKAGE__->exception_action(sub { My::ExceptionClass->throw(@_) }); |
452
|
|
|
|
|
|
|
__PACKAGE__->load_classes; |
453
|
|
|
|
|
|
|
|
454
|
|
|
|
|
|
|
# or: |
455
|
|
|
|
|
|
|
my $schema_obj = My::Schema->connect( .... ); |
456
|
|
|
|
|
|
|
$schema_obj->exception_action(sub { My::ExceptionClass->throw(@_) }); |
457
|
|
|
|
|
|
|
|
458
|
|
|
|
|
|
|
=head2 stacktrace |
459
|
|
|
|
|
|
|
|
460
|
|
|
|
|
|
|
=over 4 |
461
|
|
|
|
|
|
|
|
462
|
|
|
|
|
|
|
=item Arguments: boolean |
463
|
|
|
|
|
|
|
|
464
|
|
|
|
|
|
|
=back |
465
|
|
|
|
|
|
|
|
466
|
|
|
|
|
|
|
Whether L should include stack trace information. |
467
|
|
|
|
|
|
|
Defaults to false normally, but defaults to true if C<$ENV{DBIC_TRACE}> |
468
|
|
|
|
|
|
|
is true. |
469
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
=head2 sqlt_deploy_hook |
471
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
=over |
473
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
=item Arguments: $sqlt_schema |
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
=back |
477
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
An optional sub which you can declare in your own Schema class that will get |
479
|
|
|
|
|
|
|
passed the L object when you deploy the schema via |
480
|
|
|
|
|
|
|
L or L. |
481
|
|
|
|
|
|
|
|
482
|
|
|
|
|
|
|
For an example of what you can do with this, see |
483
|
|
|
|
|
|
|
L. |
484
|
|
|
|
|
|
|
|
485
|
|
|
|
|
|
|
Note that sqlt_deploy_hook is called by L, which in turn |
486
|
|
|
|
|
|
|
is called before L. Therefore the hook can be used only to manipulate |
487
|
|
|
|
|
|
|
the L object before it is turned into SQL fed to the |
488
|
|
|
|
|
|
|
database. If you want to execute post-deploy statements which can not be generated |
489
|
|
|
|
|
|
|
by L, the currently suggested method is to overload L |
490
|
|
|
|
|
|
|
and use L. |
491
|
|
|
|
|
|
|
|
492
|
|
|
|
|
|
|
=head1 METHODS |
493
|
|
|
|
|
|
|
|
494
|
|
|
|
|
|
|
=head2 connect |
495
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
=over 4 |
497
|
|
|
|
|
|
|
|
498
|
|
|
|
|
|
|
=item Arguments: @connectinfo |
499
|
|
|
|
|
|
|
|
500
|
|
|
|
|
|
|
=item Return Value: $new_schema |
501
|
|
|
|
|
|
|
|
502
|
|
|
|
|
|
|
=back |
503
|
|
|
|
|
|
|
|
504
|
|
|
|
|
|
|
Creates and returns a new Schema object. The connection info set on it |
505
|
|
|
|
|
|
|
is used to create a new instance of the storage backend and set it on |
506
|
|
|
|
|
|
|
the Schema object. |
507
|
|
|
|
|
|
|
|
508
|
|
|
|
|
|
|
See L for DBI-specific |
509
|
|
|
|
|
|
|
syntax on the C<@connectinfo> argument, or L in |
510
|
|
|
|
|
|
|
general. |
511
|
|
|
|
|
|
|
|
512
|
|
|
|
|
|
|
Note that C expects an arrayref of arguments, but |
513
|
|
|
|
|
|
|
C does not. C wraps its arguments in an arrayref |
514
|
|
|
|
|
|
|
before passing them to C. |
515
|
|
|
|
|
|
|
|
516
|
|
|
|
|
|
|
=head3 Overloading |
517
|
|
|
|
|
|
|
|
518
|
|
|
|
|
|
|
C is a convenience method. It is equivalent to calling |
519
|
|
|
|
|
|
|
$schema->clone->connection(@connectinfo). To write your own overloaded |
520
|
|
|
|
|
|
|
version, overload L instead. |
521
|
|
|
|
|
|
|
|
522
|
|
|
|
|
|
|
=cut |
523
|
|
|
|
|
|
|
|
524
|
432
|
|
|
432
|
1
|
57805
|
sub connect { shift->clone->connection(@_) } |
525
|
|
|
|
|
|
|
|
526
|
|
|
|
|
|
|
=head2 resultset |
527
|
|
|
|
|
|
|
|
528
|
|
|
|
|
|
|
=over 4 |
529
|
|
|
|
|
|
|
|
530
|
|
|
|
|
|
|
=item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name> |
531
|
|
|
|
|
|
|
|
532
|
|
|
|
|
|
|
=item Return Value: L<$resultset|DBIx::Class::ResultSet> |
533
|
|
|
|
|
|
|
|
534
|
|
|
|
|
|
|
=back |
535
|
|
|
|
|
|
|
|
536
|
|
|
|
|
|
|
my $rs = $schema->resultset('DVD'); |
537
|
|
|
|
|
|
|
|
538
|
|
|
|
|
|
|
Returns the L object for the registered source |
539
|
|
|
|
|
|
|
name. |
540
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
=cut |
542
|
|
|
|
|
|
|
|
543
|
|
|
|
|
|
|
sub resultset { |
544
|
9082
|
|
|
9082
|
1
|
949403118
|
my ($self, $source_name) = @_; |
545
|
9082
|
100
|
|
|
|
19486
|
$self->throw_exception('resultset() expects a source name') |
546
|
|
|
|
|
|
|
unless defined $source_name; |
547
|
9081
|
|
|
|
|
18630
|
return $self->source($source_name)->resultset; |
548
|
|
|
|
|
|
|
} |
549
|
|
|
|
|
|
|
|
550
|
|
|
|
|
|
|
=head2 sources |
551
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
=over 4 |
553
|
|
|
|
|
|
|
|
554
|
|
|
|
|
|
|
=item Return Value: L<@source_names|DBIx::Class::ResultSource/source_name> |
555
|
|
|
|
|
|
|
|
556
|
|
|
|
|
|
|
=back |
557
|
|
|
|
|
|
|
|
558
|
|
|
|
|
|
|
my @source_names = $schema->sources; |
559
|
|
|
|
|
|
|
|
560
|
|
|
|
|
|
|
Lists names of all the sources registered on this Schema object. |
561
|
|
|
|
|
|
|
|
562
|
|
|
|
|
|
|
=cut |
563
|
|
|
|
|
|
|
|
564
|
1253
|
|
|
1253
|
1
|
3969
|
sub sources { keys %{shift->source_registrations} } |
|
1253
|
|
|
|
|
21854
|
|
565
|
|
|
|
|
|
|
|
566
|
|
|
|
|
|
|
=head2 source |
567
|
|
|
|
|
|
|
|
568
|
|
|
|
|
|
|
=over 4 |
569
|
|
|
|
|
|
|
|
570
|
|
|
|
|
|
|
=item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name> |
571
|
|
|
|
|
|
|
|
572
|
|
|
|
|
|
|
=item Return Value: L<$result_source|DBIx::Class::ResultSource> |
573
|
|
|
|
|
|
|
|
574
|
|
|
|
|
|
|
=back |
575
|
|
|
|
|
|
|
|
576
|
|
|
|
|
|
|
my $source = $schema->source('Book'); |
577
|
|
|
|
|
|
|
|
578
|
|
|
|
|
|
|
Returns the L object for the registered |
579
|
|
|
|
|
|
|
source name. |
580
|
|
|
|
|
|
|
|
581
|
|
|
|
|
|
|
=cut |
582
|
|
|
|
|
|
|
|
583
|
|
|
|
|
|
|
sub source { |
584
|
83149
|
|
|
83149
|
1
|
97879
|
my $self = shift; |
585
|
|
|
|
|
|
|
|
586
|
83149
|
100
|
|
|
|
136021
|
$self->throw_exception("source() expects a source name") |
587
|
|
|
|
|
|
|
unless @_; |
588
|
|
|
|
|
|
|
|
589
|
83148
|
|
|
|
|
80058
|
my $source_name = shift; |
590
|
|
|
|
|
|
|
|
591
|
83148
|
|
|
|
|
1600000
|
my $sreg = $self->source_registrations; |
592
|
83148
|
100
|
|
|
|
926428
|
return $sreg->{$source_name} if exists $sreg->{$source_name}; |
593
|
|
|
|
|
|
|
|
594
|
|
|
|
|
|
|
# if we got here, they probably passed a full class name |
595
|
16299
|
|
|
|
|
290835
|
my $mapped = $self->class_mappings->{$source_name}; |
596
|
|
|
|
|
|
|
$self->throw_exception("Can't find source for ${source_name}") |
597
|
16299
|
100
|
33
|
|
|
172312
|
unless $mapped && exists $sreg->{$mapped}; |
598
|
16290
|
|
|
|
|
70630
|
return $sreg->{$mapped}; |
599
|
|
|
|
|
|
|
} |
600
|
|
|
|
|
|
|
|
601
|
|
|
|
|
|
|
=head2 class |
602
|
|
|
|
|
|
|
|
603
|
|
|
|
|
|
|
=over 4 |
604
|
|
|
|
|
|
|
|
605
|
|
|
|
|
|
|
=item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name> |
606
|
|
|
|
|
|
|
|
607
|
|
|
|
|
|
|
=item Return Value: $classname |
608
|
|
|
|
|
|
|
|
609
|
|
|
|
|
|
|
=back |
610
|
|
|
|
|
|
|
|
611
|
|
|
|
|
|
|
my $class = $schema->class('CD'); |
612
|
|
|
|
|
|
|
|
613
|
|
|
|
|
|
|
Retrieves the Result class name for the given source name. |
614
|
|
|
|
|
|
|
|
615
|
|
|
|
|
|
|
=cut |
616
|
|
|
|
|
|
|
|
617
|
|
|
|
|
|
|
sub class { |
618
|
397
|
|
|
397
|
1
|
5515
|
return shift->source(shift)->result_class; |
619
|
|
|
|
|
|
|
} |
620
|
|
|
|
|
|
|
|
621
|
|
|
|
|
|
|
=head2 txn_do |
622
|
|
|
|
|
|
|
|
623
|
|
|
|
|
|
|
=over 4 |
624
|
|
|
|
|
|
|
|
625
|
|
|
|
|
|
|
=item Arguments: C<$coderef>, @coderef_args? |
626
|
|
|
|
|
|
|
|
627
|
|
|
|
|
|
|
=item Return Value: The return value of $coderef |
628
|
|
|
|
|
|
|
|
629
|
|
|
|
|
|
|
=back |
630
|
|
|
|
|
|
|
|
631
|
|
|
|
|
|
|
Executes C<$coderef> with (optional) arguments C<@coderef_args> atomically, |
632
|
|
|
|
|
|
|
returning its result (if any). Equivalent to calling $schema->storage->txn_do. |
633
|
|
|
|
|
|
|
See L for more information. |
634
|
|
|
|
|
|
|
|
635
|
|
|
|
|
|
|
This interface is preferred over using the individual methods L, |
636
|
|
|
|
|
|
|
L, and L below. |
637
|
|
|
|
|
|
|
|
638
|
|
|
|
|
|
|
WARNING: If you are connected with C<< AutoCommit => 0 >> the transaction is |
639
|
|
|
|
|
|
|
considered nested, and you will still need to call L to write your |
640
|
|
|
|
|
|
|
changes when appropriate. You will also want to connect with C<< auto_savepoint => |
641
|
|
|
|
|
|
|
1 >> to get partial rollback to work, if the storage driver for your database |
642
|
|
|
|
|
|
|
supports it. |
643
|
|
|
|
|
|
|
|
644
|
|
|
|
|
|
|
Connecting with C<< AutoCommit => 1 >> is recommended. |
645
|
|
|
|
|
|
|
|
646
|
|
|
|
|
|
|
=cut |
647
|
|
|
|
|
|
|
|
648
|
|
|
|
|
|
|
sub txn_do { |
649
|
466
|
|
|
466
|
1
|
200173
|
my $self = shift; |
650
|
|
|
|
|
|
|
|
651
|
466
|
100
|
|
|
|
17272
|
$self->storage or $self->throw_exception |
652
|
|
|
|
|
|
|
('txn_do called on $schema without storage'); |
653
|
|
|
|
|
|
|
|
654
|
442
|
|
|
|
|
17191
|
$self->storage->txn_do(@_); |
655
|
|
|
|
|
|
|
} |
656
|
|
|
|
|
|
|
|
657
|
|
|
|
|
|
|
=head2 txn_scope_guard |
658
|
|
|
|
|
|
|
|
659
|
|
|
|
|
|
|
Runs C on the schema's storage. See |
660
|
|
|
|
|
|
|
L. |
661
|
|
|
|
|
|
|
|
662
|
|
|
|
|
|
|
=cut |
663
|
|
|
|
|
|
|
|
664
|
|
|
|
|
|
|
sub txn_scope_guard { |
665
|
1107
|
|
|
1107
|
1
|
67279
|
my $self = shift; |
666
|
|
|
|
|
|
|
|
667
|
1107
|
50
|
|
|
|
29927
|
$self->storage or $self->throw_exception |
668
|
|
|
|
|
|
|
('txn_scope_guard called on $schema without storage'); |
669
|
|
|
|
|
|
|
|
670
|
1107
|
|
|
|
|
34736
|
$self->storage->txn_scope_guard(@_); |
671
|
|
|
|
|
|
|
} |
672
|
|
|
|
|
|
|
|
673
|
|
|
|
|
|
|
=head2 txn_begin |
674
|
|
|
|
|
|
|
|
675
|
|
|
|
|
|
|
Begins a transaction (does nothing if AutoCommit is off). Equivalent to |
676
|
|
|
|
|
|
|
calling $schema->storage->txn_begin. See |
677
|
|
|
|
|
|
|
L for more information. |
678
|
|
|
|
|
|
|
|
679
|
|
|
|
|
|
|
=cut |
680
|
|
|
|
|
|
|
|
681
|
|
|
|
|
|
|
sub txn_begin { |
682
|
12
|
|
|
12
|
1
|
4214
|
my $self = shift; |
683
|
|
|
|
|
|
|
|
684
|
12
|
50
|
|
|
|
991
|
$self->storage or $self->throw_exception |
685
|
|
|
|
|
|
|
('txn_begin called on $schema without storage'); |
686
|
|
|
|
|
|
|
|
687
|
12
|
|
|
|
|
506
|
$self->storage->txn_begin; |
688
|
|
|
|
|
|
|
} |
689
|
|
|
|
|
|
|
|
690
|
|
|
|
|
|
|
=head2 txn_commit |
691
|
|
|
|
|
|
|
|
692
|
|
|
|
|
|
|
Commits the current transaction. Equivalent to calling |
693
|
|
|
|
|
|
|
$schema->storage->txn_commit. See L |
694
|
|
|
|
|
|
|
for more information. |
695
|
|
|
|
|
|
|
|
696
|
|
|
|
|
|
|
=cut |
697
|
|
|
|
|
|
|
|
698
|
|
|
|
|
|
|
sub txn_commit { |
699
|
5
|
|
|
5
|
1
|
19
|
my $self = shift; |
700
|
|
|
|
|
|
|
|
701
|
5
|
50
|
|
|
|
136
|
$self->storage or $self->throw_exception |
702
|
|
|
|
|
|
|
('txn_commit called on $schema without storage'); |
703
|
|
|
|
|
|
|
|
704
|
5
|
|
|
|
|
150
|
$self->storage->txn_commit; |
705
|
|
|
|
|
|
|
} |
706
|
|
|
|
|
|
|
|
707
|
|
|
|
|
|
|
=head2 txn_rollback |
708
|
|
|
|
|
|
|
|
709
|
|
|
|
|
|
|
Rolls back the current transaction. Equivalent to calling |
710
|
|
|
|
|
|
|
$schema->storage->txn_rollback. See |
711
|
|
|
|
|
|
|
L for more information. |
712
|
|
|
|
|
|
|
|
713
|
|
|
|
|
|
|
=cut |
714
|
|
|
|
|
|
|
|
715
|
|
|
|
|
|
|
sub txn_rollback { |
716
|
6
|
|
|
6
|
1
|
619
|
my $self = shift; |
717
|
|
|
|
|
|
|
|
718
|
6
|
50
|
|
|
|
134
|
$self->storage or $self->throw_exception |
719
|
|
|
|
|
|
|
('txn_rollback called on $schema without storage'); |
720
|
|
|
|
|
|
|
|
721
|
6
|
|
|
|
|
185
|
$self->storage->txn_rollback; |
722
|
|
|
|
|
|
|
} |
723
|
|
|
|
|
|
|
|
724
|
|
|
|
|
|
|
=head2 storage |
725
|
|
|
|
|
|
|
|
726
|
|
|
|
|
|
|
my $storage = $schema->storage; |
727
|
|
|
|
|
|
|
|
728
|
|
|
|
|
|
|
Returns the L object for this Schema. Grab this |
729
|
|
|
|
|
|
|
if you want to turn on SQL statement debugging at runtime, or set the |
730
|
|
|
|
|
|
|
quote character. For the default storage, the documentation can be |
731
|
|
|
|
|
|
|
found in L. |
732
|
|
|
|
|
|
|
|
733
|
|
|
|
|
|
|
=head2 populate |
734
|
|
|
|
|
|
|
|
735
|
|
|
|
|
|
|
=over 4 |
736
|
|
|
|
|
|
|
|
737
|
|
|
|
|
|
|
=item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name>, [ \@column_list, \@row_values+ ] | [ \%col_data+ ] |
738
|
|
|
|
|
|
|
|
739
|
|
|
|
|
|
|
=item Return Value: L<\@result_objects|DBIx::Class::Manual::ResultClass> (scalar context) | L<@result_objects|DBIx::Class::Manual::ResultClass> (list context) |
740
|
|
|
|
|
|
|
|
741
|
|
|
|
|
|
|
=back |
742
|
|
|
|
|
|
|
|
743
|
|
|
|
|
|
|
A convenience shortcut to L. Equivalent to: |
744
|
|
|
|
|
|
|
|
745
|
|
|
|
|
|
|
$schema->resultset($source_name)->populate([...]); |
746
|
|
|
|
|
|
|
|
747
|
|
|
|
|
|
|
=over 4 |
748
|
|
|
|
|
|
|
|
749
|
|
|
|
|
|
|
=item NOTE |
750
|
|
|
|
|
|
|
|
751
|
|
|
|
|
|
|
The context of this method call has an important effect on what is |
752
|
|
|
|
|
|
|
submitted to storage. In void context data is fed directly to fastpath |
753
|
|
|
|
|
|
|
insertion routines provided by the underlying storage (most often |
754
|
|
|
|
|
|
|
L), bypassing the L and |
755
|
|
|
|
|
|
|
L calls on the |
756
|
|
|
|
|
|
|
L class, including any |
757
|
|
|
|
|
|
|
augmentation of these methods provided by components. For example if you |
758
|
|
|
|
|
|
|
are using something like L to create primary |
759
|
|
|
|
|
|
|
keys for you, you will find that your PKs are empty. In this case you |
760
|
|
|
|
|
|
|
will have to explicitly force scalar or list context in order to create |
761
|
|
|
|
|
|
|
those values. |
762
|
|
|
|
|
|
|
|
763
|
|
|
|
|
|
|
=back |
764
|
|
|
|
|
|
|
|
765
|
|
|
|
|
|
|
=cut |
766
|
|
|
|
|
|
|
|
767
|
|
|
|
|
|
|
sub populate { |
768
|
7611
|
|
|
7611
|
1
|
142900
|
my ($self, $name, $data) = @_; |
769
|
7611
|
50
|
|
|
|
14615
|
my $rs = $self->resultset($name) |
770
|
|
|
|
|
|
|
or $self->throw_exception("'$name' is not a resultset"); |
771
|
|
|
|
|
|
|
|
772
|
7611
|
|
|
|
|
20940
|
return $rs->populate($data); |
773
|
|
|
|
|
|
|
} |
774
|
|
|
|
|
|
|
|
775
|
|
|
|
|
|
|
=head2 connection |
776
|
|
|
|
|
|
|
|
777
|
|
|
|
|
|
|
=over 4 |
778
|
|
|
|
|
|
|
|
779
|
|
|
|
|
|
|
=item Arguments: @args |
780
|
|
|
|
|
|
|
|
781
|
|
|
|
|
|
|
=item Return Value: $new_schema |
782
|
|
|
|
|
|
|
|
783
|
|
|
|
|
|
|
=back |
784
|
|
|
|
|
|
|
|
785
|
|
|
|
|
|
|
Similar to L except sets the storage object and connection |
786
|
|
|
|
|
|
|
data in-place on the Schema class. You should probably be calling |
787
|
|
|
|
|
|
|
L to get a proper Schema object instead. |
788
|
|
|
|
|
|
|
|
789
|
|
|
|
|
|
|
=head3 Overloading |
790
|
|
|
|
|
|
|
|
791
|
|
|
|
|
|
|
Overload C to change the behaviour of C. |
792
|
|
|
|
|
|
|
|
793
|
|
|
|
|
|
|
=cut |
794
|
|
|
|
|
|
|
|
795
|
|
|
|
|
|
|
sub connection { |
796
|
444
|
|
|
444
|
1
|
14684
|
my ($self, @info) = @_; |
797
|
444
|
50
|
66
|
|
|
2507
|
return $self if !@info && $self->storage; |
798
|
|
|
|
|
|
|
|
799
|
444
|
50
|
|
|
|
11856
|
my ($storage_class, $args) = ref $self->storage_type |
800
|
|
|
|
|
|
|
? $self->_normalize_storage_type($self->storage_type) |
801
|
|
|
|
|
|
|
: $self->storage_type |
802
|
|
|
|
|
|
|
; |
803
|
|
|
|
|
|
|
|
804
|
444
|
|
|
|
|
44668
|
$storage_class =~ s/^::/DBIx::Class::Storage::/; |
805
|
|
|
|
|
|
|
|
806
|
|
|
|
|
|
|
try { |
807
|
444
|
|
|
444
|
|
30556
|
$self->ensure_class_loaded ($storage_class); |
808
|
|
|
|
|
|
|
} |
809
|
|
|
|
|
|
|
catch { |
810
|
0
|
|
|
0
|
|
0
|
$self->throw_exception( |
811
|
|
|
|
|
|
|
"Unable to load storage class ${storage_class}: $_" |
812
|
|
|
|
|
|
|
); |
813
|
444
|
|
|
|
|
5394
|
}; |
814
|
|
|
|
|
|
|
|
815
|
444
|
|
50
|
|
|
17842
|
my $storage = $storage_class->new( $self => $args||{} ); |
816
|
444
|
|
|
|
|
2227
|
$storage->connect_info(\@info); |
817
|
444
|
|
|
|
|
13276
|
$self->storage($storage); |
818
|
444
|
|
|
|
|
7866
|
return $self; |
819
|
|
|
|
|
|
|
} |
820
|
|
|
|
|
|
|
|
821
|
|
|
|
|
|
|
sub _normalize_storage_type { |
822
|
0
|
|
|
0
|
|
0
|
my ($self, $storage_type) = @_; |
823
|
0
|
0
|
|
|
|
0
|
if(ref $storage_type eq 'ARRAY') { |
|
|
0
|
|
|
|
|
|
824
|
0
|
|
|
|
|
0
|
return @$storage_type; |
825
|
|
|
|
|
|
|
} elsif(ref $storage_type eq 'HASH') { |
826
|
0
|
|
|
|
|
0
|
return %$storage_type; |
827
|
|
|
|
|
|
|
} else { |
828
|
0
|
|
|
|
|
0
|
$self->throw_exception('Unsupported REFTYPE given: '. ref $storage_type); |
829
|
|
|
|
|
|
|
} |
830
|
|
|
|
|
|
|
} |
831
|
|
|
|
|
|
|
|
832
|
|
|
|
|
|
|
=head2 compose_namespace |
833
|
|
|
|
|
|
|
|
834
|
|
|
|
|
|
|
=over 4 |
835
|
|
|
|
|
|
|
|
836
|
|
|
|
|
|
|
=item Arguments: $target_namespace, $additional_base_class? |
837
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
=item Return Value: $new_schema |
839
|
|
|
|
|
|
|
|
840
|
|
|
|
|
|
|
=back |
841
|
|
|
|
|
|
|
|
842
|
|
|
|
|
|
|
For each L in the schema, this method creates a |
843
|
|
|
|
|
|
|
class in the target namespace (e.g. $target_namespace::CD, |
844
|
|
|
|
|
|
|
$target_namespace::Artist) that inherits from the corresponding classes |
845
|
|
|
|
|
|
|
attached to the current schema. |
846
|
|
|
|
|
|
|
|
847
|
|
|
|
|
|
|
It also attaches a corresponding L object to the |
848
|
|
|
|
|
|
|
new $schema object. If C<$additional_base_class> is given, the new composed |
849
|
|
|
|
|
|
|
classes will inherit from first the corresponding class from the current |
850
|
|
|
|
|
|
|
schema then the base class. |
851
|
|
|
|
|
|
|
|
852
|
|
|
|
|
|
|
For example, for a schema with My::Schema::CD and My::Schema::Artist classes, |
853
|
|
|
|
|
|
|
|
854
|
|
|
|
|
|
|
$schema->compose_namespace('My::DB', 'Base::Class'); |
855
|
|
|
|
|
|
|
print join (', ', @My::DB::CD::ISA) . "\n"; |
856
|
|
|
|
|
|
|
print join (', ', @My::DB::Artist::ISA) ."\n"; |
857
|
|
|
|
|
|
|
|
858
|
|
|
|
|
|
|
will produce the output |
859
|
|
|
|
|
|
|
|
860
|
|
|
|
|
|
|
My::Schema::CD, Base::Class |
861
|
|
|
|
|
|
|
My::Schema::Artist, Base::Class |
862
|
|
|
|
|
|
|
|
863
|
|
|
|
|
|
|
=cut |
864
|
|
|
|
|
|
|
|
865
|
|
|
|
|
|
|
# this might be oversimplified |
866
|
|
|
|
|
|
|
# sub compose_namespace { |
867
|
|
|
|
|
|
|
# my ($self, $target, $base) = @_; |
868
|
|
|
|
|
|
|
|
869
|
|
|
|
|
|
|
# my $schema = $self->clone; |
870
|
|
|
|
|
|
|
# foreach my $source_name ($schema->sources) { |
871
|
|
|
|
|
|
|
# my $source = $schema->source($source_name); |
872
|
|
|
|
|
|
|
# my $target_class = "${target}::${source_name}"; |
873
|
|
|
|
|
|
|
# $self->inject_base( |
874
|
|
|
|
|
|
|
# $target_class => $source->result_class, ($base ? $base : ()) |
875
|
|
|
|
|
|
|
# ); |
876
|
|
|
|
|
|
|
# $source->result_class($target_class); |
877
|
|
|
|
|
|
|
# $target_class->result_source_instance($source) |
878
|
|
|
|
|
|
|
# if $target_class->can('result_source_instance'); |
879
|
|
|
|
|
|
|
# $schema->register_source($source_name, $source); |
880
|
|
|
|
|
|
|
# } |
881
|
|
|
|
|
|
|
# return $schema; |
882
|
|
|
|
|
|
|
# } |
883
|
|
|
|
|
|
|
|
884
|
|
|
|
|
|
|
sub compose_namespace { |
885
|
402
|
|
|
402
|
1
|
50663
|
my ($self, $target, $base) = @_; |
886
|
|
|
|
|
|
|
|
887
|
402
|
|
|
|
|
3392
|
my $schema = $self->clone; |
888
|
|
|
|
|
|
|
|
889
|
402
|
|
|
|
|
12222
|
$schema->source_registrations({}); |
890
|
|
|
|
|
|
|
|
891
|
|
|
|
|
|
|
# the original class-mappings must remain - otherwise |
892
|
|
|
|
|
|
|
# reverse_relationship_info will not work |
893
|
|
|
|
|
|
|
#$schema->class_mappings({}); |
894
|
|
|
|
|
|
|
|
895
|
|
|
|
|
|
|
{ |
896
|
326
|
|
|
326
|
|
1979
|
no warnings qw/redefine/; |
|
326
|
|
|
|
|
687
|
|
|
326
|
|
|
|
|
20077
|
|
|
402
|
|
|
|
|
4495
|
|
897
|
402
|
|
|
0
|
|
736
|
local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO; |
898
|
326
|
|
|
326
|
|
1535
|
use warnings qw/redefine/; |
|
326
|
|
|
|
|
762
|
|
|
326
|
|
|
|
|
393075
|
|
899
|
|
|
|
|
|
|
|
900
|
402
|
|
|
|
|
2237
|
foreach my $source_name ($self->sources) { |
901
|
18449
|
|
|
|
|
247886
|
my $orig_source = $self->source($source_name); |
902
|
|
|
|
|
|
|
|
903
|
18449
|
|
|
|
|
34663
|
my $target_class = "${target}::${source_name}"; |
904
|
18449
|
|
66
|
|
|
315424
|
$self->inject_base($target_class, $orig_source->result_class, ($base || ()) ); |
905
|
|
|
|
|
|
|
|
906
|
|
|
|
|
|
|
# register_source examines result_class, and then returns us a clone |
907
|
18449
|
|
|
|
|
1106701
|
my $new_source = $schema->register_source($source_name, bless |
908
|
|
|
|
|
|
|
{ %$orig_source, result_class => $target_class }, |
909
|
|
|
|
|
|
|
ref $orig_source, |
910
|
|
|
|
|
|
|
); |
911
|
|
|
|
|
|
|
|
912
|
18449
|
50
|
|
|
|
58344
|
if ($target_class->can('result_source_instance')) { |
913
|
|
|
|
|
|
|
# give the class a schema-less source copy |
914
|
|
|
|
|
|
|
$target_class->result_source_instance( bless |
915
|
|
|
|
|
|
|
{ %$new_source, schema => ref $new_source->{schema} || $new_source->{schema} }, |
916
|
18449
|
|
33
|
|
|
482676
|
ref $new_source, |
917
|
|
|
|
|
|
|
); |
918
|
|
|
|
|
|
|
} |
919
|
|
|
|
|
|
|
} |
920
|
|
|
|
|
|
|
|
921
|
|
|
|
|
|
|
quote_sub "${target}::${_}" => "shift->schema->$_(\@_)" |
922
|
402
|
|
|
|
|
10508
|
for qw(class source resultset); |
923
|
|
|
|
|
|
|
} |
924
|
|
|
|
|
|
|
|
925
|
402
|
|
|
|
|
122810
|
Class::C3->reinitialize() if DBIx::Class::_ENV_::OLD_MRO; |
926
|
|
|
|
|
|
|
|
927
|
402
|
|
|
|
|
1645
|
return $schema; |
928
|
|
|
|
|
|
|
} |
929
|
|
|
|
|
|
|
|
930
|
|
|
|
|
|
|
sub setup_connection_class { |
931
|
0
|
|
|
0
|
0
|
0
|
my ($class, $target, @info) = @_; |
932
|
0
|
|
|
|
|
0
|
$class->inject_base($target => 'DBIx::Class::DB'); |
933
|
|
|
|
|
|
|
#$target->load_components('DB'); |
934
|
0
|
|
|
|
|
0
|
$target->connection(@info); |
935
|
|
|
|
|
|
|
} |
936
|
|
|
|
|
|
|
|
937
|
|
|
|
|
|
|
=head2 svp_begin |
938
|
|
|
|
|
|
|
|
939
|
|
|
|
|
|
|
Creates a new savepoint (does nothing outside a transaction). |
940
|
|
|
|
|
|
|
Equivalent to calling $schema->storage->svp_begin. See |
941
|
|
|
|
|
|
|
L for more information. |
942
|
|
|
|
|
|
|
|
943
|
|
|
|
|
|
|
=cut |
944
|
|
|
|
|
|
|
|
945
|
|
|
|
|
|
|
sub svp_begin { |
946
|
17
|
|
|
17
|
1
|
92
|
my ($self, $name) = @_; |
947
|
|
|
|
|
|
|
|
948
|
17
|
50
|
|
|
|
421
|
$self->storage or $self->throw_exception |
949
|
|
|
|
|
|
|
('svp_begin called on $schema without storage'); |
950
|
|
|
|
|
|
|
|
951
|
17
|
|
|
|
|
537
|
$self->storage->svp_begin($name); |
952
|
|
|
|
|
|
|
} |
953
|
|
|
|
|
|
|
|
954
|
|
|
|
|
|
|
=head2 svp_release |
955
|
|
|
|
|
|
|
|
956
|
|
|
|
|
|
|
Releases a savepoint (does nothing outside a transaction). |
957
|
|
|
|
|
|
|
Equivalent to calling $schema->storage->svp_release. See |
958
|
|
|
|
|
|
|
L for more information. |
959
|
|
|
|
|
|
|
|
960
|
|
|
|
|
|
|
=cut |
961
|
|
|
|
|
|
|
|
962
|
|
|
|
|
|
|
sub svp_release { |
963
|
6
|
|
|
6
|
1
|
13
|
my ($self, $name) = @_; |
964
|
|
|
|
|
|
|
|
965
|
6
|
50
|
|
|
|
141
|
$self->storage or $self->throw_exception |
966
|
|
|
|
|
|
|
('svp_release called on $schema without storage'); |
967
|
|
|
|
|
|
|
|
968
|
6
|
|
|
|
|
161
|
$self->storage->svp_release($name); |
969
|
|
|
|
|
|
|
} |
970
|
|
|
|
|
|
|
|
971
|
|
|
|
|
|
|
=head2 svp_rollback |
972
|
|
|
|
|
|
|
|
973
|
|
|
|
|
|
|
Rollback to a savepoint (does nothing outside a transaction). |
974
|
|
|
|
|
|
|
Equivalent to calling $schema->storage->svp_rollback. See |
975
|
|
|
|
|
|
|
L for more information. |
976
|
|
|
|
|
|
|
|
977
|
|
|
|
|
|
|
=cut |
978
|
|
|
|
|
|
|
|
979
|
|
|
|
|
|
|
sub svp_rollback { |
980
|
12
|
|
|
12
|
1
|
18
|
my ($self, $name) = @_; |
981
|
|
|
|
|
|
|
|
982
|
12
|
50
|
|
|
|
290
|
$self->storage or $self->throw_exception |
983
|
|
|
|
|
|
|
('svp_rollback called on $schema without storage'); |
984
|
|
|
|
|
|
|
|
985
|
12
|
|
|
|
|
347
|
$self->storage->svp_rollback($name); |
986
|
|
|
|
|
|
|
} |
987
|
|
|
|
|
|
|
|
988
|
|
|
|
|
|
|
=head2 clone |
989
|
|
|
|
|
|
|
|
990
|
|
|
|
|
|
|
=over 4 |
991
|
|
|
|
|
|
|
|
992
|
|
|
|
|
|
|
=item Arguments: %attrs? |
993
|
|
|
|
|
|
|
|
994
|
|
|
|
|
|
|
=item Return Value: $new_schema |
995
|
|
|
|
|
|
|
|
996
|
|
|
|
|
|
|
=back |
997
|
|
|
|
|
|
|
|
998
|
|
|
|
|
|
|
Clones the schema and its associated result_source objects and returns the |
999
|
|
|
|
|
|
|
copy. The resulting copy will have the same attributes as the source schema, |
1000
|
|
|
|
|
|
|
except for those attributes explicitly overridden by the provided C<%attrs>. |
1001
|
|
|
|
|
|
|
|
1002
|
|
|
|
|
|
|
=cut |
1003
|
|
|
|
|
|
|
|
1004
|
|
|
|
|
|
|
sub clone { |
1005
|
842
|
|
|
842
|
1
|
21906
|
my $self = shift; |
1006
|
|
|
|
|
|
|
|
1007
|
|
|
|
|
|
|
my $clone = { |
1008
|
|
|
|
|
|
|
(ref $self ? %$self : ()), |
1009
|
842
|
100
|
66
|
|
|
7320
|
(@_ == 1 && ref $_[0] eq 'HASH' ? %{ $_[0] } : @_), |
|
1
|
100
|
|
|
|
5
|
|
1010
|
|
|
|
|
|
|
}; |
1011
|
842
|
|
66
|
|
|
4461
|
bless $clone, (ref $self || $self); |
1012
|
|
|
|
|
|
|
|
1013
|
842
|
|
|
|
|
26427
|
$clone->$_(undef) for qw/class_mappings source_registrations storage/; |
1014
|
|
|
|
|
|
|
|
1015
|
842
|
|
|
|
|
61962
|
$clone->_copy_state_from($self); |
1016
|
|
|
|
|
|
|
|
1017
|
842
|
|
|
|
|
37287
|
return $clone; |
1018
|
|
|
|
|
|
|
} |
1019
|
|
|
|
|
|
|
|
1020
|
|
|
|
|
|
|
# Needed in Schema::Loader - if you refactor, please make a compatibility shim |
1021
|
|
|
|
|
|
|
# -- Caelum |
1022
|
|
|
|
|
|
|
sub _copy_state_from { |
1023
|
842
|
|
|
842
|
|
1830
|
my ($self, $from) = @_; |
1024
|
|
|
|
|
|
|
|
1025
|
842
|
|
|
|
|
1448
|
$self->class_mappings({ %{$from->class_mappings} }); |
|
842
|
|
|
|
|
15026
|
|
1026
|
842
|
|
|
|
|
70244
|
$self->source_registrations({ %{$from->source_registrations} }); |
|
842
|
|
|
|
|
15369
|
|
1027
|
|
|
|
|
|
|
|
1028
|
842
|
|
|
|
|
52572
|
foreach my $source_name ($from->sources) { |
1029
|
38647
|
|
|
|
|
82282
|
my $source = $from->source($source_name); |
1030
|
38647
|
|
|
|
|
90988
|
my $new = $source->new($source); |
1031
|
|
|
|
|
|
|
# we use extra here as we want to leave the class_mappings as they are |
1032
|
|
|
|
|
|
|
# but overwrite the source_registrations entry with the new source |
1033
|
38647
|
|
|
|
|
67154
|
$self->register_extra_source($source_name => $new); |
1034
|
|
|
|
|
|
|
} |
1035
|
|
|
|
|
|
|
|
1036
|
842
|
100
|
|
|
|
20577
|
if ($from->storage) { |
1037
|
6
|
|
|
|
|
180
|
$self->storage($from->storage); |
1038
|
6
|
|
|
|
|
248
|
$self->storage->set_schema($self); |
1039
|
|
|
|
|
|
|
} |
1040
|
|
|
|
|
|
|
} |
1041
|
|
|
|
|
|
|
|
1042
|
|
|
|
|
|
|
=head2 throw_exception |
1043
|
|
|
|
|
|
|
|
1044
|
|
|
|
|
|
|
=over 4 |
1045
|
|
|
|
|
|
|
|
1046
|
|
|
|
|
|
|
=item Arguments: $message |
1047
|
|
|
|
|
|
|
|
1048
|
|
|
|
|
|
|
=back |
1049
|
|
|
|
|
|
|
|
1050
|
|
|
|
|
|
|
Throws an exception. Obeys the exemption rules of L to report |
1051
|
|
|
|
|
|
|
errors from outer-user's perspective. See L for details on overriding |
1052
|
|
|
|
|
|
|
this method's behavior. If L is turned on, C's |
1053
|
|
|
|
|
|
|
default behavior will provide a detailed stack trace. |
1054
|
|
|
|
|
|
|
|
1055
|
|
|
|
|
|
|
=cut |
1056
|
|
|
|
|
|
|
|
1057
|
|
|
|
|
|
|
sub throw_exception { |
1058
|
2744
|
|
|
2744
|
1
|
15842
|
my ($self, @args) = @_; |
1059
|
|
|
|
|
|
|
|
1060
|
2744
|
100
|
|
|
|
66240
|
if (my $act = $self->exception_action) { |
1061
|
|
|
|
|
|
|
|
1062
|
7
|
|
|
|
|
75
|
my $guard_disarmed; |
1063
|
|
|
|
|
|
|
|
1064
|
|
|
|
|
|
|
my $guard = scope_guard { |
1065
|
7
|
100
|
|
7
|
|
15
|
return if $guard_disarmed; |
1066
|
1
|
|
|
|
|
9
|
local $SIG{__WARN__}; |
1067
|
1
|
|
|
|
|
340
|
Carp::cluck(" |
1068
|
|
|
|
|
|
|
!!! DBIx::Class INTERNAL PANIC !!! |
1069
|
|
|
|
|
|
|
|
1070
|
|
|
|
|
|
|
The exception_action() handler installed on '$self' |
1071
|
|
|
|
|
|
|
aborted the stacktrace below via a longjmp (either via Return::Multilevel or |
1072
|
|
|
|
|
|
|
plain goto, or Scope::Upper or something equally nefarious). There currently |
1073
|
|
|
|
|
|
|
is nothing safe DBIx::Class can do, aside from displaying this error. A future |
1074
|
|
|
|
|
|
|
version ( 0.082900, when available ) will reduce the cases in which the |
1075
|
|
|
|
|
|
|
handler is invoked, but this is neither a complete solution, nor can it do |
1076
|
|
|
|
|
|
|
anything for other software that might be affected by a similar problem. |
1077
|
|
|
|
|
|
|
|
1078
|
|
|
|
|
|
|
!!! FIX YOUR ERROR HANDLING !!! |
1079
|
|
|
|
|
|
|
|
1080
|
|
|
|
|
|
|
This guard was activated beginning" |
1081
|
|
|
|
|
|
|
); |
1082
|
7
|
|
|
|
|
44
|
}; |
1083
|
|
|
|
|
|
|
|
1084
|
|
|
|
|
|
|
eval { |
1085
|
|
|
|
|
|
|
# if it throws - good, we'll go down to the do{} below |
1086
|
|
|
|
|
|
|
# if it doesn't - do different things depending on RV truthiness |
1087
|
7
|
100
|
|
|
|
19
|
if( $act->(@args) ) { |
1088
|
1
|
|
|
|
|
8
|
$args[0] = ( |
1089
|
|
|
|
|
|
|
"Invocation of the exception_action handler installed on $self did *not*" |
1090
|
|
|
|
|
|
|
.' result in an exception. DBIx::Class is unable to function without a reliable' |
1091
|
|
|
|
|
|
|
.' exception mechanism, ensure that exception_action does not hide exceptions' |
1092
|
|
|
|
|
|
|
." (original error: $args[0])" |
1093
|
|
|
|
|
|
|
); |
1094
|
|
|
|
|
|
|
} |
1095
|
|
|
|
|
|
|
else { |
1096
|
2
|
|
|
|
|
13
|
carp_unique ( |
1097
|
|
|
|
|
|
|
"The exception_action handler installed on $self returned false instead" |
1098
|
|
|
|
|
|
|
.' of throwing an exception. This behavior has been deprecated, adjust your' |
1099
|
|
|
|
|
|
|
.' handler to always rethrow the supplied error' |
1100
|
|
|
|
|
|
|
); |
1101
|
|
|
|
|
|
|
} |
1102
|
|
|
|
|
|
|
|
1103
|
3
|
|
|
|
|
51
|
$guard_disarmed = 1; |
1104
|
|
|
|
|
|
|
} |
1105
|
|
|
|
|
|
|
|
1106
|
|
|
|
|
|
|
or |
1107
|
|
|
|
|
|
|
|
1108
|
7
|
100
|
|
|
|
9
|
do { |
1109
|
|
|
|
|
|
|
# We call this to get the necessary warnings emitted and disregard the RV |
1110
|
|
|
|
|
|
|
# as it's definitely an exception if we got as far as this do{} block |
1111
|
3
|
|
|
|
|
41
|
is_exception($@); |
1112
|
|
|
|
|
|
|
|
1113
|
3
|
|
|
|
|
1
|
$guard_disarmed = 1; |
1114
|
3
|
|
|
|
|
10
|
$args[0] = $@; |
1115
|
|
|
|
|
|
|
}; |
1116
|
|
|
|
|
|
|
} |
1117
|
|
|
|
|
|
|
|
1118
|
2743
|
|
|
|
|
219087
|
DBIx::Class::Exception->throw($args[0], $self->stacktrace); |
1119
|
|
|
|
|
|
|
} |
1120
|
|
|
|
|
|
|
|
1121
|
|
|
|
|
|
|
=head2 deploy |
1122
|
|
|
|
|
|
|
|
1123
|
|
|
|
|
|
|
=over 4 |
1124
|
|
|
|
|
|
|
|
1125
|
|
|
|
|
|
|
=item Arguments: \%sqlt_args, $dir |
1126
|
|
|
|
|
|
|
|
1127
|
|
|
|
|
|
|
=back |
1128
|
|
|
|
|
|
|
|
1129
|
|
|
|
|
|
|
Attempts to deploy the schema to the current storage using L. |
1130
|
|
|
|
|
|
|
|
1131
|
|
|
|
|
|
|
See L for a list of values for C<\%sqlt_args>. |
1132
|
|
|
|
|
|
|
The most common value for this would be C<< { add_drop_table => 1 } >> |
1133
|
|
|
|
|
|
|
to have the SQL produced include a C statement for each table |
1134
|
|
|
|
|
|
|
created. For quoting purposes supply C. |
1135
|
|
|
|
|
|
|
|
1136
|
|
|
|
|
|
|
Additionally, the DBIx::Class parser accepts a C parameter as a hash |
1137
|
|
|
|
|
|
|
ref or an array ref, containing a list of source to deploy. If present, then |
1138
|
|
|
|
|
|
|
only the sources listed will get deployed. Furthermore, you can use the |
1139
|
|
|
|
|
|
|
C parser parameter to prevent the parser from creating an index for each |
1140
|
|
|
|
|
|
|
FK. |
1141
|
|
|
|
|
|
|
|
1142
|
|
|
|
|
|
|
=cut |
1143
|
|
|
|
|
|
|
|
1144
|
|
|
|
|
|
|
sub deploy { |
1145
|
0
|
|
|
0
|
1
|
0
|
my ($self, $sqltargs, $dir) = @_; |
1146
|
0
|
0
|
|
|
|
0
|
$self->throw_exception("Can't deploy without storage") unless $self->storage; |
1147
|
0
|
|
|
|
|
0
|
$self->storage->deploy($self, undef, $sqltargs, $dir); |
1148
|
|
|
|
|
|
|
} |
1149
|
|
|
|
|
|
|
|
1150
|
|
|
|
|
|
|
=head2 deployment_statements |
1151
|
|
|
|
|
|
|
|
1152
|
|
|
|
|
|
|
=over 4 |
1153
|
|
|
|
|
|
|
|
1154
|
|
|
|
|
|
|
=item Arguments: See L |
1155
|
|
|
|
|
|
|
|
1156
|
|
|
|
|
|
|
=item Return Value: $listofstatements |
1157
|
|
|
|
|
|
|
|
1158
|
|
|
|
|
|
|
=back |
1159
|
|
|
|
|
|
|
|
1160
|
|
|
|
|
|
|
A convenient shortcut to |
1161
|
|
|
|
|
|
|
C<< $self->storage->deployment_statements($self, @args) >>. |
1162
|
|
|
|
|
|
|
Returns the statements used by L and |
1163
|
|
|
|
|
|
|
L. |
1164
|
|
|
|
|
|
|
|
1165
|
|
|
|
|
|
|
=cut |
1166
|
|
|
|
|
|
|
|
1167
|
|
|
|
|
|
|
sub deployment_statements { |
1168
|
1
|
|
|
1
|
1
|
2123
|
my $self = shift; |
1169
|
|
|
|
|
|
|
|
1170
|
1
|
50
|
|
|
|
32
|
$self->throw_exception("Can't generate deployment statements without a storage") |
1171
|
|
|
|
|
|
|
if not $self->storage; |
1172
|
|
|
|
|
|
|
|
1173
|
1
|
|
|
|
|
33
|
$self->storage->deployment_statements($self, @_); |
1174
|
|
|
|
|
|
|
} |
1175
|
|
|
|
|
|
|
|
1176
|
|
|
|
|
|
|
=head2 create_ddl_dir |
1177
|
|
|
|
|
|
|
|
1178
|
|
|
|
|
|
|
=over 4 |
1179
|
|
|
|
|
|
|
|
1180
|
|
|
|
|
|
|
=item Arguments: See L |
1181
|
|
|
|
|
|
|
|
1182
|
|
|
|
|
|
|
=back |
1183
|
|
|
|
|
|
|
|
1184
|
|
|
|
|
|
|
A convenient shortcut to |
1185
|
|
|
|
|
|
|
C<< $self->storage->create_ddl_dir($self, @args) >>. |
1186
|
|
|
|
|
|
|
|
1187
|
|
|
|
|
|
|
Creates an SQL file based on the Schema, for each of the specified |
1188
|
|
|
|
|
|
|
database types, in the given directory. |
1189
|
|
|
|
|
|
|
|
1190
|
|
|
|
|
|
|
=cut |
1191
|
|
|
|
|
|
|
|
1192
|
|
|
|
|
|
|
sub create_ddl_dir { |
1193
|
0
|
|
|
0
|
1
|
0
|
my $self = shift; |
1194
|
|
|
|
|
|
|
|
1195
|
0
|
0
|
|
|
|
0
|
$self->throw_exception("Can't create_ddl_dir without storage") unless $self->storage; |
1196
|
0
|
|
|
|
|
0
|
$self->storage->create_ddl_dir($self, @_); |
1197
|
|
|
|
|
|
|
} |
1198
|
|
|
|
|
|
|
|
1199
|
|
|
|
|
|
|
=head2 ddl_filename |
1200
|
|
|
|
|
|
|
|
1201
|
|
|
|
|
|
|
=over 4 |
1202
|
|
|
|
|
|
|
|
1203
|
|
|
|
|
|
|
=item Arguments: $database-type, $version, $directory, $preversion |
1204
|
|
|
|
|
|
|
|
1205
|
|
|
|
|
|
|
=item Return Value: $normalised_filename |
1206
|
|
|
|
|
|
|
|
1207
|
|
|
|
|
|
|
=back |
1208
|
|
|
|
|
|
|
|
1209
|
|
|
|
|
|
|
my $filename = $table->ddl_filename($type, $version, $dir, $preversion) |
1210
|
|
|
|
|
|
|
|
1211
|
|
|
|
|
|
|
This method is called by C to compose a file name out of |
1212
|
|
|
|
|
|
|
the supplied directory, database type and version number. The default file |
1213
|
|
|
|
|
|
|
name format is: C<$dir$schema-$version-$type.sql>. |
1214
|
|
|
|
|
|
|
|
1215
|
|
|
|
|
|
|
You may override this method in your schema if you wish to use a different |
1216
|
|
|
|
|
|
|
format. |
1217
|
|
|
|
|
|
|
|
1218
|
|
|
|
|
|
|
WARNING |
1219
|
|
|
|
|
|
|
|
1220
|
|
|
|
|
|
|
Prior to DBIx::Class version 0.08100 this method had a different signature: |
1221
|
|
|
|
|
|
|
|
1222
|
|
|
|
|
|
|
my $filename = $table->ddl_filename($type, $dir, $version, $preversion) |
1223
|
|
|
|
|
|
|
|
1224
|
|
|
|
|
|
|
In recent versions variables $dir and $version were reversed in order to |
1225
|
|
|
|
|
|
|
bring the signature in line with other Schema/Storage methods. If you |
1226
|
|
|
|
|
|
|
really need to maintain backward compatibility, you can do the following |
1227
|
|
|
|
|
|
|
in any overriding methods: |
1228
|
|
|
|
|
|
|
|
1229
|
|
|
|
|
|
|
($dir, $version) = ($version, $dir) if ($DBIx::Class::VERSION < 0.08100); |
1230
|
|
|
|
|
|
|
|
1231
|
|
|
|
|
|
|
=cut |
1232
|
|
|
|
|
|
|
|
1233
|
|
|
|
|
|
|
sub ddl_filename { |
1234
|
1
|
|
|
1
|
1
|
2
|
my ($self, $type, $version, $dir, $preversion) = @_; |
1235
|
|
|
|
|
|
|
|
1236
|
1
|
|
|
|
|
6
|
require File::Spec; |
1237
|
|
|
|
|
|
|
|
1238
|
1
|
50
|
|
|
|
3
|
$version = "$preversion-$version" if $preversion; |
1239
|
|
|
|
|
|
|
|
1240
|
1
|
|
33
|
|
|
5
|
my $class = blessed($self) || $self; |
1241
|
1
|
|
|
|
|
4
|
$class =~ s/::/-/g; |
1242
|
|
|
|
|
|
|
|
1243
|
1
|
|
|
|
|
21
|
return File::Spec->catfile($dir, "$class-$version-$type.sql"); |
1244
|
|
|
|
|
|
|
} |
1245
|
|
|
|
|
|
|
|
1246
|
|
|
|
|
|
|
=head2 thaw |
1247
|
|
|
|
|
|
|
|
1248
|
|
|
|
|
|
|
Provided as the recommended way of thawing schema objects. You can call |
1249
|
|
|
|
|
|
|
C directly if you wish, but the thawed objects will not have a |
1250
|
|
|
|
|
|
|
reference to any schema, so are rather useless. |
1251
|
|
|
|
|
|
|
|
1252
|
|
|
|
|
|
|
=cut |
1253
|
|
|
|
|
|
|
|
1254
|
|
|
|
|
|
|
sub thaw { |
1255
|
4
|
|
|
4
|
1
|
78
|
my ($self, $obj) = @_; |
1256
|
4
|
|
|
|
|
4
|
local $DBIx::Class::ResultSourceHandle::thaw_schema = $self; |
1257
|
4
|
|
|
|
|
8
|
return Storable::thaw($obj); |
1258
|
|
|
|
|
|
|
} |
1259
|
|
|
|
|
|
|
|
1260
|
|
|
|
|
|
|
=head2 freeze |
1261
|
|
|
|
|
|
|
|
1262
|
|
|
|
|
|
|
This doesn't actually do anything beyond calling L, |
1263
|
|
|
|
|
|
|
it is just provided here for symmetry. |
1264
|
|
|
|
|
|
|
|
1265
|
|
|
|
|
|
|
=cut |
1266
|
|
|
|
|
|
|
|
1267
|
|
|
|
|
|
|
sub freeze { |
1268
|
4
|
|
|
4
|
1
|
81
|
return Storable::nfreeze($_[1]); |
1269
|
|
|
|
|
|
|
} |
1270
|
|
|
|
|
|
|
|
1271
|
|
|
|
|
|
|
=head2 dclone |
1272
|
|
|
|
|
|
|
|
1273
|
|
|
|
|
|
|
=over 4 |
1274
|
|
|
|
|
|
|
|
1275
|
|
|
|
|
|
|
=item Arguments: $object |
1276
|
|
|
|
|
|
|
|
1277
|
|
|
|
|
|
|
=item Return Value: dcloned $object |
1278
|
|
|
|
|
|
|
|
1279
|
|
|
|
|
|
|
=back |
1280
|
|
|
|
|
|
|
|
1281
|
|
|
|
|
|
|
Recommended way of dcloning L and L |
1282
|
|
|
|
|
|
|
objects so their references to the schema object |
1283
|
|
|
|
|
|
|
(which itself is B cloned) are properly maintained. |
1284
|
|
|
|
|
|
|
|
1285
|
|
|
|
|
|
|
=cut |
1286
|
|
|
|
|
|
|
|
1287
|
|
|
|
|
|
|
sub dclone { |
1288
|
4
|
|
|
4
|
1
|
75
|
my ($self, $obj) = @_; |
1289
|
4
|
|
|
|
|
5
|
local $DBIx::Class::ResultSourceHandle::thaw_schema = $self; |
1290
|
4
|
|
|
|
|
55
|
return Storable::dclone($obj); |
1291
|
|
|
|
|
|
|
} |
1292
|
|
|
|
|
|
|
|
1293
|
|
|
|
|
|
|
=head2 schema_version |
1294
|
|
|
|
|
|
|
|
1295
|
|
|
|
|
|
|
Returns the current schema class' $VERSION in a normalised way. |
1296
|
|
|
|
|
|
|
|
1297
|
|
|
|
|
|
|
=cut |
1298
|
|
|
|
|
|
|
|
1299
|
|
|
|
|
|
|
sub schema_version { |
1300
|
1
|
|
|
1
|
1
|
2
|
my ($self) = @_; |
1301
|
1
|
|
33
|
|
|
3
|
my $class = ref($self)||$self; |
1302
|
|
|
|
|
|
|
|
1303
|
|
|
|
|
|
|
# does -not- use $schema->VERSION |
1304
|
|
|
|
|
|
|
# since that varies in results depending on if version.pm is installed, and if |
1305
|
|
|
|
|
|
|
# so the perl or XS versions. If you want this to change, bug the version.pm |
1306
|
|
|
|
|
|
|
# author to make vpp and vxs behave the same. |
1307
|
|
|
|
|
|
|
|
1308
|
1
|
|
|
|
|
2
|
my $version; |
1309
|
|
|
|
|
|
|
{ |
1310
|
326
|
|
|
326
|
|
1901
|
no strict 'refs'; |
|
326
|
|
|
|
|
589
|
|
|
326
|
|
|
|
|
281328
|
|
|
1
|
|
|
|
|
1
|
|
1311
|
1
|
|
|
|
|
1
|
$version = ${"${class}::VERSION"}; |
|
1
|
|
|
|
|
7
|
|
1312
|
|
|
|
|
|
|
} |
1313
|
1
|
|
|
|
|
6
|
return $version; |
1314
|
|
|
|
|
|
|
} |
1315
|
|
|
|
|
|
|
|
1316
|
|
|
|
|
|
|
|
1317
|
|
|
|
|
|
|
=head2 register_class |
1318
|
|
|
|
|
|
|
|
1319
|
|
|
|
|
|
|
=over 4 |
1320
|
|
|
|
|
|
|
|
1321
|
|
|
|
|
|
|
=item Arguments: $source_name, $component_class |
1322
|
|
|
|
|
|
|
|
1323
|
|
|
|
|
|
|
=back |
1324
|
|
|
|
|
|
|
|
1325
|
|
|
|
|
|
|
This method is called by L and L to install the found classes into your Schema. You should be using those instead of this one. |
1326
|
|
|
|
|
|
|
|
1327
|
|
|
|
|
|
|
You will only need this method if you have your Result classes in |
1328
|
|
|
|
|
|
|
files which are not named after the packages (or all in the same |
1329
|
|
|
|
|
|
|
file). You may also need it to register classes at runtime. |
1330
|
|
|
|
|
|
|
|
1331
|
|
|
|
|
|
|
Registers a class which isa DBIx::Class::ResultSourceProxy. Equivalent to |
1332
|
|
|
|
|
|
|
calling: |
1333
|
|
|
|
|
|
|
|
1334
|
|
|
|
|
|
|
$schema->register_source($source_name, $component_class->result_source_instance); |
1335
|
|
|
|
|
|
|
|
1336
|
|
|
|
|
|
|
=cut |
1337
|
|
|
|
|
|
|
|
1338
|
|
|
|
|
|
|
sub register_class { |
1339
|
15089
|
|
|
15089
|
1
|
24755
|
my ($self, $source_name, $to_register) = @_; |
1340
|
15089
|
|
|
|
|
357707
|
$self->register_source($source_name => $to_register->result_source_instance); |
1341
|
|
|
|
|
|
|
} |
1342
|
|
|
|
|
|
|
|
1343
|
|
|
|
|
|
|
=head2 register_source |
1344
|
|
|
|
|
|
|
|
1345
|
|
|
|
|
|
|
=over 4 |
1346
|
|
|
|
|
|
|
|
1347
|
|
|
|
|
|
|
=item Arguments: $source_name, L<$result_source|DBIx::Class::ResultSource> |
1348
|
|
|
|
|
|
|
|
1349
|
|
|
|
|
|
|
=back |
1350
|
|
|
|
|
|
|
|
1351
|
|
|
|
|
|
|
This method is called by L. |
1352
|
|
|
|
|
|
|
|
1353
|
|
|
|
|
|
|
Registers the L in the schema with the given |
1354
|
|
|
|
|
|
|
source name. |
1355
|
|
|
|
|
|
|
|
1356
|
|
|
|
|
|
|
=cut |
1357
|
|
|
|
|
|
|
|
1358
|
33542
|
|
|
33542
|
1
|
301841
|
sub register_source { shift->_register_source(@_) } |
1359
|
|
|
|
|
|
|
|
1360
|
|
|
|
|
|
|
=head2 unregister_source |
1361
|
|
|
|
|
|
|
|
1362
|
|
|
|
|
|
|
=over 4 |
1363
|
|
|
|
|
|
|
|
1364
|
|
|
|
|
|
|
=item Arguments: $source_name |
1365
|
|
|
|
|
|
|
|
1366
|
|
|
|
|
|
|
=back |
1367
|
|
|
|
|
|
|
|
1368
|
|
|
|
|
|
|
Removes the L from the schema for the given source name. |
1369
|
|
|
|
|
|
|
|
1370
|
|
|
|
|
|
|
=cut |
1371
|
|
|
|
|
|
|
|
1372
|
0
|
|
|
0
|
1
|
0
|
sub unregister_source { shift->_unregister_source(@_) } |
1373
|
|
|
|
|
|
|
|
1374
|
|
|
|
|
|
|
=head2 register_extra_source |
1375
|
|
|
|
|
|
|
|
1376
|
|
|
|
|
|
|
=over 4 |
1377
|
|
|
|
|
|
|
|
1378
|
|
|
|
|
|
|
=item Arguments: $source_name, L<$result_source|DBIx::Class::ResultSource> |
1379
|
|
|
|
|
|
|
|
1380
|
|
|
|
|
|
|
=back |
1381
|
|
|
|
|
|
|
|
1382
|
|
|
|
|
|
|
As L but should be used if the result class already |
1383
|
|
|
|
|
|
|
has a source and you want to register an extra one. |
1384
|
|
|
|
|
|
|
|
1385
|
|
|
|
|
|
|
=cut |
1386
|
|
|
|
|
|
|
|
1387
|
38649
|
|
|
38649
|
1
|
84977
|
sub register_extra_source { shift->_register_source(@_, { extra => 1 }) } |
1388
|
|
|
|
|
|
|
|
1389
|
|
|
|
|
|
|
sub _register_source { |
1390
|
72191
|
|
|
72191
|
|
89119
|
my ($self, $source_name, $source, $params) = @_; |
1391
|
|
|
|
|
|
|
|
1392
|
72191
|
|
|
|
|
500830
|
$source = $source->new({ %$source, source_name => $source_name }); |
1393
|
|
|
|
|
|
|
|
1394
|
72191
|
|
|
|
|
282960
|
$source->schema($self); |
1395
|
72191
|
100
|
|
|
|
188405
|
weaken $source->{schema} if ref($self); |
1396
|
|
|
|
|
|
|
|
1397
|
72191
|
|
|
|
|
56996
|
my %reg = %{$self->source_registrations}; |
|
72191
|
|
|
|
|
1459114
|
|
1398
|
72191
|
|
|
|
|
1686987
|
$reg{$source_name} = $source; |
1399
|
72191
|
|
|
|
|
1273939
|
$self->source_registrations(\%reg); |
1400
|
|
|
|
|
|
|
|
1401
|
72191
|
100
|
|
|
|
891047
|
return $source if $params->{extra}; |
1402
|
|
|
|
|
|
|
|
1403
|
33542
|
|
|
|
|
584103
|
my $rs_class = $source->result_class; |
1404
|
33542
|
100
|
66
|
33540
|
|
172535
|
if ($rs_class and my $rsrc = try { $rs_class->result_source_instance } ) { |
|
33540
|
|
|
|
|
1469705
|
|
1405
|
33540
|
|
|
|
|
1034249
|
my %map = %{$self->class_mappings}; |
|
33540
|
|
|
|
|
625134
|
|
1406
|
33540
|
100
|
100
|
|
|
1111009
|
if ( |
|
|
|
100
|
|
|
|
|
1407
|
|
|
|
|
|
|
exists $map{$rs_class} |
1408
|
|
|
|
|
|
|
and |
1409
|
|
|
|
|
|
|
$map{$rs_class} ne $source_name |
1410
|
|
|
|
|
|
|
and |
1411
|
|
|
|
|
|
|
$rsrc ne $_[2] # orig_source |
1412
|
|
|
|
|
|
|
) { |
1413
|
1
|
|
|
|
|
11
|
carp |
1414
|
|
|
|
|
|
|
"$rs_class already had a registered source which was replaced by this call. " |
1415
|
|
|
|
|
|
|
. 'Perhaps you wanted register_extra_source(), though it is more likely you did ' |
1416
|
|
|
|
|
|
|
. 'something wrong.' |
1417
|
|
|
|
|
|
|
; |
1418
|
|
|
|
|
|
|
} |
1419
|
|
|
|
|
|
|
|
1420
|
33540
|
|
|
|
|
61940
|
$map{$rs_class} = $source_name; |
1421
|
33540
|
|
|
|
|
638275
|
$self->class_mappings(\%map); |
1422
|
|
|
|
|
|
|
} |
1423
|
|
|
|
|
|
|
|
1424
|
33542
|
|
|
|
|
544720
|
return $source; |
1425
|
|
|
|
|
|
|
} |
1426
|
|
|
|
|
|
|
|
1427
|
|
|
|
|
|
|
my $global_phase_destroy; |
1428
|
|
|
|
|
|
|
sub DESTROY { |
1429
|
|
|
|
|
|
|
### NO detected_reinvoked_destructor check |
1430
|
|
|
|
|
|
|
### This code very much relies on being called multuple times |
1431
|
|
|
|
|
|
|
|
1432
|
856
|
50
|
33
|
856
|
|
379005681
|
return if $global_phase_destroy ||= in_global_destruction; |
1433
|
|
|
|
|
|
|
|
1434
|
856
|
|
|
|
|
7933
|
my $self = shift; |
1435
|
856
|
|
|
|
|
18041
|
my $srcs = $self->source_registrations; |
1436
|
|
|
|
|
|
|
|
1437
|
856
|
|
|
|
|
24269
|
for my $source_name (keys %$srcs) { |
1438
|
|
|
|
|
|
|
# find first source that is not about to be GCed (someone other than $self |
1439
|
|
|
|
|
|
|
# holds a reference to it) and reattach to it, weakening our own link |
1440
|
|
|
|
|
|
|
# |
1441
|
|
|
|
|
|
|
# during global destruction (if we have not yet bailed out) this should throw |
1442
|
|
|
|
|
|
|
# which will serve as a signal to not try doing anything else |
1443
|
|
|
|
|
|
|
# however beware - on older perls the exception seems randomly untrappable |
1444
|
|
|
|
|
|
|
# due to some weird race condition during thread joining :((( |
1445
|
39008
|
100
|
66
|
|
|
97199
|
if (length ref $srcs->{$source_name} and refcount($srcs->{$source_name}) > 1) { |
1446
|
15
|
|
|
|
|
25
|
local $@; |
1447
|
|
|
|
|
|
|
eval { |
1448
|
15
|
|
|
|
|
63
|
$srcs->{$source_name}->schema($self); |
1449
|
15
|
|
|
|
|
48
|
weaken $srcs->{$source_name}; |
1450
|
15
|
|
|
|
|
46
|
1; |
1451
|
15
|
50
|
|
|
|
26
|
} or do { |
1452
|
0
|
|
|
|
|
0
|
$global_phase_destroy = 1; |
1453
|
|
|
|
|
|
|
}; |
1454
|
|
|
|
|
|
|
|
1455
|
15
|
|
|
|
|
121
|
last; |
1456
|
|
|
|
|
|
|
} |
1457
|
|
|
|
|
|
|
} |
1458
|
|
|
|
|
|
|
} |
1459
|
|
|
|
|
|
|
|
1460
|
|
|
|
|
|
|
sub _unregister_source { |
1461
|
2
|
|
|
2
|
|
22
|
my ($self, $source_name) = @_; |
1462
|
2
|
|
|
|
|
5
|
my %reg = %{$self->source_registrations}; |
|
2
|
|
|
|
|
71
|
|
1463
|
|
|
|
|
|
|
|
1464
|
2
|
|
|
|
|
123
|
my $source = delete $reg{$source_name}; |
1465
|
2
|
|
|
|
|
55
|
$self->source_registrations(\%reg); |
1466
|
2
|
50
|
|
|
|
87
|
if ($source->result_class) { |
1467
|
2
|
|
|
|
|
5
|
my %map = %{$self->class_mappings}; |
|
2
|
|
|
|
|
59
|
|
1468
|
2
|
|
|
|
|
201
|
delete $map{$source->result_class}; |
1469
|
2
|
|
|
|
|
50
|
$self->class_mappings(\%map); |
1470
|
|
|
|
|
|
|
} |
1471
|
|
|
|
|
|
|
} |
1472
|
|
|
|
|
|
|
|
1473
|
|
|
|
|
|
|
|
1474
|
|
|
|
|
|
|
=head2 compose_connection (DEPRECATED) |
1475
|
|
|
|
|
|
|
|
1476
|
|
|
|
|
|
|
=over 4 |
1477
|
|
|
|
|
|
|
|
1478
|
|
|
|
|
|
|
=item Arguments: $target_namespace, @db_info |
1479
|
|
|
|
|
|
|
|
1480
|
|
|
|
|
|
|
=item Return Value: $new_schema |
1481
|
|
|
|
|
|
|
|
1482
|
|
|
|
|
|
|
=back |
1483
|
|
|
|
|
|
|
|
1484
|
|
|
|
|
|
|
DEPRECATED. You probably wanted compose_namespace. |
1485
|
|
|
|
|
|
|
|
1486
|
|
|
|
|
|
|
Actually, you probably just wanted to call connect. |
1487
|
|
|
|
|
|
|
|
1488
|
|
|
|
|
|
|
=begin hidden |
1489
|
|
|
|
|
|
|
|
1490
|
|
|
|
|
|
|
(hidden due to deprecation) |
1491
|
|
|
|
|
|
|
|
1492
|
|
|
|
|
|
|
Calls L to the target namespace, |
1493
|
|
|
|
|
|
|
calls L with @db_info on the new schema, |
1494
|
|
|
|
|
|
|
then injects the L component and a |
1495
|
|
|
|
|
|
|
resultset_instance classdata entry on all the new classes, in order to support |
1496
|
|
|
|
|
|
|
$target_namespaces::$class->search(...) method calls. |
1497
|
|
|
|
|
|
|
|
1498
|
|
|
|
|
|
|
This is primarily useful when you have a specific need for class method access |
1499
|
|
|
|
|
|
|
to a connection. In normal usage it is preferred to call |
1500
|
|
|
|
|
|
|
L and use the resulting schema object to operate |
1501
|
|
|
|
|
|
|
on L objects with L for |
1502
|
|
|
|
|
|
|
more information. |
1503
|
|
|
|
|
|
|
|
1504
|
|
|
|
|
|
|
=end hidden |
1505
|
|
|
|
|
|
|
|
1506
|
|
|
|
|
|
|
=cut |
1507
|
|
|
|
|
|
|
|
1508
|
|
|
|
|
|
|
sub compose_connection { |
1509
|
1
|
|
|
1
|
1
|
185
|
my ($self, $target, @info) = @_; |
1510
|
|
|
|
|
|
|
|
1511
|
|
|
|
|
|
|
carp_once "compose_connection deprecated as of 0.08000" |
1512
|
1
|
50
|
|
|
|
11
|
unless $INC{"DBIx/Class/CDBICompat.pm"}; |
1513
|
|
|
|
|
|
|
|
1514
|
1
|
|
|
|
|
93
|
my $base = 'DBIx::Class::ResultSetProxy'; |
1515
|
|
|
|
|
|
|
try { |
1516
|
1
|
|
|
1
|
|
142
|
eval "require ${base};" |
1517
|
|
|
|
|
|
|
} |
1518
|
|
|
|
|
|
|
catch { |
1519
|
0
|
|
|
0
|
|
0
|
$self->throw_exception |
1520
|
|
|
|
|
|
|
("No arguments to load_classes and couldn't load ${base} ($_)") |
1521
|
1
|
|
|
|
|
12
|
}; |
1522
|
|
|
|
|
|
|
|
1523
|
1
|
50
|
|
|
|
22
|
if ($self eq $target) { |
1524
|
|
|
|
|
|
|
# Pathological case, largely caused by the docs on early C::M::DBIC::Plain |
1525
|
0
|
|
|
|
|
0
|
foreach my $source_name ($self->sources) { |
1526
|
0
|
|
|
|
|
0
|
my $source = $self->source($source_name); |
1527
|
0
|
|
|
|
|
0
|
my $class = $source->result_class; |
1528
|
0
|
|
|
|
|
0
|
$self->inject_base($class, $base); |
1529
|
0
|
|
|
|
|
0
|
$class->mk_classdata(resultset_instance => $source->resultset); |
1530
|
0
|
|
|
|
|
0
|
$class->mk_classdata(class_resolver => $self); |
1531
|
|
|
|
|
|
|
} |
1532
|
0
|
|
|
|
|
0
|
$self->connection(@info); |
1533
|
0
|
|
|
|
|
0
|
return $self; |
1534
|
|
|
|
|
|
|
} |
1535
|
|
|
|
|
|
|
|
1536
|
1
|
|
|
|
|
11
|
my $schema = $self->compose_namespace($target, $base); |
1537
|
1
|
|
|
|
|
7
|
quote_sub "${target}::schema", '$s', { '$s' => \$schema }; |
1538
|
|
|
|
|
|
|
|
1539
|
1
|
|
|
|
|
84
|
$schema->connection(@info); |
1540
|
1
|
|
|
|
|
218
|
foreach my $source_name ($schema->sources) { |
1541
|
46
|
|
|
|
|
351
|
my $source = $schema->source($source_name); |
1542
|
46
|
|
|
|
|
722
|
my $class = $source->result_class; |
1543
|
|
|
|
|
|
|
#warn "$source_name $class $source ".$source->storage; |
1544
|
46
|
|
|
|
|
717
|
$class->mk_classdata(result_source_instance => $source); |
1545
|
46
|
|
|
|
|
325
|
$class->mk_classdata(resultset_instance => $source->resultset); |
1546
|
46
|
|
|
|
|
470
|
$class->mk_classdata(class_resolver => $schema); |
1547
|
|
|
|
|
|
|
} |
1548
|
1
|
|
|
|
|
15
|
return $schema; |
1549
|
|
|
|
|
|
|
} |
1550
|
|
|
|
|
|
|
|
1551
|
|
|
|
|
|
|
=head1 FURTHER QUESTIONS? |
1552
|
|
|
|
|
|
|
|
1553
|
|
|
|
|
|
|
Check the list of L. |
1554
|
|
|
|
|
|
|
|
1555
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
1556
|
|
|
|
|
|
|
|
1557
|
|
|
|
|
|
|
This module is free software L |
1558
|
|
|
|
|
|
|
by the L. You can |
1559
|
|
|
|
|
|
|
redistribute it and/or modify it under the same terms as the |
1560
|
|
|
|
|
|
|
L. |
1561
|
|
|
|
|
|
|
|
1562
|
|
|
|
|
|
|
=cut |
1563
|
|
|
|
|
|
|
|
1564
|
|
|
|
|
|
|
1; |