← Index
NYTProf Performance Profile   « line view »
For starman worker -M FindBin --max-requests 50 --workers 2 --user=kohadev-koha --group kohadev-koha --pid /var/run/koha/kohadev/plack.pid --daemonize --access-log /var/log/koha/kohadev/plack.log --error-log /var/log/koha/kohadev/plack-error.log -E deployment --socket /var/run/koha/kohadev/plack.sock /etc/koha/sites/kohadev/plack.psgi
  Run on Fri Jan 8 13:01:18 2016
Reported on Fri Jan 8 13:01:34 2016

Filename/usr/share/perl5/DBIx/Class/Schema.pm
StatementsExecuted 9180 statements in 53.5ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
3482127.8ms52.5msDBIx::Class::Schema::::_register_sourceDBIx::Class::Schema::_register_source
174114.99ms42.2msDBIx::Class::Schema::::register_classDBIx::Class::Schema::register_class
1114.44ms1.31sDBIx::Class::Schema::::load_namespacesDBIx::Class::Schema::load_namespaces
348212.34ms12.0msDBIx::Class::Schema::::_ns_get_rsrc_instanceDBIx::Class::Schema::_ns_get_rsrc_instance
1112.25ms26.2msDBIx::Class::Schema::::_copy_state_fromDBIx::Class::Schema::_copy_state_from
2112.21ms72.9msDBIx::Class::Schema::::_findallmodDBIx::Class::Schema::_findallmod
177211.06ms2.15msDBIx::Class::Schema::::sourceDBIx::Class::Schema::source
17411517µs17.8msDBIx::Class::Schema::::register_extra_sourceDBIx::Class::Schema::register_extra_source
17411469µs35.7msDBIx::Class::Schema::::register_sourceDBIx::Class::Schema::register_source
221300µs508µsDBIx::Class::Schema::::CORE:sortDBIx::Class::Schema::CORE:sort (opcode)
111150µs191µsDBIx::Class::Schema::::BEGIN@1272DBIx::Class::Schema::BEGIN@1272
17411149µs149µsDBIx::Class::Schema::::CORE:matchDBIx::Class::Schema::CORE:match (opcode)
221135µs73.0msDBIx::Class::Schema::::_map_namespacesDBIx::Class::Schema::_map_namespaces
11153µs61.5msDBIx::Class::Schema::::connectionDBIx::Class::Schema::connection
11145µs62µsDBIx::Class::Schema::::BEGIN@12DBIx::Class::Schema::BEGIN@12
11139µs372µsDBIx::Class::Schema::::BEGIN@13DBIx::Class::Schema::BEGIN@13
11132µs99µsDBIx::Class::Schema::::BEGIN@9DBIx::Class::Schema::BEGIN@9
11129µs50µsDBIx::Class::Schema::::BEGIN@235DBIx::Class::Schema::BEGIN@235
11128µs26.3msDBIx::Class::Schema::::cloneDBIx::Class::Schema::clone
11124µs51µsDBIx::Class::Schema::::BEGIN@896DBIx::Class::Schema::BEGIN@896
11123µs51µsDBIx::Class::Schema::::BEGIN@233DBIx::Class::Schema::BEGIN@233
11122µs44µsDBIx::Class::Schema::::BEGIN@373DBIx::Class::Schema::BEGIN@373
11120µs37µsDBIx::Class::Schema::::BEGIN@898DBIx::Class::Schema::BEGIN@898
21118µs21µsDBIx::Class::Schema::::_expand_relative_nameDBIx::Class::Schema::_expand_relative_name
11117µs129µsDBIx::Class::Schema::::sourcesDBIx::Class::Schema::sources
11117µs32µsDBIx::Class::Schema::::BEGIN@375DBIx::Class::Schema::BEGIN@375
11116µs89µsDBIx::Class::Schema::::BEGIN@8DBIx::Class::Schema::BEGIN@8
11116µs54µsDBIx::Class::Schema::::BEGIN@10DBIx::Class::Schema::BEGIN@10
11115µs70µsDBIx::Class::Schema::::BEGIN@11DBIx::Class::Schema::BEGIN@11
11114µs50.4msDBIx::Class::Schema::::BEGIN@6DBIx::Class::Schema::BEGIN@6
32110µs10µsDBIx::Class::Schema::::CORE:substDBIx::Class::Schema::CORE:subst (opcode)
111100ns100nsDBIx::Class::Schema::::BEGIN@3DBIx::Class::Schema::BEGIN@3
111100ns100nsDBIx::Class::Schema::::BEGIN@4DBIx::Class::Schema::BEGIN@4
0000s0sDBIx::Class::Schema::::DESTROYDBIx::Class::Schema::DESTROY
0000s0sDBIx::Class::Schema::::__ANON__[:1366]DBIx::Class::Schema::__ANON__[:1366]
0000s0sDBIx::Class::Schema::::__ANON__[:1476]DBIx::Class::Schema::__ANON__[:1476]
0000s0sDBIx::Class::Schema::::__ANON__[:1480]DBIx::Class::Schema::__ANON__[:1480]
0000s0sDBIx::Class::Schema::::__ANON__[:196]DBIx::Class::Schema::__ANON__[:196]
0000s0sDBIx::Class::Schema::::__ANON__[:200]DBIx::Class::Schema::__ANON__[:200]
0000s0sDBIx::Class::Schema::::__ANON__[:234]DBIx::Class::Schema::__ANON__[:234]
0000s0sDBIx::Class::Schema::::__ANON__[:374]DBIx::Class::Schema::__ANON__[:374]
0000s0sDBIx::Class::Schema::::__ANON__[:808]DBIx::Class::Schema::__ANON__[:808]
0000s0sDBIx::Class::Schema::::__ANON__[:813]DBIx::Class::Schema::__ANON__[:813]
0000s0sDBIx::Class::Schema::::__ANON__[:897]DBIx::Class::Schema::__ANON__[:897]
0000s0sDBIx::Class::Schema::::_normalize_storage_typeDBIx::Class::Schema::_normalize_storage_type
0000s0sDBIx::Class::Schema::::_unregister_sourceDBIx::Class::Schema::_unregister_source
0000s0sDBIx::Class::Schema::::catch {...} DBIx::Class::Schema::catch {...}
0000s0sDBIx::Class::Schema::::classDBIx::Class::Schema::class
0000s0sDBIx::Class::Schema::::compose_connectionDBIx::Class::Schema::compose_connection
0000s0sDBIx::Class::Schema::::compose_namespaceDBIx::Class::Schema::compose_namespace
0000s0sDBIx::Class::Schema::::connectDBIx::Class::Schema::connect
0000s0sDBIx::Class::Schema::::create_ddl_dirDBIx::Class::Schema::create_ddl_dir
0000s0sDBIx::Class::Schema::::dcloneDBIx::Class::Schema::dclone
0000s0sDBIx::Class::Schema::::ddl_filenameDBIx::Class::Schema::ddl_filename
0000s0sDBIx::Class::Schema::::deployDBIx::Class::Schema::deploy
0000s0sDBIx::Class::Schema::::deployment_statementsDBIx::Class::Schema::deployment_statements
0000s0sDBIx::Class::Schema::::freezeDBIx::Class::Schema::freeze
0000s0sDBIx::Class::Schema::::load_classesDBIx::Class::Schema::load_classes
0000s0sDBIx::Class::Schema::::populateDBIx::Class::Schema::populate
0000s0sDBIx::Class::Schema::::resultsetDBIx::Class::Schema::resultset
0000s0sDBIx::Class::Schema::::schema_versionDBIx::Class::Schema::schema_version
0000s0sDBIx::Class::Schema::::setup_connection_classDBIx::Class::Schema::setup_connection_class
0000s0sDBIx::Class::Schema::::svp_beginDBIx::Class::Schema::svp_begin
0000s0sDBIx::Class::Schema::::svp_releaseDBIx::Class::Schema::svp_release
0000s0sDBIx::Class::Schema::::svp_rollbackDBIx::Class::Schema::svp_rollback
0000s0sDBIx::Class::Schema::::thawDBIx::Class::Schema::thaw
0000s0sDBIx::Class::Schema::::throw_exceptionDBIx::Class::Schema::throw_exception
0000s0sDBIx::Class::Schema::::try {...} DBIx::Class::Schema::try {...}
0000s0sDBIx::Class::Schema::::txn_beginDBIx::Class::Schema::txn_begin
0000s0sDBIx::Class::Schema::::txn_commitDBIx::Class::Schema::txn_commit
0000s0sDBIx::Class::Schema::::txn_doDBIx::Class::Schema::txn_do
0000s0sDBIx::Class::Schema::::txn_rollbackDBIx::Class::Schema::txn_rollback
0000s0sDBIx::Class::Schema::::txn_scope_guardDBIx::Class::Schema::txn_scope_guard
0000s0sDBIx::Class::Schema::::unregister_sourceDBIx::Class::Schema::unregister_source
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package DBIx::Class::Schema;
2
32100ns2100ns
# spent 100ns within DBIx::Class::Schema::BEGIN@3 which was called: # once (100ns+0s) by base::import at line 3
use strict;
# spent 100ns making 1 call to DBIx::Class::Schema::BEGIN@3 # spent 0s making 1 call to strict::import
42300ns2100ns
# spent 100ns within DBIx::Class::Schema::BEGIN@4 which was called: # once (100ns+0s) by base::import at line 4
use warnings;
# spent 100ns making 1 call to DBIx::Class::Schema::BEGIN@4 # spent 0s making 1 call to warnings::import
5
62175µs250.4ms
# spent 50.4ms (14µs+50.4) within DBIx::Class::Schema::BEGIN@6 which was called: # once (14µs+50.4ms) by base::import at line 6
use base 'DBIx::Class';
# spent 50.4ms making 1 call to DBIx::Class::Schema::BEGIN@6 # spent 50.4ms making 1 call to base::import, recursion: max depth 1, sum of overlapping time 50.4ms
7
8244µs2162µs
# spent 89µs (16+73) within DBIx::Class::Schema::BEGIN@8 which was called: # once (16µs+73µs) by base::import at line 8
use DBIx::Class::Carp;
# spent 89µs making 1 call to DBIx::Class::Schema::BEGIN@8 # spent 73µs making 1 call to DBIx::Class::Carp::import
92145µs2166µs
# spent 99µs (32+67) within DBIx::Class::Schema::BEGIN@9 which was called: # once (32µs+67µs) by base::import at line 9
use Try::Tiny;
# spent 99µs making 1 call to DBIx::Class::Schema::BEGIN@9 # spent 67µs making 1 call to Exporter::import
10294µs292µs
# spent 54µs (16+38) within DBIx::Class::Schema::BEGIN@10 which was called: # once (16µs+38µs) by base::import at line 10
use Scalar::Util qw/weaken blessed/;
# spent 54µs making 1 call to DBIx::Class::Schema::BEGIN@10 # spent 38µs making 1 call to Exporter::import
112107µs2125µs
# spent 70µs (15+55) within DBIx::Class::Schema::BEGIN@11 which was called: # once (15µs+55µs) by base::import at line 11
use DBIx::Class::_Util qw(refcount quote_sub);
# spent 70µs making 1 call to DBIx::Class::Schema::BEGIN@11 # spent 55µs making 1 call to Exporter::import
12299µs280µs
# spent 62µs (45+18) within DBIx::Class::Schema::BEGIN@12 which was called: # once (45µs+18µs) by base::import at line 12
use Devel::GlobalDestruction;
# spent 62µs making 1 call to DBIx::Class::Schema::BEGIN@12 # spent 18µs making 1 call to Sub::Exporter::Progressive::__ANON__
1321.27ms2705µs
# spent 372µs (39+333) within DBIx::Class::Schema::BEGIN@13 which was called: # once (39µs+333µs) by base::import at line 13
use namespace::clean;
# spent 372µs making 1 call to DBIx::Class::Schema::BEGIN@13 # spent 333µs making 1 call to namespace::clean::import
14
15111µs1659µs__PACKAGE__->mk_classdata('class_mappings' => {});
# spent 659µs making 1 call to DBIx::Class::mk_classdata
1615µs1457µs__PACKAGE__->mk_classdata('source_registrations' => {});
# spent 457µs making 1 call to DBIx::Class::mk_classdata
1713µs1421µs__PACKAGE__->mk_classdata('storage_type' => '::DBI');
# spent 421µs making 1 call to DBIx::Class::mk_classdata
1814µs1393µs__PACKAGE__->mk_classdata('storage');
# spent 393µs making 1 call to DBIx::Class::mk_classdata
1914µs1405µs__PACKAGE__->mk_classdata('exception_action');
# spent 405µs making 1 call to DBIx::Class::mk_classdata
2015µs1399µs__PACKAGE__->mk_classdata('stacktrace' => $ENV{DBIC_TRACE} || 0);
# spent 399µs making 1 call to DBIx::Class::mk_classdata
2114µs1405µs__PACKAGE__->mk_classdata('default_resultset_attributes' => {});
# spent 405µs making 1 call to DBIx::Class::mk_classdata
22
23=head1 NAME
24
25DBIx::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
57Creates database classes based on a schema. This is the recommended way to
58use L<DBIx::Class> and allows you to use more than one concurrent connection
59with your classes.
60
61NB: If you're used to L<Class::DBI> it's worth reading the L</SYNOPSIS>
62carefully, as DBIx::Class does things a little differently. Note in
63particular 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
84With no arguments, this method uses L<Module::Find> to load all of the
85Result and ResultSet classes under the namespace of the schema from
86which it is called. For example, C<My::Schema> will by default find
87and load Result classes named C<My::Schema::Result::*> and ResultSet
88classes named C<My::Schema::ResultSet::*>.
89
90ResultSet classes are associated with Result class of the same name.
91For example, C<My::Schema::Result::CD> will get the ResultSet class
92C<My::Schema::ResultSet::CD> if it is present.
93
94Both Result and ResultSet namespaces are configurable via the
95C<result_namespace> and C<resultset_namespace> options.
96
97Another option, C<default_resultset_class> specifies a custom default
98ResultSet class for Result classes with no corresponding ResultSet.
99
100All of the namespace and classname options are by default relative to
101the schema classname. To specify a fully-qualified name, prefix it
102with a literal C<+>. For example, C<+Other::NameSpace::Result>.
103
104=head3 Warnings
105
106You will be warned if ResultSet classes are discovered for which there
107are no matching Result classes like this:
108
109 load_namespaces found ResultSet class $classname with no corresponding Result class
110
111If a ResultSource instance is found to already have a ResultSet class set
112using L<resultset_class|DBIx::Class::ResultSource/resultset_class> to some
113other 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
140To search multiple namespaces for either Result or ResultSet classes,
141use an arrayref of namespaces for that option. In the case that the
142same result (or resultset) class exists in multiple namespaces, later
143entries 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
# spent 21µs (18+3) within DBIx::Class::Schema::_expand_relative_name which was called 2 times, avg 11µs/call: # 2 times (18µs+3µs) by DBIx::Class::Schema::load_namespaces at line 225, avg 11µs/call
sub _expand_relative_name {
15721µs my ($class, $name) = @_;
158216µs23µs $name =~ s/^\+// or $name = "${class}::${name}";
# spent 3µs making 2 calls to DBIx::Class::Schema::CORE:subst, avg 1µs/call
15928µs 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
# spent 72.9ms (2.21+70.7) within DBIx::Class::Schema::_findallmod which was called 2 times, avg 36.4ms/call: # 2 times (2.21ms+70.7ms) by DBIx::Class::Schema::_map_namespaces at line 182, avg 36.4ms/call
sub _findallmod {
1662193µs require Module::Find;
167174505µs174149µs return map
# spent 149µs making 174 calls to DBIx::Class::Schema::CORE:match, avg 856ns/call
1682128µs270.3ms { $_ =~ /(.+)/ } # untaint result
# spent 70.3ms making 2 calls to Module::Find::findallmod, avg 35.2ms/call
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
# spent 73.0ms (135µs+72.9) within DBIx::Class::Schema::_map_namespaces which was called 2 times, avg 36.5ms/call: # once (127µs+72.7ms) by DBIx::Class::Schema::load_namespaces at line 228 # once (8µs+137µs) by DBIx::Class::Schema::load_namespaces at line 229
sub _map_namespaces {
17722µs my ($me, $namespaces) = @_;
178
1792500ns my %res;
18023µs for my $ns (@$namespaces) {
181 $res{ substr($_, length "${ns}::") } = $_
1822120µs272.9ms for $me->_findallmod($ns);
# spent 72.9ms making 2 calls to DBIx::Class::Schema::_findallmod, avg 36.4ms/call
183 }
184
185210µs \%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
# spent 12.0ms (2.34+9.66) within DBIx::Class::Schema::_ns_get_rsrc_instance which was called 348 times, avg 34µs/call: # 174 times (1.15ms+5.90ms) by DBIx::Class::Schema::load_namespaces at line 259, avg 40µs/call # 174 times (1.19ms+3.77ms) by DBIx::Class::Schema::load_namespaces at line 279, avg 28µs/call
sub _ns_get_rsrc_instance {
19134867µs my $me = shift;
19234885µs my $rs_class = ref ($_[0]) || $_[0];
193
194 return try {
195348763µs3484.09ms $rs_class->result_source_instance
# spent 88µs making 2 calls to Koha::Schema::Result::Virtualshelfshare::result_source_instance, avg 44µs/call # spent 51µs making 2 calls to Koha::Schema::Result::PatronList::result_source_instance, avg 26µs/call # spent 45µs making 2 calls to Koha::Schema::Result::Biblioitem::result_source_instance, avg 22µs/call # spent 45µs making 2 calls to Koha::Schema::Result::ClassSource::result_source_instance, avg 22µs/call # spent 44µs making 2 calls to Koha::Schema::Result::LanguageSubtagRegistry::result_source_instance, avg 22µs/call # spent 42µs making 2 calls to Koha::Schema::Result::PendingOfflineOperation::result_source_instance, avg 21µs/call # spent 41µs making 2 calls to Koha::Schema::Result::DefaultBranchItemRule::result_source_instance, avg 20µs/call # spent 39µs making 2 calls to Koha::Schema::Result::City::result_source_instance, avg 20µs/call # spent 39µs making 2 calls to Koha::Schema::Result::MarcMatcher::result_source_instance, avg 20µs/call # spent 33µs making 2 calls to Koha::Schema::Result::CollectionsTracking::result_source_instance, avg 17µs/call # spent 33µs making 2 calls to Koha::Schema::Result::MarcModificationTemplateAction::result_source_instance, avg 17µs/call # spent 33µs making 2 calls to Koha::Schema::Result::TransportCost::result_source_instance, avg 16µs/call # spent 33µs making 2 calls to Koha::Schema::Result::LanguageDescription::result_source_instance, avg 16µs/call # spent 33µs making 2 calls to Koha::Schema::Result::Subscription::result_source_instance, avg 16µs/call # spent 32µs making 2 calls to Koha::Schema::Result::PatronListPatron::result_source_instance, avg 16µs/call # spent 32µs making 2 calls to Koha::Schema::Result::Tag::result_source_instance, avg 16µs/call # spent 32µs making 2 calls to Koha::Schema::Result::Aqcontract::result_source_instance, avg 16µs/call # spent 32µs making 2 calls to Koha::Schema::Result::OldIssue::result_source_instance, avg 16µs/call # spent 32µs making 2 calls to Koha::Schema::Result::BorrowerModification::result_source_instance, avg 16µs/call # spent 31µs making 2 calls to Koha::Schema::Result::PluginData::result_source_instance, avg 16µs/call # spent 30µs making 2 calls to Koha::Schema::Result::UserPermission::result_source_instance, avg 15µs/call # spent 30µs making 2 calls to Koha::Schema::Result::Deleteditem::result_source_instance, avg 15µs/call # spent 30µs making 2 calls to Koha::Schema::Result::OaiSet::result_source_instance, avg 15µs/call # spent 28µs making 2 calls to Koha::Schema::Result::SavedSql::result_source_instance, avg 14µs/call # spent 27µs making 2 calls to Koha::Schema::Result::Item::result_source_instance, avg 14µs/call # spent 26µs making 2 calls to Koha::Schema::Result::CreatorLayout::result_source_instance, avg 13µs/call # spent 26µs making 2 calls to Koha::Schema::Result::ItemCirculationAlertPreference::result_source_instance, avg 13µs/call # spent 24µs making 2 calls to Koha::Schema::Result::OverduerulesTransportType::result_source_instance, avg 12µs/call # spent 24µs making 2 calls to Koha::Schema::Result::Suggestion::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Virtualshelfcontent::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Accountoffset::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::ImportRecord::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Aqinvoice::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::UploadedFile::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Localization::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::SavedReport::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Systempreference::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::SubscriptionFrequency::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::BorrowerMessagePreference::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Aqorder::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::RepeatableHoliday::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::MessageAttribute::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Statistic::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Accountline::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Aqbookseller::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::MessageTransportType::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::BorrowerAttributeType::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::BranchTransferLimit::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Message::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ActionLogs::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::BorrowerMessageTransportPreference::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::CreatorTemplate::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::NeedMergeAuthority::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Quote::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Subscriptionhistory::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AqordersItem::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::BranchItemRule::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Deletedborrower::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::MarcModificationTemplate::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Z3950server::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AdditionalField::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AuthSubfieldStructure::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Subscriptionroutinglist::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::TmpHoldsqueue::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Zebraqueue::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ActionLog::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::BranchBorrowerCircRule::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Deletedbiblioitem::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Issue::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Patronimage::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ReportsDictionary::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::SocialData::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ExportFormat::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Fieldmapping::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ItemsLastBorrower::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::LanguageScriptBidi::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Matchpoint::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::OpacNews::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Reserve::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AqorderUser::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AuthTagStructure::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::BiblioFramework::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Biblioimage::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::BorrowerAttributeTypesBranch::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::BorrowerDebarment::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::BorrowerSync::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::CourseReserve::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::DefaultBranchCircRule::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::DefaultCircRule::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Serial::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbasket::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbudgetborrower::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AuthorisedValuesBranch::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::BorrowerAttribute::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ClassSortRule::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Letter::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MarcTagStructure::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MatcherMatchpoint::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::SpecialHoliday::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ImportBiblio::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Review::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Virtualshelve::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbasketgroup::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqcontact::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AqordersTransfer::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AuthorisedValue::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Branchcategory::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Course::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Currency::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Deletedbiblio::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::LanguageRfc4646ToIso639::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::OaiSetsBiblio::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::PrintersProfile::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbudgetperiod::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Branchtransfer::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ColumnsSetting::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Itemtype::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Matchcheck::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Permission::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AuthType::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Borrower::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::DefaultBorrowerCircRule::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::HoldFillTarget::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::OldReserve::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbasketuser::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbudget::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Branch::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Discharge::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Stopword::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::SubscriptionNumberpattern::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::TagsIndex::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Biblio::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ImportBatch::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ImportRecordMatch::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Issuingrule::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ItemsSearchField::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MatchpointComponent::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MessageQueue::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AqbudgetsPlanning::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AudioAlert::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Category::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MarcSubfieldStructure::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::OaiSetsMapping::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::AdditionalFieldValue::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::CourseItem::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::CreatorBatch::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::CreatorImage::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::ImportAuth::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::BorrowerFile::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::LanguageScriptMapping::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::MiscFile::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Notify::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Rating::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Branchrelation::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Overduerule::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Userflag::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::MessageTransport::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::OaiSetsDescription::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::SearchHistory::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Browser::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::CourseInstructor::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Alert::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::AuthHeader::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Collection::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::CategoriesBranch::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Session::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::TagsApproval::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::MatchpointComponentNorm::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::TagAll::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Printer::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::ServicesThrottle::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::ImportItem::result_source_instance, avg 10µs/call # spent 15µs making 2 calls to Koha::Schema::Result::Linktracker::result_source_instance, avg 8µs/call # spent 6µs making 2 calls to Koha::Schema::Result::Serialitem::result_source_instance, avg 3µs/call
196 } catch {
197 $me->throw_exception (
198 "Attempt to load_namespaces() class $rs_class failed - are you sure this is a real Result Class?: $_"
199 );
2003485.00ms6969.66ms };
# spent 9.04ms making 348 calls to Try::Tiny::try, avg 26µs/call # spent 618µs making 348 calls to Try::Tiny::catch, avg 2µs/call
201}
202
203
# spent 1.31s (4.44ms+1.31) within DBIx::Class::Schema::load_namespaces which was called: # once (4.44ms+1.31s) by Koha::Objects::find at line 12 of Koha/Schema.pm
sub load_namespaces {
20412µs my ($class, %args) = @_;
205
20611µs my $result_namespace = delete $args{result_namespace} || 'Result';
2071700ns my $resultset_namespace = delete $args{resultset_namespace} || 'ResultSet';
208
2091400ns my $default_resultset_class = delete $args{default_resultset_class};
210
2111300ns $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): '
21511µs . join(q{,}, map { qq{'$_'} } keys %args))
216 if scalar keys %args;
217
21812µs for my $arg ($result_namespace, $resultset_namespace) {
21923µs $arg = [ $arg ] if ( $arg and ! ref $arg );
220
22122µs $class->throw_exception('load_namespaces: namespace arguments must be '
222 . 'a simple string or an arrayref')
223 if ref($arg) ne 'ARRAY';
224
225212µs221µs $_ = $class->_expand_relative_name($_) for (@$arg);
# spent 21µs making 2 calls to DBIx::Class::Schema::_expand_relative_name, avg 11µs/call
226 }
227
22817µs172.9ms my $results_by_source_name = $class->_map_namespaces($result_namespace);
# spent 72.9ms making 1 call to DBIx::Class::Schema::_map_namespaces
22917µs1145µs my $resultsets_by_source_name = $class->_map_namespaces($resultset_namespace);
# spent 145µs making 1 call to DBIx::Class::Schema::_map_namespaces
230
2311400ns my @to_register;
232 {
2333136µs279µs
# spent 51µs (23+28) within DBIx::Class::Schema::BEGIN@233 which was called: # once (23µs+28µs) by base::import at line 233
no warnings qw/redefine/;
# spent 51µs making 1 call to DBIx::Class::Schema::BEGIN@233 # spent 28µs making 1 call to warnings::unimport
234 local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
2352890µs272µs
# spent 50µs (29+22) within DBIx::Class::Schema::BEGIN@235 which was called: # once (29µs+22µs) by base::import at line 235
use warnings qw/redefine/;
# spent 50µs making 1 call to DBIx::Class::Schema::BEGIN@235 # spent 22µs making 1 call to warnings::import
236
237 # ensure classes are loaded and attached in inheritance order
238110µs for my $result_class (values %$results_by_source_name) {
2391741.29ms1741.18s $class->ensure_class_loaded($result_class);
# spent 1.18s making 174 calls to Class::C3::Componentised::ensure_class_loaded, avg 6.78ms/call
240 }
2411300ns my %inh_idx;
242 my @source_names_by_subclass_last = sort {
243
2441568µs175714µs ($inh_idx{$a} ||=
# spent 506µs making 1 call to DBIx::Class::Schema::CORE:sort # spent 208µs making 174 calls to mro::get_linear_isa, avg 1µs/call
245 scalar @{mro::get_linear_isa( $results_by_source_name->{$a} )}
246 )
247
248 <=>
249
250 ($inh_idx{$b} ||=
251 scalar @{mro::get_linear_isa( $results_by_source_name->{$b} )}
252 )
253
254 } keys(%$results_by_source_name);
255
256126µs foreach my $source_name (@source_names_by_subclass_last) {
257174102µs my $result_class = $results_by_source_name->{$source_name};
258
259174842µs3489.31ms my $preset_resultset_class = $class->_ns_get_rsrc_instance ($result_class)->resultset_class;
# spent 7.04ms making 174 calls to DBIx::Class::Schema::_ns_get_rsrc_instance, avg 40µs/call # spent 2.27ms making 174 calls to DBIx::Class::ResultSource::resultset_class, avg 13µs/call
26017456µs my $found_resultset_class = delete $resultsets_by_source_name->{$source_name};
261
26217462µs if($preset_resultset_class && $preset_resultset_class ne 'DBIx::Class::ResultSet') {
263 if($found_resultset_class && $found_resultset_class ne $preset_resultset_class) {
264 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 $class->ensure_class_loaded($found_resultset_class);
272 if(!$found_resultset_class->isa("DBIx::Class::ResultSet")) {
273 carp "load_namespaces found ResultSet class '$found_resultset_class' that does not subclass DBIx::Class::ResultSet";
274 }
275
276 $class->_ns_get_rsrc_instance ($result_class)->resultset_class($found_resultset_class);
277 }
278
279174654µs1765.11ms my $source_name = $class->_ns_get_rsrc_instance ($result_class)->source_name || $source_name;
# spent 4.96ms making 174 calls to DBIx::Class::Schema::_ns_get_rsrc_instance, avg 28µs/call # spent 151µs making 1 call to DBIx::Class::ResultSource::source_name # spent 800ns making 1 call to DBIx::Class::ResultSource::Table::source_name
280
281174256µs push(@to_register, [ $source_name, $result_class ]);
282 }
283 }
284
28518µs12µs foreach (sort keys %$resultsets_by_source_name) {
# spent 2µs making 1 call to DBIx::Class::Schema::CORE:sort
286 carp "load_namespaces found ResultSet class '$resultsets_by_source_name->{$_}' "
287 .'with no corresponding Result class';
288 }
289
290 Class::C3->reinitialize if DBIx::Class::_ENV_::OLD_MRO;
291
2921316µs17442.2ms $class->register_class(@$_) for (@to_register);
# spent 42.2ms making 174 calls to DBIx::Class::Schema::register_class, avg 243µs/call
293
294176µs return;
295}
296
297=head2 load_classes
298
299=over 4
300
301=item Arguments: @classes?, { $namespace => [ @classes ] }+
302
303=back
304
305L</load_classes> is an alternative method to L</load_namespaces>, both of
306which serve similar purposes, each with different advantages and disadvantages.
307In the general case you should use L</load_namespaces>, unless you need to
308be able to specify that only specific classes are loaded at runtime.
309
310With no arguments, this method uses L<Module::Find> to find all classes under
311the schema's namespace. Otherwise, this method loads the classes you specify
312(using L<use>), and registers them (using L</"register_class">).
313
314It is possible to comment out classes with a leading C<#>, but note that perl
315will think it's a mistake (trying to use a comment in a qw list), so you'll
316need to add C<no warnings 'qw';> before your load_classes call.
317
318If any classes found do not appear to be Result class files, you will
319get 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
325Example:
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
338sub load_classes {
339 my ($class, @params) = @_;
340
341 my %comps_for;
342
343 if (@params) {
344 foreach my $param (@params) {
345 if (ref $param eq 'ARRAY') {
346 # filter out commented entries
347 my @modules = grep { $_ !~ /^#/ } @$param;
348
349 push (@{$comps_for{$class}}, @modules);
350 }
351 elsif (ref $param eq 'HASH') {
352 # more than one namespace possible
353 for my $comp ( keys %$param ) {
354 # filter out commented entries
355 my @modules = grep { $_ !~ /^#/ } @{$param->{$comp}};
356
357 push (@{$comps_for{$comp}}, @modules);
358 }
359 }
360 else {
361 # filter out commented entries
362 push (@{$comps_for{$class}}, $param) if $param !~ /^#/;
363 }
364 }
365 } else {
366 my @comp = map { substr $_, length "${class}::" }
367 $class->_findallmod($class);
368 $comps_for{$class} = \@comp;
369 }
370
371 my @to_register;
372 {
3732109µs267µs
# spent 44µs (22+23) within DBIx::Class::Schema::BEGIN@373 which was called: # once (22µs+23µs) by base::import at line 373
no warnings qw/redefine/;
# spent 44µs making 1 call to DBIx::Class::Schema::BEGIN@373 # spent 23µs making 1 call to warnings::unimport
374 local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
37521.49ms248µs
# spent 32µs (17+15) within DBIx::Class::Schema::BEGIN@375 which was called: # once (17µs+15µs) by base::import at line 375
use warnings qw/redefine/;
# spent 32µs making 1 call to DBIx::Class::Schema::BEGIN@375 # spent 16µs making 1 call to warnings::import
376
377 foreach my $prefix (keys %comps_for) {
378 foreach my $comp (@{$comps_for{$prefix}||[]}) {
379 my $comp_class = "${prefix}::${comp}";
380 $class->ensure_class_loaded($comp_class);
381
382 my $snsub = $comp_class->can('source_name');
383 if(! $snsub ) {
384 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 next;
386 }
387 $comp = $snsub->($comp_class) || $comp;
388
389 push(@to_register, [ $comp, $comp_class ]);
390 }
391 }
392 }
393 Class::C3->reinitialize if DBIx::Class::_ENV_::OLD_MRO;
394
395 foreach my $to (@to_register) {
396 $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
412Set the storage class that will be instantiated when L</connect> is called.
413If the classname starts with C<::>, the prefix C<DBIx::Class::Storage> is
414assumed by L</connect>.
415
416You want to use this to set subclasses of L<DBIx::Class::Storage::DBI>
417in cases where the appropriate subclass is not autodetected.
418
419If your storage type requires instantiation arguments, those are
420defined as a second argument in the form of a hashref and the entire
421value needs to be wrapped into an arrayref or a hashref. We support
422both types of refs here in order to play nice with your
423Config::[class] or your choice. See
424L<DBIx::Class::Storage::DBI::Replicated> 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
438When L</throw_exception> is invoked and L</exception_action> is set to a code
439reference, this reference will be called instead of
440L<DBIx::Class::Exception/throw>, with the exception message passed as the only
441argument.
442
443Your custom throw code B<must> rethrow the exception, as L</throw_exception> is
444an integral part of DBIC's internal execution control flow.
445
446Example:
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
466Whether L</throw_exception> should include stack trace information.
467Defaults to false normally, but defaults to true if C<$ENV{DBIC_TRACE}>
468is true.
469
470=head2 sqlt_deploy_hook
471
472=over
473
474=item Arguments: $sqlt_schema
475
476=back
477
478An optional sub which you can declare in your own Schema class that will get
479passed the L<SQL::Translator::Schema> object when you deploy the schema via
480L</create_ddl_dir> or L</deploy>.
481
482For an example of what you can do with this, see
483L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To Your SQL>.
484
485Note that sqlt_deploy_hook is called by L</deployment_statements>, which in turn
486is called before L</deploy>. Therefore the hook can be used only to manipulate
487the L<SQL::Translator::Schema> object before it is turned into SQL fed to the
488database. If you want to execute post-deploy statements which can not be generated
489by L<SQL::Translator>, the currently suggested method is to overload L</deploy>
490and use L<dbh_do|DBIx::Class::Storage::DBI/dbh_do>.
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
504Creates and returns a new Schema object. The connection info set on it
505is used to create a new instance of the storage backend and set it on
506the Schema object.
507
508See L<DBIx::Class::Storage::DBI/"connect_info"> for DBI-specific
509syntax on the C<@connectinfo> argument, or L<DBIx::Class::Storage> in
510general.
511
512Note that C<connect_info> expects an arrayref of arguments, but
513C<connect> does not. C<connect> wraps its arguments in an arrayref
514before passing them to C<connect_info>.
515
516=head3 Overloading
517
518C<connect> is a convenience method. It is equivalent to calling
519$schema->clone->connection(@connectinfo). To write your own overloaded
520version, overload L</connection> instead.
521
522=cut
523
524112µs287.8mssub connect { shift->clone->connection(@_) }
# spent 61.5ms making 1 call to DBIx::Class::Schema::connection # spent 26.3ms making 1 call to DBIx::Class::Schema::clone
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
538Returns the L<DBIx::Class::ResultSet> object for the registered source
539name.
540
541=cut
542
543sub resultset {
54432µs my ($self, $source_name) = @_;
54531µs $self->throw_exception('resultset() expects a source name')
546 unless defined $source_name;
547324µs61.71ms return $self->source($source_name)->resultset;
# spent 1.27ms making 3 calls to DBIx::Class::ResultSource::resultset, avg 424µs/call # spent 444µs making 3 calls to DBIx::Class::Schema::source, avg 148µs/call
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
560Lists names of all the sources registered on this Schema object.
561
562=cut
563
564116µs1112µs
# spent 129µs (17+112) within DBIx::Class::Schema::sources which was called: # once (17µs+112µs) by DBIx::Class::Schema::_copy_state_from at line 1028
sub sources { keys %{shift->source_registrations} }
# spent 112µs making 1 call to DBIx::Class::Schema::source_registrations
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
578Returns the L<DBIx::Class::ResultSource> object for the registered
579source name.
580
581=cut
582
583
# spent 2.15ms (1.06+1.09) within DBIx::Class::Schema::source which was called 177 times, avg 12µs/call: # 174 times (667µs+1.03ms) by DBIx::Class::Schema::_copy_state_from at line 1029, avg 10µs/call # 3 times (390µs+54µs) by Koha::Objects::find at line 547, avg 148µs/call
sub source {
58417750µs my $self = shift;
585
58617733µs $self->throw_exception("source() expects a source name")
587 unless @_;
588
58917733µs my $source_name = shift;
590
591177543µs1771.09ms my $sreg = $self->source_registrations;
# spent 1.09ms making 177 calls to DBIx::Class::Schema::source_registrations, avg 6µs/call
592177361µs return $sreg->{$source_name} if exists $sreg->{$source_name};
593
594 # if we got here, they probably passed a full class name
595 my $mapped = $self->class_mappings->{$source_name};
596 $self->throw_exception("Can't find source for ${source_name}")
597 unless $mapped && exists $sreg->{$mapped};
598 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
613Retrieves the Result class name for the given source name.
614
615=cut
616
617sub class {
618 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
631Executes C<$coderef> with (optional) arguments C<@coderef_args> atomically,
632returning its result (if any). Equivalent to calling $schema->storage->txn_do.
633See L<DBIx::Class::Storage/"txn_do"> for more information.
634
635This interface is preferred over using the individual methods L</txn_begin>,
636L</txn_commit>, and L</txn_rollback> below.
637
638WARNING: If you are connected with C<< AutoCommit => 0 >> the transaction is
639considered nested, and you will still need to call L</txn_commit> to write your
640changes when appropriate. You will also want to connect with C<< auto_savepoint =>
6411 >> to get partial rollback to work, if the storage driver for your database
642supports it.
643
644Connecting with C<< AutoCommit => 1 >> is recommended.
645
646=cut
647
648sub txn_do {
649 my $self = shift;
650
651 $self->storage or $self->throw_exception
652 ('txn_do called on $schema without storage');
653
654 $self->storage->txn_do(@_);
655}
656
657=head2 txn_scope_guard
658
659Runs C<txn_scope_guard> on the schema's storage. See
660L<DBIx::Class::Storage/txn_scope_guard>.
661
662=cut
663
664sub txn_scope_guard {
665 my $self = shift;
666
667 $self->storage or $self->throw_exception
668 ('txn_scope_guard called on $schema without storage');
669
670 $self->storage->txn_scope_guard(@_);
671}
672
673=head2 txn_begin
674
675Begins a transaction (does nothing if AutoCommit is off). Equivalent to
676calling $schema->storage->txn_begin. See
677L<DBIx::Class::Storage/"txn_begin"> for more information.
678
679=cut
680
681sub txn_begin {
682 my $self = shift;
683
684 $self->storage or $self->throw_exception
685 ('txn_begin called on $schema without storage');
686
687 $self->storage->txn_begin;
688}
689
690=head2 txn_commit
691
692Commits the current transaction. Equivalent to calling
693$schema->storage->txn_commit. See L<DBIx::Class::Storage/"txn_commit">
694for more information.
695
696=cut
697
698sub txn_commit {
699 my $self = shift;
700
701 $self->storage or $self->throw_exception
702 ('txn_commit called on $schema without storage');
703
704 $self->storage->txn_commit;
705}
706
707=head2 txn_rollback
708
709Rolls back the current transaction. Equivalent to calling
710$schema->storage->txn_rollback. See
711L<DBIx::Class::Storage/"txn_rollback"> for more information.
712
713=cut
714
715sub txn_rollback {
716 my $self = shift;
717
718 $self->storage or $self->throw_exception
719 ('txn_rollback called on $schema without storage');
720
721 $self->storage->txn_rollback;
722}
723
724=head2 storage
725
726 my $storage = $schema->storage;
727
728Returns the L<DBIx::Class::Storage> object for this Schema. Grab this
729if you want to turn on SQL statement debugging at runtime, or set the
730quote character. For the default storage, the documentation can be
731found in L<DBIx::Class::Storage::DBI>.
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
743A convenience shortcut to L<DBIx::Class::ResultSet/populate>. Equivalent to:
744
745 $schema->resultset($source_name)->populate([...]);
746
747=over 4
748
749=item NOTE
750
751The context of this method call has an important effect on what is
752submitted to storage. In void context data is fed directly to fastpath
753insertion routines provided by the underlying storage (most often
754L<DBI/execute_for_fetch>), bypassing the L<new|DBIx::Class::Row/new> and
755L<insert|DBIx::Class::Row/insert> calls on the
756L<Result|DBIx::Class::Manual::ResultClass> class, including any
757augmentation of these methods provided by components. For example if you
758are using something like L<DBIx::Class::UUIDColumns> to create primary
759keys for you, you will find that your PKs are empty. In this case you
760will have to explicitly force scalar or list context in order to create
761those values.
762
763=back
764
765=cut
766
767sub populate {
768 my ($self, $name, $data) = @_;
769 my $rs = $self->resultset($name)
770 or $self->throw_exception("'$name' is not a resultset");
771
772 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
785Similar to L</connect> except sets the storage object and connection
786data in-place on the Schema class. You should probably be calling
787L</connect> to get a proper Schema object instead.
788
789=head3 Overloading
790
791Overload C<connection> to change the behaviour of C<connect>.
792
793=cut
794
795
# spent 61.5ms (53µs+61.5) within DBIx::Class::Schema::connection which was called: # once (53µs+61.5ms) by Koha::Objects::find at line 524
sub connection {
79611µs my ($self, @info) = @_;
7971800ns return $self if !@info && $self->storage;
798
79915µs240µs my ($storage_class, $args) = ref $self->storage_type
# spent 40µs making 2 calls to DBIx::Class::Schema::storage_type, avg 20µs/call
800 ? $self->_normalize_storage_type($self->storage_type)
801 : $self->storage_type
802 ;
803
804111µs18µs $storage_class =~ s/^::/DBIx::Class::Storage::/;
# spent 8µs making 1 call to DBIx::Class::Schema::CORE:subst
805
806 try {
80716µs160.2ms $self->ensure_class_loaded ($storage_class);
# spent 60.2ms making 1 call to Class::C3::Componentised::ensure_class_loaded
808 }
809 catch {
810 $self->throw_exception(
811 "Unable to load storage class ${storage_class}: $_"
812 );
813142µs260.3ms };
# spent 60.3ms making 1 call to Try::Tiny::try # spent 8µs making 1 call to Try::Tiny::catch
814
81514µs1530µs my $storage = $storage_class->new( $self => $args||{} );
# spent 530µs making 1 call to DBIx::Class::Storage::DBI::new
81613µs1596µs $storage->connect_info(\@info);
# spent 596µs making 1 call to DBIx::Class::Storage::DBI::connect_info
81716µs119µs $self->storage($storage);
# spent 19µs making 1 call to DBIx::Class::Schema::storage
81815µs return $self;
819}
820
821sub _normalize_storage_type {
822 my ($self, $storage_type) = @_;
823 if(ref $storage_type eq 'ARRAY') {
824 return @$storage_type;
825 } elsif(ref $storage_type eq 'HASH') {
826 return %$storage_type;
827 } else {
828 $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
842For each L<DBIx::Class::ResultSource> in the schema, this method creates a
843class in the target namespace (e.g. $target_namespace::CD,
844$target_namespace::Artist) that inherits from the corresponding classes
845attached to the current schema.
846
847It also attaches a corresponding L<DBIx::Class::ResultSource> object to the
848new $schema object. If C<$additional_base_class> is given, the new composed
849classes will inherit from first the corresponding class from the current
850schema then the base class.
851
852For 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
858will 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
884sub compose_namespace {
885 my ($self, $target, $base) = @_;
886
887 my $schema = $self->clone;
888
889 $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 {
8962147µs278µs
# spent 51µs (24+27) within DBIx::Class::Schema::BEGIN@896 which was called: # once (24µs+27µs) by base::import at line 896
no warnings qw/redefine/;
# spent 51µs making 1 call to DBIx::Class::Schema::BEGIN@896 # spent 27µs making 1 call to warnings::unimport
897 local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
89822.46ms254µs
# spent 37µs (20+17) within DBIx::Class::Schema::BEGIN@898 which was called: # once (20µs+17µs) by base::import at line 898
use warnings qw/redefine/;
# spent 37µs making 1 call to DBIx::Class::Schema::BEGIN@898 # spent 17µs making 1 call to warnings::import
899
900 foreach my $source_name ($self->sources) {
901 my $orig_source = $self->source($source_name);
902
903 my $target_class = "${target}::${source_name}";
904 $self->inject_base($target_class, $orig_source->result_class, ($base || ()) );
905
906 # register_source examines result_class, and then returns us a clone
907 my $new_source = $schema->register_source($source_name, bless
908 { %$orig_source, result_class => $target_class },
909 ref $orig_source,
910 );
911
912 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 ref $new_source,
917 );
918 }
919 }
920
921 quote_sub "${target}::${_}" => "shift->schema->$_(\@_)"
922 for qw(class source resultset);
923 }
924
925 Class::C3->reinitialize() if DBIx::Class::_ENV_::OLD_MRO;
926
927 return $schema;
928}
929
930sub setup_connection_class {
931 my ($class, $target, @info) = @_;
932 $class->inject_base($target => 'DBIx::Class::DB');
933 #$target->load_components('DB');
934 $target->connection(@info);
935}
936
937=head2 svp_begin
938
939Creates a new savepoint (does nothing outside a transaction).
940Equivalent to calling $schema->storage->svp_begin. See
941L<DBIx::Class::Storage/"svp_begin"> for more information.
942
943=cut
944
945sub svp_begin {
946 my ($self, $name) = @_;
947
948 $self->storage or $self->throw_exception
949 ('svp_begin called on $schema without storage');
950
951 $self->storage->svp_begin($name);
952}
953
954=head2 svp_release
955
956Releases a savepoint (does nothing outside a transaction).
957Equivalent to calling $schema->storage->svp_release. See
958L<DBIx::Class::Storage/"svp_release"> for more information.
959
960=cut
961
962sub svp_release {
963 my ($self, $name) = @_;
964
965 $self->storage or $self->throw_exception
966 ('svp_release called on $schema without storage');
967
968 $self->storage->svp_release($name);
969}
970
971=head2 svp_rollback
972
973Rollback to a savepoint (does nothing outside a transaction).
974Equivalent to calling $schema->storage->svp_rollback. See
975L<DBIx::Class::Storage/"svp_rollback"> for more information.
976
977=cut
978
979sub svp_rollback {
980 my ($self, $name) = @_;
981
982 $self->storage or $self->throw_exception
983 ('svp_rollback called on $schema without storage');
984
985 $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
998Clones the schema and its associated result_source objects and returns the
999copy. The resulting copy will have the same attributes as the source schema,
1000except for those attributes explicitly overridden by the provided C<%attrs>.
1001
1002=cut
1003
1004
# spent 26.3ms (28µs+26.3) within DBIx::Class::Schema::clone which was called: # once (28µs+26.3ms) by Koha::Objects::find at line 524
sub clone {
10051800ns my $self = shift;
1006
1007 my $clone = {
1008 (ref $self ? %$self : ()),
100912µs (@_ == 1 && ref $_[0] eq 'HASH' ? %{ $_[0] } : @_),
1010 };
10111600ns bless $clone, (ref $self || $self);
1012
1013113µs354µs $clone->$_(undef) for qw/class_mappings source_registrations storage/;
# spent 37µs making 1 call to DBIx::Class::Schema::class_mappings # spent 9µs making 1 call to DBIx::Class::Schema::source_registrations # spent 8µs making 1 call to DBIx::Class::Schema::storage
1014
101514µs126.2ms $clone->_copy_state_from($self);
# spent 26.2ms making 1 call to DBIx::Class::Schema::_copy_state_from
1016
101714µs return $clone;
1018}
1019
1020# Needed in Schema::Loader - if you refactor, please make a compatibility shim
1021# -- Caelum
1022
# spent 26.2ms (2.25+24.0) within DBIx::Class::Schema::_copy_state_from which was called: # once (2.25ms+24.0ms) by DBIx::Class::Schema::clone at line 1015
sub _copy_state_from {
10231600ns my ($self, $from) = @_;
1024
10251132µs219µs $self->class_mappings({ %{$from->class_mappings} });
# spent 19µs making 2 calls to DBIx::Class::Schema::class_mappings, avg 9µs/call
10261100µs216µs $self->source_registrations({ %{$from->source_registrations} });
# spent 16µs making 2 calls to DBIx::Class::Schema::source_registrations, avg 8µs/call
1027
1028115µs1129µs foreach my $source_name ($from->sources) {
# spent 129µs making 1 call to DBIx::Class::Schema::sources
1029174299µs1741.70ms my $source = $from->source($source_name);
# spent 1.70ms making 174 calls to DBIx::Class::Schema::source, avg 10µs/call
1030174205µs1743.36ms my $new = $source->new($source);
# spent 3.36ms making 174 calls to DBIx::Class::ResultSource::new, avg 19µs/call
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
10331741.05ms34818.7ms $self->register_extra_source($source_name => $new);
# spent 17.8ms making 174 calls to DBIx::Class::Schema::register_extra_source, avg 102µs/call # spent 897µs making 174 calls to DBIx::Class::ResultSource::DESTROY, avg 5µs/call
1034 }
1035
103618µs151µs if ($from->storage) {
# spent 51µs making 1 call to DBIx::Class::Schema::storage
1037 $self->storage($from->storage);
1038 $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
1050Throws an exception. Obeys the exemption rules of L<DBIx::Class::Carp> to report
1051errors from outer-user's perspective. See L</exception_action> for details on overriding
1052this method's behavior. If L</stacktrace> is turned on, C<throw_exception>'s
1053default behavior will provide a detailed stack trace.
1054
1055=cut
1056
1057sub throw_exception {
1058 my $self = shift;
1059
1060 if (my $act = $self->exception_action) {
1061 if ($act->(@_)) {
1062 DBIx::Class::Exception->throw(
1063 "Invocation of the exception_action handler installed on $self did *not*"
1064 .' result in an exception. DBIx::Class is unable to function without a reliable'
1065 .' exception mechanism, ensure that exception_action does not hide exceptions'
1066 ." (original error: $_[0])"
1067 );
1068 }
1069
1070 carp_unique (
1071 "The exception_action handler installed on $self returned false instead"
1072 .' of throwing an exception. This behavior has been deprecated, adjust your'
1073 .' handler to always rethrow the supplied error.'
1074 );
1075 }
1076
1077 DBIx::Class::Exception->throw($_[0], $self->stacktrace);
1078}
1079
1080=head2 deploy
1081
1082=over 4
1083
1084=item Arguments: \%sqlt_args, $dir
1085
1086=back
1087
1088Attempts to deploy the schema to the current storage using L<SQL::Translator>.
1089
1090See L<SQL::Translator/METHODS> for a list of values for C<\%sqlt_args>.
1091The most common value for this would be C<< { add_drop_table => 1 } >>
1092to have the SQL produced include a C<DROP TABLE> statement for each table
1093created. For quoting purposes supply C<quote_identifiers>.
1094
1095Additionally, the DBIx::Class parser accepts a C<sources> parameter as a hash
1096ref or an array ref, containing a list of source to deploy. If present, then
1097only the sources listed will get deployed. Furthermore, you can use the
1098C<add_fk_index> parser parameter to prevent the parser from creating an index for each
1099FK.
1100
1101=cut
1102
1103sub deploy {
1104 my ($self, $sqltargs, $dir) = @_;
1105 $self->throw_exception("Can't deploy without storage") unless $self->storage;
1106 $self->storage->deploy($self, undef, $sqltargs, $dir);
1107}
1108
1109=head2 deployment_statements
1110
1111=over 4
1112
1113=item Arguments: See L<DBIx::Class::Storage::DBI/deployment_statements>
1114
1115=item Return Value: $listofstatements
1116
1117=back
1118
1119A convenient shortcut to
1120C<< $self->storage->deployment_statements($self, @args) >>.
1121Returns the statements used by L</deploy> and
1122L<DBIx::Class::Storage/deploy>.
1123
1124=cut
1125
1126sub deployment_statements {
1127 my $self = shift;
1128
1129 $self->throw_exception("Can't generate deployment statements without a storage")
1130 if not $self->storage;
1131
1132 $self->storage->deployment_statements($self, @_);
1133}
1134
1135=head2 create_ddl_dir
1136
1137=over 4
1138
1139=item Arguments: See L<DBIx::Class::Storage::DBI/create_ddl_dir>
1140
1141=back
1142
1143A convenient shortcut to
1144C<< $self->storage->create_ddl_dir($self, @args) >>.
1145
1146Creates an SQL file based on the Schema, for each of the specified
1147database types, in the given directory.
1148
1149=cut
1150
1151sub create_ddl_dir {
1152 my $self = shift;
1153
1154 $self->throw_exception("Can't create_ddl_dir without storage") unless $self->storage;
1155 $self->storage->create_ddl_dir($self, @_);
1156}
1157
1158=head2 ddl_filename
1159
1160=over 4
1161
1162=item Arguments: $database-type, $version, $directory, $preversion
1163
1164=item Return Value: $normalised_filename
1165
1166=back
1167
1168 my $filename = $table->ddl_filename($type, $version, $dir, $preversion)
1169
1170This method is called by C<create_ddl_dir> to compose a file name out of
1171the supplied directory, database type and version number. The default file
1172name format is: C<$dir$schema-$version-$type.sql>.
1173
1174You may override this method in your schema if you wish to use a different
1175format.
1176
1177 WARNING
1178
1179 Prior to DBIx::Class version 0.08100 this method had a different signature:
1180
1181 my $filename = $table->ddl_filename($type, $dir, $version, $preversion)
1182
1183 In recent versions variables $dir and $version were reversed in order to
1184 bring the signature in line with other Schema/Storage methods. If you
1185 really need to maintain backward compatibility, you can do the following
1186 in any overriding methods:
1187
1188 ($dir, $version) = ($version, $dir) if ($DBIx::Class::VERSION < 0.08100);
1189
1190=cut
1191
1192sub ddl_filename {
1193 my ($self, $type, $version, $dir, $preversion) = @_;
1194
1195 require File::Spec;
1196
1197 $version = "$preversion-$version" if $preversion;
1198
1199 my $class = blessed($self) || $self;
1200 $class =~ s/::/-/g;
1201
1202 return File::Spec->catfile($dir, "$class-$version-$type.sql");
1203}
1204
1205=head2 thaw
1206
1207Provided as the recommended way of thawing schema objects. You can call
1208C<Storable::thaw> directly if you wish, but the thawed objects will not have a
1209reference to any schema, so are rather useless.
1210
1211=cut
1212
1213sub thaw {
1214 my ($self, $obj) = @_;
1215 local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1216 require Storable;
1217 return Storable::thaw($obj);
1218}
1219
1220=head2 freeze
1221
1222This doesn't actually do anything beyond calling L<nfreeze|Storable/SYNOPSIS>,
1223it is just provided here for symmetry.
1224
1225=cut
1226
1227sub freeze {
1228 require Storable;
1229 return Storable::nfreeze($_[1]);
1230}
1231
1232=head2 dclone
1233
1234=over 4
1235
1236=item Arguments: $object
1237
1238=item Return Value: dcloned $object
1239
1240=back
1241
1242Recommended way of dcloning L<DBIx::Class::Row> and L<DBIx::Class::ResultSet>
1243objects so their references to the schema object
1244(which itself is B<not> cloned) are properly maintained.
1245
1246=cut
1247
1248sub dclone {
1249 my ($self, $obj) = @_;
1250 local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1251 require Storable;
1252 return Storable::dclone($obj);
1253}
1254
1255=head2 schema_version
1256
1257Returns the current schema class' $VERSION in a normalised way.
1258
1259=cut
1260
1261sub schema_version {
1262 my ($self) = @_;
1263 my $class = ref($self)||$self;
1264
1265 # does -not- use $schema->VERSION
1266 # since that varies in results depending on if version.pm is installed, and if
1267 # so the perl or XS versions. If you want this to change, bug the version.pm
1268 # author to make vpp and vxs behave the same.
1269
1270 my $version;
1271 {
127221.84ms2232µs
# spent 191µs (150+41) within DBIx::Class::Schema::BEGIN@1272 which was called: # once (150µs+41µs) by base::import at line 1272
no strict 'refs';
# spent 191µs making 1 call to DBIx::Class::Schema::BEGIN@1272 # spent 41µs making 1 call to strict::unimport
1273 $version = ${"${class}::VERSION"};
1274 }
1275 return $version;
1276}
1277
1278
1279=head2 register_class
1280
1281=over 4
1282
1283=item Arguments: $source_name, $component_class
1284
1285=back
1286
1287This method is called by L</load_namespaces> and L</load_classes> to install the found classes into your Schema. You should be using those instead of this one.
1288
1289You will only need this method if you have your Result classes in
1290files which are not named after the packages (or all in the same
1291file). You may also need it to register classes at runtime.
1292
1293Registers a class which isa DBIx::Class::ResultSourceProxy. Equivalent to
1294calling:
1295
1296 $schema->register_source($source_name, $component_class->result_source_instance);
1297
1298=cut
1299
1300
# spent 42.2ms (4.99+37.2) within DBIx::Class::Schema::register_class which was called 174 times, avg 243µs/call: # 174 times (4.99ms+37.2ms) by DBIx::Class::Schema::load_namespaces at line 292, avg 243µs/call
sub register_class {
130117492µs my ($self, $source_name, $to_register) = @_;
1302174962µs34837.2ms $self->register_source($source_name => $to_register->result_source_instance);
# spent 35.7ms making 174 calls to DBIx::Class::Schema::register_source, avg 205µs/call # spent 32µs making 1 call to Koha::Schema::Result::RepeatableHoliday::result_source_instance # spent 17µs making 1 call to Koha::Schema::Result::ImportRecordMatch::result_source_instance # spent 16µs making 1 call to Koha::Schema::Result::Biblio::result_source_instance # spent 16µs making 1 call to Koha::Schema::Result::Browser::result_source_instance # spent 15µs making 1 call to Koha::Schema::Result::ImportItem::result_source_instance # spent 14µs making 1 call to Koha::Schema::Result::Aqbasketgroup::result_source_instance # spent 14µs making 1 call to Koha::Schema::Result::BranchItemRule::result_source_instance # spent 14µs making 1 call to Koha::Schema::Result::Printer::result_source_instance # spent 12µs making 1 call to Koha::Schema::Result::Accountoffset::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::TransportCost::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::OverduerulesTransportType::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::MessageAttribute::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Suggestion::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::SocialData::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::SpecialHoliday::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Accountline::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::OldReserve::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Biblioitem::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Quote::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Rating::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Z3950server::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqcontact::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Item::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::OaiSet::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ItemCirculationAlertPreference::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ActionLogs::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqbasket::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqorder::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::BorrowerSync::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Branchtransfer::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ClassSource::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::DefaultCircRule::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::LanguageDescription::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::NeedMergeAuthority::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::PluginData::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Serial::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Subscriptionroutinglist::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqbookseller::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqbudgetborrower::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::BorrowerDebarment::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::MarcModificationTemplateAction::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::OpacNews::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ReportsDictionary::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AuthSubfieldStructure::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::BorrowerMessagePreference::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Deletedbiblio::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Localization::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Matchpoint::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::OaiSetsDescription::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::OldIssue::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Virtualshelfcontent::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AuthTagStructure::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ClassSortRule::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Fieldmapping::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Matchcheck::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::MessageTransportType::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::OaiSetsBiblio::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::PatronListPatron::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::TmpHoldsqueue::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Zebraqueue::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqcontract::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqinvoice::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Category::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Issue::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Itemtype::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::MarcModificationTemplate::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::SubscriptionFrequency::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::SubscriptionNumberpattern::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AuthorisedValue::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::BorrowerModification::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::CourseReserve::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::PrintersProfile::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Serialitem::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AqorderUser::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AuthHeader::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BorrowerAttributeType::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Linktracker::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Notify::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ServicesThrottle::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::TagsApproval::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Aqbudgetperiod::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AqordersItem::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BiblioFramework::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BorrowerAttributeTypesBranch::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BorrowerMessageTransportPreference::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Branchcategory::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Currency::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::DefaultBranchCircRule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Statistic::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ActionLog::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Branchrelation::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CreatorLayout::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CreatorTemplate::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Deletedbiblioitem::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Deleteditem::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Discharge::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ImportRecord::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ItemsLastBorrower::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Letter::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::PendingOfflineOperation::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::TagAll::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Userflag::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AdditionalFieldValue::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Alert::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AuthorisedValuesBranch::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BranchTransferLimit::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::City::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Course::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CreatorBatch::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::DefaultBranchItemRule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::HoldFillTarget::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::LanguageSubtagRegistry::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MarcTagStructure::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Stopword::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Subscriptionhistory::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Systempreference::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AqordersTransfer::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Biblioimage::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CreatorImage::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Deletedborrower::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ImportBatch::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ImportBiblio::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Issuingrule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MarcMatcher::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::OaiSetsMapping::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Review::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::UploadedFile::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Virtualshelve::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Borrower::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CollectionsTracking::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MarcSubfieldStructure::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MessageTransport::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::UserPermission::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Aqbasketuser::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AqbudgetsPlanning::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AudioAlert::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AuthType::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BranchBorrowerCircRule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CategoriesBranch::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Collection::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CourseInstructor::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ImportAuth::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MessageQueue::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::PatronList::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Reserve::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::SavedSql::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Virtualshelfshare::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AdditionalField::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BorrowerAttribute::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Branch::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ColumnsSetting::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ItemsSearchField::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::LanguageScriptMapping::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MatchpointComponentNorm::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Overduerule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Patronimage::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CourseItem::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::DefaultBorrowerCircRule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ExportFormat::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Message::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MiscFile::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::SavedReport::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::SearchHistory::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Subscription::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Aqbudget::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BorrowerFile::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::LanguageScriptBidi::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MatcherMatchpoint::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MatchpointComponent::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Permission::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Tag::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::LanguageRfc4646ToIso639::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Session::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::TagsIndex::result_source_instance
1303}
1304
1305=head2 register_source
1306
1307=over 4
1308
1309=item Arguments: $source_name, L<$result_source|DBIx::Class::ResultSource>
1310
1311=back
1312
1313This method is called by L</register_class>.
1314
1315Registers the L<DBIx::Class::ResultSource> in the schema with the given
1316source name.
1317
1318=cut
1319
1320174364µs17435.2ms
# spent 35.7ms (469µs+35.2) within DBIx::Class::Schema::register_source which was called 174 times, avg 205µs/call: # 174 times (469µs+35.2ms) by DBIx::Class::Schema::register_class at line 1302, avg 205µs/call
sub register_source { shift->_register_source(@_) }
# spent 35.2ms making 174 calls to DBIx::Class::Schema::_register_source, avg 202µs/call
1321
1322=head2 unregister_source
1323
1324=over 4
1325
1326=item Arguments: $source_name
1327
1328=back
1329
1330Removes the L<DBIx::Class::ResultSource> from the schema for the given source name.
1331
1332=cut
1333
1334sub unregister_source { shift->_unregister_source(@_) }
1335
1336=head2 register_extra_source
1337
1338=over 4
1339
1340=item Arguments: $source_name, L<$result_source|DBIx::Class::ResultSource>
1341
1342=back
1343
1344As L</register_source> but should be used if the result class already
1345has a source and you want to register an extra one.
1346
1347=cut
1348
1349174437µs17417.3ms
# spent 17.8ms (517µs+17.3) within DBIx::Class::Schema::register_extra_source which was called 174 times, avg 102µs/call: # 174 times (517µs+17.3ms) by DBIx::Class::Schema::_copy_state_from at line 1033, avg 102µs/call
sub register_extra_source { shift->_register_source(@_, { extra => 1 }) }
# spent 17.3ms making 174 calls to DBIx::Class::Schema::_register_source, avg 99µs/call
1350
1351
# spent 52.5ms (27.8+24.7) within DBIx::Class::Schema::_register_source which was called 348 times, avg 151µs/call: # 174 times (15.5ms+19.7ms) by DBIx::Class::Schema::register_source at line 1320, avg 202µs/call # 174 times (12.3ms+4.99ms) by DBIx::Class::Schema::register_extra_source at line 1349, avg 99µs/call
sub _register_source {
1352348123µs my ($self, $source_name, $source, $params) = @_;
1353
13543482.21ms3485.17ms $source = $source->new({ %$source, source_name => $source_name });
# spent 5.17ms making 348 calls to DBIx::Class::ResultSource::new, avg 15µs/call
1355
1356348396µs348502µs $source->schema($self);
# spent 502µs making 348 calls to DBIx::Class::ResultSource::schema, avg 1µs/call
1357348517µs174166µs weaken $source->{schema} if ref($self);
# spent 166µs making 174 calls to Scalar::Util::weaken, avg 955ns/call
1358
135934813.1ms3485.60ms my %reg = %{$self->source_registrations};
# spent 5.60ms making 348 calls to DBIx::Class::Schema::source_registrations, avg 16µs/call
1360348190µs $reg{$source_name} = $source;
13613482.37ms3482.90ms $self->source_registrations(\%reg);
# spent 2.90ms making 348 calls to DBIx::Class::Schema::source_registrations, avg 8µs/call
1362
1363348735µs return $source if $params->{extra};
1364
1365174251µs1745.04ms my $rs_class = $source->result_class;
# spent 5.04ms making 174 calls to DBIx::Class::ResultSource::result_class, avg 29µs/call
13663482.94ms3484.64ms if ($rs_class and my $rsrc = try { $rs_class->result_source_instance } ) {
# spent 3.47ms making 174 calls to Try::Tiny::try, avg 20µs/call # spent 19µs making 1 call to Koha::Schema::Result::OldReserve::result_source_instance # spent 17µs making 1 call to Koha::Schema::Result::Z3950server::result_source_instance # spent 15µs making 1 call to Koha::Schema::Result::DefaultBorrowerCircRule::result_source_instance # spent 15µs making 1 call to Koha::Schema::Result::MatcherMatchpoint::result_source_instance # spent 13µs making 1 call to Koha::Schema::Result::Biblioitem::result_source_instance # spent 12µs making 1 call to Koha::Schema::Result::OpacNews::result_source_instance # spent 11µs making 1 call to Koha::Schema::Result::AqbudgetsPlanning::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Printer::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::OaiSetsMapping::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Aqbudgetperiod::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MessageTransport::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ImportItem::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Aqbasketgroup::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Browser::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Accountline::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BorrowerModification::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::MarcModificationTemplateAction::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Aqcontact::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ImportRecord::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::OverduerulesTransportType::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::SocialData::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::SpecialHoliday::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BorrowerAttribute::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BorrowerAttributeType::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BorrowerAttributeTypesBranch::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Course::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ItemCirculationAlertPreference::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::LanguageRfc4646ToIso639::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::MarcModificationTemplate::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::PatronListPatron::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ReportsDictionary::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Subscriptionroutinglist::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Suggestion::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::TagAll::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Virtualshelfcontent::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Branchcategory::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Branchrelation::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Discharge::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ImportBiblio::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::PendingOfflineOperation::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AqordersTransfer::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BorrowerDebarment::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BranchTransferLimit::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ClassSource::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::CreatorTemplate::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::DefaultBranchItemRule::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Deletedbiblio::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Deletedborrower::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ImportAuth::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Itemtype::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::LanguageScriptMapping::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::LanguageSubtagRegistry::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::OaiSetsBiblio::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::OaiSetsDescription::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::OldIssue::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Zebraqueue::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqbudgetborrower::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AqorderUser::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AuthHeader::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AuthType::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AuthorisedValue::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Biblio::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BorrowerSync::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BranchItemRule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ClassSortRule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CourseItem::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CourseReserve::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::HoldFillTarget::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Issue::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ItemsLastBorrower::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Localization::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MatchpointComponentNorm::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MessageAttribute::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MessageQueue::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Rating::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Stopword::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::SubscriptionFrequency::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::SubscriptionNumberpattern::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Subscriptionhistory::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::UploadedFile::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ActionLogs::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqbudget::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AqordersItem::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AuthTagStructure::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AuthorisedValuesBranch::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BiblioFramework::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BorrowerMessagePreference::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BorrowerMessageTransportPreference::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ColumnsSetting::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CreatorImage::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::DefaultBranchCircRule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::DefaultCircRule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ExportFormat::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Fieldmapping::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Issuingrule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ItemsSearchField::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::LanguageDescription::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MarcTagStructure::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Matchpoint::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MatchpointComponent::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::NeedMergeAuthority::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::OaiSet::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Overduerule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Quote::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Review::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::SearchHistory::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ServicesThrottle::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Statistic::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::TmpHoldsqueue::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Accountoffset::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AdditionalFieldValue::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Biblioimage::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Borrower::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Branch::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CategoriesBranch::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Category::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::City::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CourseInstructor::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CreatorBatch::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Currency::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Deletedbiblioitem::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ImportBatch::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ImportRecordMatch::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Item::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::LanguageScriptBidi::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Linktracker::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MarcMatcher::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MessageTransportType::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Permission::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::SavedSql::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Serialitem::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::TransportCost::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Virtualshelfshare::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Virtualshelve::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AdditionalField::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Alert::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqbasketuser::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqinvoice::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqorder::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AudioAlert::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Letter::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Matchcheck::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MiscFile::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Notify::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::PatronList::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Patronimage::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::PluginData::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::PrintersProfile::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Reserve::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Serial::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Session::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Systempreference::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqbasket::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqbookseller::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AuthSubfieldStructure::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BorrowerFile::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BranchBorrowerCircRule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MarcSubfieldStructure::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::RepeatableHoliday::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Subscription::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::UserPermission::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqcontract::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Branchtransfer::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Collection::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CreatorLayout::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Message::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Tag::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::TagsApproval::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::TagsIndex::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Userflag::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::SavedReport::result_source_instance # spent 5µs making 1 call to Koha::Schema::Result::CollectionsTracking::result_source_instance # spent 200ns making 1 call to Koha::Schema::Result::Deleteditem::result_source_instance # spent 100ns making 1 call to Koha::Schema::Result::ActionLog::result_source_instance
13671744.76ms174911µs my %map = %{$self->class_mappings};
# spent 911µs making 174 calls to DBIx::Class::Schema::class_mappings, avg 5µs/call
136817448µs if (
1369 exists $map{$rs_class}
1370 and
1371 $map{$rs_class} ne $source_name
1372 and
1373 $rsrc ne $_[2] # orig_source
1374 ) {
1375 carp
1376 "$rs_class already had a registered source which was replaced by this call. "
1377 . 'Perhaps you wanted register_extra_source(), though it is more likely you did '
1378 . 'something wrong.'
1379 ;
1380 }
1381
138217464µs $map{$rs_class} = $source_name;
1383174301µs174929µs $self->class_mappings(\%map);
# spent 929µs making 174 calls to DBIx::Class::Schema::class_mappings, avg 5µs/call
1384 }
1385
1386174368µs return $source;
1387}
1388
13891400nsmy $global_phase_destroy;
1390sub DESTROY {
1391 return if $global_phase_destroy ||= in_global_destruction;
1392
1393 my $self = shift;
1394 my $srcs = $self->source_registrations;
1395
1396 for my $source_name (keys %$srcs) {
1397 # find first source that is not about to be GCed (someone other than $self
1398 # holds a reference to it) and reattach to it, weakening our own link
1399 #
1400 # during global destruction (if we have not yet bailed out) this should throw
1401 # which will serve as a signal to not try doing anything else
1402 # however beware - on older perls the exception seems randomly untrappable
1403 # due to some weird race condition during thread joining :(((
1404 if (length ref $srcs->{$source_name} and refcount($srcs->{$source_name}) > 1) {
1405 local $@;
1406 eval {
1407 $srcs->{$source_name}->schema($self);
1408 weaken $srcs->{$source_name};
1409 1;
1410 } or do {
1411 $global_phase_destroy = 1;
1412 };
1413
1414 last;
1415 }
1416 }
1417}
1418
1419sub _unregister_source {
1420 my ($self, $source_name) = @_;
1421 my %reg = %{$self->source_registrations};
1422
1423 my $source = delete $reg{$source_name};
1424 $self->source_registrations(\%reg);
1425 if ($source->result_class) {
1426 my %map = %{$self->class_mappings};
1427 delete $map{$source->result_class};
1428 $self->class_mappings(\%map);
1429 }
1430}
1431
1432
1433=head2 compose_connection (DEPRECATED)
1434
1435=over 4
1436
1437=item Arguments: $target_namespace, @db_info
1438
1439=item Return Value: $new_schema
1440
1441=back
1442
1443DEPRECATED. You probably wanted compose_namespace.
1444
1445Actually, you probably just wanted to call connect.
1446
1447=begin hidden
1448
1449(hidden due to deprecation)
1450
1451Calls L<DBIx::Class::Schema/"compose_namespace"> to the target namespace,
1452calls L<DBIx::Class::Schema/connection> with @db_info on the new schema,
1453then injects the L<DBix::Class::ResultSetProxy> component and a
1454resultset_instance classdata entry on all the new classes, in order to support
1455$target_namespaces::$class->search(...) method calls.
1456
1457This is primarily useful when you have a specific need for class method access
1458to a connection. In normal usage it is preferred to call
1459L<DBIx::Class::Schema/connect> and use the resulting schema object to operate
1460on L<DBIx::Class::ResultSet> objects with L<DBIx::Class::Schema/resultset> for
1461more information.
1462
1463=end hidden
1464
1465=cut
1466
1467sub compose_connection {
1468 my ($self, $target, @info) = @_;
1469
1470 carp_once "compose_connection deprecated as of 0.08000"
1471 unless $INC{"DBIx/Class/CDBICompat.pm"};
1472
1473 my $base = 'DBIx::Class::ResultSetProxy';
1474 try {
1475 eval "require ${base};"
1476 }
1477 catch {
1478 $self->throw_exception
1479 ("No arguments to load_classes and couldn't load ${base} ($_)")
1480 };
1481
1482 if ($self eq $target) {
1483 # Pathological case, largely caused by the docs on early C::M::DBIC::Plain
1484 foreach my $source_name ($self->sources) {
1485 my $source = $self->source($source_name);
1486 my $class = $source->result_class;
1487 $self->inject_base($class, $base);
1488 $class->mk_classdata(resultset_instance => $source->resultset);
1489 $class->mk_classdata(class_resolver => $self);
1490 }
1491 $self->connection(@info);
1492 return $self;
1493 }
1494
1495 my $schema = $self->compose_namespace($target, $base);
1496 quote_sub "${target}::schema", '$s', { '$s' => \$schema };
1497
1498 $schema->connection(@info);
1499 foreach my $source_name ($schema->sources) {
1500 my $source = $schema->source($source_name);
1501 my $class = $source->result_class;
1502 #warn "$source_name $class $source ".$source->storage;
1503 $class->mk_classdata(result_source_instance => $source);
1504 $class->mk_classdata(resultset_instance => $source->resultset);
1505 $class->mk_classdata(class_resolver => $schema);
1506 }
1507 return $schema;
1508}
1509
1510=head1 FURTHER QUESTIONS?
1511
1512Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
1513
1514=head1 COPYRIGHT AND LICENSE
1515
1516This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
1517by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
1518redistribute it and/or modify it under the same terms as the
1519L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
1520
1521=cut
1522
1523112µs1490µs1;
# spent 490µs making 1 call to B::Hooks::EndOfScope::XS::__ANON__
 
# spent 149µs within DBIx::Class::Schema::CORE:match which was called 174 times, avg 856ns/call: # 174 times (149µs+0s) by DBIx::Class::Schema::_findallmod at line 167, avg 856ns/call
sub DBIx::Class::Schema::CORE:match; # opcode
# spent 508µs (300+208) within DBIx::Class::Schema::CORE:sort which was called 2 times, avg 254µs/call: # once (298µs+208µs) by DBIx::Class::Schema::load_namespaces at line 244 # once (2µs+0s) by DBIx::Class::Schema::load_namespaces at line 285
sub DBIx::Class::Schema::CORE:sort; # opcode
# spent 10µs within DBIx::Class::Schema::CORE:subst which was called 3 times, avg 3µs/call: # 2 times (3µs+0s) by DBIx::Class::Schema::_expand_relative_name at line 158, avg 1µs/call # once (8µs+0s) by DBIx::Class::Schema::connection at line 804
sub DBIx::Class::Schema::CORE:subst; # opcode