← 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 14:31:06 2016
Reported on Fri Jan 8 14:31:36 2016

Filename/usr/share/perl5/DBIx/Class/Schema.pm
StatementsExecuted 9860 statements in 57.4ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
3482128.1ms49.9msDBIx::Class::Schema::::_register_sourceDBIx::Class::Schema::_register_source
1118.04ms1.37sDBIx::Class::Schema::::load_namespacesDBIx::Class::Schema::load_namespaces
348215.53ms14.8msDBIx::Class::Schema::::_ns_get_rsrc_instanceDBIx::Class::Schema::_ns_get_rsrc_instance
1112.31ms29.8msDBIx::Class::Schema::::_copy_state_fromDBIx::Class::Schema::_copy_state_from
2111.47ms46.0msDBIx::Class::Schema::::_findallmodDBIx::Class::Schema::_findallmod
174111.35ms36.5msDBIx::Class::Schema::::register_classDBIx::Class::Schema::register_class
262211.33ms3.32msDBIx::Class::Schema::::sourceDBIx::Class::Schema::source
17411505µs17.2msDBIx::Class::Schema::::register_extra_sourceDBIx::Class::Schema::register_extra_source
17411425µs33.6msDBIx::Class::Schema::::register_sourceDBIx::Class::Schema::register_source
221376µs746µsDBIx::Class::Schema::::CORE:sortDBIx::Class::Schema::CORE:sort (opcode)
221136µs46.1msDBIx::Class::Schema::::_map_namespacesDBIx::Class::Schema::_map_namespaces
1741194µs94µsDBIx::Class::Schema::::CORE:matchDBIx::Class::Schema::CORE:match (opcode)
11191µs113µsDBIx::Class::Schema::::BEGIN@373DBIx::Class::Schema::BEGIN@373
11163µs64.5msDBIx::Class::Schema::::connectionDBIx::Class::Schema::connection
11136µs29.9msDBIx::Class::Schema::::cloneDBIx::Class::Schema::clone
11134µs45µsDBIx::Class::Schema::::BEGIN@12DBIx::Class::Schema::BEGIN@12
11133µs43µsDBIx::Class::Schema::::BEGIN@896DBIx::Class::Schema::BEGIN@896
11123µs289µsDBIx::Class::Schema::::resultsetDBIx::Class::Schema::resultset
11122µs33µsDBIx::Class::Schema::::BEGIN@375DBIx::Class::Schema::BEGIN@375
11119µs34µsDBIx::Class::Schema::::BEGIN@1272DBIx::Class::Schema::BEGIN@1272
11117µs56µsDBIx::Class::Schema::::BEGIN@9DBIx::Class::Schema::BEGIN@9
11116µs22µsDBIx::Class::Schema::::sourcesDBIx::Class::Schema::sources
11114µs20µsDBIx::Class::Schema::::BEGIN@3DBIx::Class::Schema::BEGIN@3
21112µs14µsDBIx::Class::Schema::::_expand_relative_nameDBIx::Class::Schema::_expand_relative_name
11112µs28µsDBIx::Class::Schema::::BEGIN@233DBIx::Class::Schema::BEGIN@233
11111µs46µsDBIx::Class::Schema::::BEGIN@11DBIx::Class::Schema::BEGIN@11
11110µs31.0msDBIx::Class::Schema::::BEGIN@6DBIx::Class::Schema::BEGIN@6
11110µs31µsDBIx::Class::Schema::::BEGIN@10DBIx::Class::Schema::BEGIN@10
32110µs10µsDBIx::Class::Schema::::CORE:substDBIx::Class::Schema::CORE:subst (opcode)
11110µs54µsDBIx::Class::Schema::::BEGIN@8DBIx::Class::Schema::BEGIN@8
1118µs24µsDBIx::Class::Schema::::BEGIN@235DBIx::Class::Schema::BEGIN@235
1118µs16µsDBIx::Class::Schema::::BEGIN@898DBIx::Class::Schema::BEGIN@898
1118µs181µsDBIx::Class::Schema::::BEGIN@13DBIx::Class::Schema::BEGIN@13
1117µs11µsDBIx::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::::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
3235µs227µs
# spent 20µs (14+7) within DBIx::Class::Schema::BEGIN@3 which was called: # once (14µs+7µs) by base::import at line 3
use strict;
# spent 20µs making 1 call to DBIx::Class::Schema::BEGIN@3 # spent 7µs making 1 call to strict::import
4234µs215µs
# spent 11µs (7+4) within DBIx::Class::Schema::BEGIN@4 which was called: # once (7µs+4µs) by base::import at line 4
use warnings;
# spent 11µs making 1 call to DBIx::Class::Schema::BEGIN@4 # spent 4µs making 1 call to warnings::import
5
62182µs231.0ms
# spent 31.0ms (10µs+31.0) within DBIx::Class::Schema::BEGIN@6 which was called: # once (10µs+31.0ms) by base::import at line 6
use base 'DBIx::Class';
# spent 31.0ms making 1 call to DBIx::Class::Schema::BEGIN@6 # spent 31.0ms making 1 call to base::import, recursion: max depth 1, sum of overlapping time 31.0ms
7
8229µs298µs
# spent 54µs (10+44) within DBIx::Class::Schema::BEGIN@8 which was called: # once (10µs+44µs) by base::import at line 8
use DBIx::Class::Carp;
# spent 54µs making 1 call to DBIx::Class::Schema::BEGIN@8 # spent 44µs making 1 call to DBIx::Class::Carp::import
9279µs294µs
# spent 56µs (17+38) within DBIx::Class::Schema::BEGIN@9 which was called: # once (17µs+38µs) by base::import at line 9
use Try::Tiny;
# spent 56µs making 1 call to DBIx::Class::Schema::BEGIN@9 # spent 38µs making 1 call to Exporter::import
10252µs252µs
# spent 31µs (10+21) within DBIx::Class::Schema::BEGIN@10 which was called: # once (10µs+21µs) by base::import at line 10
use Scalar::Util qw/weaken blessed/;
# spent 31µs making 1 call to DBIx::Class::Schema::BEGIN@10 # spent 21µs making 1 call to Exporter::import
11271µs280µs
# spent 46µs (11+34) within DBIx::Class::Schema::BEGIN@11 which was called: # once (11µs+34µs) by base::import at line 11
use DBIx::Class::_Util qw(refcount quote_sub);
# spent 46µs making 1 call to DBIx::Class::Schema::BEGIN@11 # spent 34µs making 1 call to Exporter::import
12265µs257µs
# spent 45µs (34+12) within DBIx::Class::Schema::BEGIN@12 which was called: # once (34µs+12µs) by base::import at line 12
use Devel::GlobalDestruction;
# spent 45µs making 1 call to DBIx::Class::Schema::BEGIN@12 # spent 12µs making 1 call to Sub::Exporter::Progressive::__ANON__
132784µs2355µs
# spent 181µs (8+174) within DBIx::Class::Schema::BEGIN@13 which was called: # once (8µs+174µs) by base::import at line 13
use namespace::clean;
# spent 181µs making 1 call to DBIx::Class::Schema::BEGIN@13 # spent 174µs making 1 call to namespace::clean::import
14
1517µs1439µs__PACKAGE__->mk_classdata('class_mappings' => {});
# spent 439µs making 1 call to DBIx::Class::mk_classdata
1612µs1286µs__PACKAGE__->mk_classdata('source_registrations' => {});
# spent 286µs making 1 call to DBIx::Class::mk_classdata
1712µs1274µs__PACKAGE__->mk_classdata('storage_type' => '::DBI');
# spent 274µs making 1 call to DBIx::Class::mk_classdata
1812µs1257µs__PACKAGE__->mk_classdata('storage');
# spent 257µs making 1 call to DBIx::Class::mk_classdata
1912µs1259µs__PACKAGE__->mk_classdata('exception_action');
# spent 259µs making 1 call to DBIx::Class::mk_classdata
2013µs1260µs__PACKAGE__->mk_classdata('stacktrace' => $ENV{DBIC_TRACE} || 0);
# spent 260µs making 1 call to DBIx::Class::mk_classdata
2112µs1264µs__PACKAGE__->mk_classdata('default_resultset_attributes' => {});
# spent 264µ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 14µs (12+1) within DBIx::Class::Schema::_expand_relative_name which was called 2 times, avg 7µs/call: # 2 times (12µs+1µs) by DBIx::Class::Schema::load_namespaces at line 225, avg 7µs/call
sub _expand_relative_name {
1572800ns my ($class, $name) = @_;
158211µs21µs $name =~ s/^\+// or $name = "${class}::${name}";
# spent 1µs making 2 calls to DBIx::Class::Schema::CORE:subst, avg 650ns/call
15925µ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 46.0ms (1.47+44.5) within DBIx::Class::Schema::_findallmod which was called 2 times, avg 23.0ms/call: # 2 times (1.47ms+44.5ms) by DBIx::Class::Schema::_map_namespaces at line 182, avg 23.0ms/call
sub _findallmod {
1662114µs require Module::Find;
167174295µs17494µs return map
# spent 94µs making 174 calls to DBIx::Class::Schema::CORE:match, avg 541ns/call
168242µs244.3ms { $_ =~ /(.+)/ } # untaint result
# spent 44.3ms making 2 calls to Module::Find::findallmod, avg 22.1ms/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 46.1ms (136µs+46.0) within DBIx::Class::Schema::_map_namespaces which was called 2 times, avg 23.0ms/call: # once (127µs+45.8ms) by DBIx::Class::Schema::load_namespaces at line 228 # once (8µs+143µs) by DBIx::Class::Schema::load_namespaces at line 229
sub _map_namespaces {
17721µs my ($me, $namespaces) = @_;
178
1792600ns my %res;
18022µs for my $ns (@$namespaces) {
181 $res{ substr($_, length "${ns}::") } = $_
1822122µs246.0ms for $me->_findallmod($ns);
# spent 46.0ms making 2 calls to DBIx::Class::Schema::_findallmod, avg 23.0ms/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 14.8ms (5.53+9.25) within DBIx::Class::Schema::_ns_get_rsrc_instance which was called 348 times, avg 42µs/call: # 174 times (4.43ms+5.78ms) by DBIx::Class::Schema::load_namespaces at line 259, avg 59µs/call # 174 times (1.10ms+3.47ms) by DBIx::Class::Schema::load_namespaces at line 279, avg 26µs/call
sub _ns_get_rsrc_instance {
19134887µs my $me = shift;
192348101µs my $rs_class = ref ($_[0]) || $_[0];
193
194 return try {
195348759µs3483.86ms $rs_class->result_source_instance
# spent 41µs making 2 calls to Koha::Schema::Result::MessageQueue::result_source_instance, avg 21µs/call # spent 41µs making 2 calls to Koha::Schema::Result::AqordersItem::result_source_instance, avg 21µs/call # spent 40µs making 2 calls to Koha::Schema::Result::Biblioimage::result_source_instance, avg 20µs/call # spent 39µs making 2 calls to Koha::Schema::Result::Currency::result_source_instance, avg 20µs/call # spent 32µs making 2 calls to Koha::Schema::Result::BorrowerAttributeTypesBranch::result_source_instance, avg 16µs/call # spent 32µs making 2 calls to Koha::Schema::Result::BorrowerMessageTransportPreference::result_source_instance, avg 16µs/call # spent 32µs making 2 calls to Koha::Schema::Result::Deleteditem::result_source_instance, avg 16µs/call # spent 32µs making 2 calls to Koha::Schema::Result::Virtualshelfshare::result_source_instance, avg 16µs/call # spent 31µs making 2 calls to Koha::Schema::Result::ImportRecordMatch::result_source_instance, avg 15µs/call # spent 31µs making 2 calls to Koha::Schema::Result::ReportsDictionary::result_source_instance, avg 15µs/call # spent 30µs making 2 calls to Koha::Schema::Result::PatronList::result_source_instance, avg 15µs/call # spent 29µs making 2 calls to Koha::Schema::Result::AuthorisedValue::result_source_instance, avg 14µs/call # spent 26µs making 2 calls to Koha::Schema::Result::Issuingrule::result_source_instance, avg 13µs/call # spent 24µs making 2 calls to Koha::Schema::Result::BorrowerModification::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::ItemsLastBorrower::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Branchrelation::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::TagsApproval::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Aqbasket::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::ExportFormat::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::TagsIndex::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Permission::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::OverduerulesTransportType::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::BranchTransferLimit::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::ImportAuth::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::AuthTagStructure::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::CreatorLayout::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::AdditionalField::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Subscription::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Alert::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ClassSortRule::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::BorrowerSync::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Virtualshelfcontent::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AdditionalFieldValue::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AudioAlert::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::CourseReserve::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::MarcModificationTemplateAction::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::MiscFile::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Systempreference::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::LanguageDescription::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::LanguageRfc4646ToIso639::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::BorrowerFile::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::CreatorBatch::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::OaiSetsBiblio::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::OldReserve::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::SavedSql::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ServicesThrottle::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AqordersTransfer::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Biblio::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Biblioitem::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::SpecialHoliday::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::CollectionsTracking::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::Item::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::MatchpointComponentNorm::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::UploadedFile::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::ImportBatch::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::Category::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Collection::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::MatchpointComponent::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::OaiSetsDescription::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::OldIssue::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Stopword::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::TagAll::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AqorderUser::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Borrower::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Linktracker::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::MessageTransport::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Overduerule::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::PluginData::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Suggestion::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::UserPermission::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Userflag::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::BranchItemRule::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ItemsSearchField::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Matchcheck::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::SearchHistory::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::TransportCost::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AqbudgetsPlanning::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqorder::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Serialitem::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Session::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::SubscriptionNumberpattern::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::TmpHoldsqueue::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AuthHeader::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ClassSource::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::CourseInstructor::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Deletedborrower::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::LanguageScriptMapping::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::BiblioFramework::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::Discharge::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::LanguageScriptBidi::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Localization::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::NeedMergeAuthority::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::CategoriesBranch::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::Deletedbiblioitem::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::HoldFillTarget::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ImportRecord::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Issue::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ItemCirculationAlertPreference::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::Statistic::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Subscriptionhistory::result_source_instance, avg 11µ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::Aqbookseller::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Branchcategory::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::DefaultBranchItemRule::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ImportBiblio::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MessageTransportType::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Printer::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Reserve::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Tag::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbasketgroup::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::Notify::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Patronimage::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Quote::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Review::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Serial::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Z3950server::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::Branch::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::DefaultCircRule::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MatcherMatchpoint::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 21µs making 2 calls to Koha::Schema::Result::PatronListPatron::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::SavedReport::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::SubscriptionFrequency::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ActionLogs::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbudgetborrower::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqcontract::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::Course::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::CreatorImage::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Fieldmapping::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Matchpoint::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Aqcontact::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::AuthorisedValuesBranch::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Itemtype::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::MarcMatcher::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::RepeatableHoliday::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Virtualshelve::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Aqbudget::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Aqbudgetperiod::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Aqinvoice::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::BorrowerAttribute::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::ImportItem::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::MarcSubfieldStructure::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::OaiSet::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::Subscriptionroutinglist::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Accountline::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Accountoffset::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::City::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::PendingOfflineOperation::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::PrintersProfile::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::BorrowerAttributeType::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::Zebraqueue::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::SocialData::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::LanguageSubtagRegistry::result_source_instance, avg 10µs/call # spent 14µs making 2 calls to Koha::Schema::Result::Deletedbiblio::result_source_instance, avg 7µs/call # spent 10µs making 2 calls to Koha::Schema::Result::ColumnsSetting::result_source_instance, avg 5µ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 );
2003488.05ms6969.25ms };
# spent 8.66ms making 348 calls to Try::Tiny::try, avg 25µs/call # spent 585µs making 348 calls to Try::Tiny::catch, avg 2µs/call
201}
202
203
# spent 1.37s (8.04ms+1.37) within DBIx::Class::Schema::load_namespaces which was called: # once (8.04ms+1.37s) by C4::Context::preference at line 12 of Koha/Schema.pm
sub load_namespaces {
20411µs my ($class, %args) = @_;
205
20611µs my $result_namespace = delete $args{result_namespace} || 'Result';
2071400ns 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): '
2151900ns . join(q{,}, map { qq{'$_'} } keys %args))
216 if scalar keys %args;
217
2181900ns for my $arg ($result_namespace, $resultset_namespace) {
21922µs $arg = [ $arg ] if ( $arg and ! ref $arg );
220
22121µs $class->throw_exception('load_namespaces: namespace arguments must be '
222 . 'a simple string or an arrayref')
223 if ref($arg) ne 'ARRAY';
224
22527µs214µs $_ = $class->_expand_relative_name($_) for (@$arg);
# spent 14µs making 2 calls to DBIx::Class::Schema::_expand_relative_name, avg 7µs/call
226 }
227
22814µs145.9ms my $results_by_source_name = $class->_map_namespaces($result_namespace);
# spent 45.9ms making 1 call to DBIx::Class::Schema::_map_namespaces
22918µs1152µs my $resultsets_by_source_name = $class->_map_namespaces($resultset_namespace);
# spent 152µs making 1 call to DBIx::Class::Schema::_map_namespaces
230
2311300ns my @to_register;
232 {
233393µs245µs
# spent 28µs (12+17) within DBIx::Class::Schema::BEGIN@233 which was called: # once (12µs+17µs) by base::import at line 233
no warnings qw/redefine/;
# spent 28µs making 1 call to DBIx::Class::Schema::BEGIN@233 # spent 17µs making 1 call to warnings::unimport
234 local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
2352623µs240µs
# spent 24µs (8+16) within DBIx::Class::Schema::BEGIN@235 which was called: # once (8µs+16µs) by base::import at line 235
use warnings qw/redefine/;
# spent 24µs making 1 call to DBIx::Class::Schema::BEGIN@235 # spent 16µs making 1 call to warnings::import
236
237 # ensure classes are loaded and attached in inheritance order
23818µs for my $result_class (values %$results_by_source_name) {
2391741.40ms1741.27s $class->ensure_class_loaded($result_class);
# spent 1.27s making 174 calls to Class::C3::Componentised::ensure_class_loaded, avg 7.28ms/call
240 }
2411300ns my %inh_idx;
242 my @source_names_by_subclass_last = sort {
243
2441819µs1751.11ms ($inh_idx{$a} ||=
# spent 744µs making 1 call to DBIx::Class::Schema::CORE:sort # spent 370µs making 174 calls to mro::get_linear_isa, avg 2µ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
256124µs foreach my $source_name (@source_names_by_subclass_last) {
257174122µs my $result_class = $results_by_source_name->{$source_name};
258
259174823µs34812.3ms my $preset_resultset_class = $class->_ns_get_rsrc_instance ($result_class)->resultset_class;
# spent 10.2ms making 174 calls to DBIx::Class::Schema::_ns_get_rsrc_instance, avg 59µs/call # spent 2.10ms making 174 calls to DBIx::Class::ResultSource::resultset_class, avg 12µs/call
26017452µs my $found_resultset_class = delete $resultsets_by_source_name->{$source_name};
261
26217457µ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
279174625µs1764.74ms my $source_name = $class->_ns_get_rsrc_instance ($result_class)->source_name || $source_name;
# spent 4.57ms making 174 calls to DBIx::Class::Schema::_ns_get_rsrc_instance, avg 26µs/call # spent 168µs making 1 call to DBIx::Class::ResultSource::source_name # spent 800ns making 1 call to DBIx::Class::ResultSource::Table::source_name
280
281174264µs push(@to_register, [ $source_name, $result_class ]);
282 }
283 }
284
28519µs11µs foreach (sort keys %$resultsets_by_source_name) {
# spent 1µ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
2921396µs17436.5ms $class->register_class(@$_) for (@to_register);
# spent 36.5ms making 174 calls to DBIx::Class::Schema::register_class, avg 210µs/call
293
294177µ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 {
3732216µs2135µs
# spent 113µs (91+22) within DBIx::Class::Schema::BEGIN@373 which was called: # once (91µs+22µs) by base::import at line 373
no warnings qw/redefine/;
# spent 113µs making 1 call to DBIx::Class::Schema::BEGIN@373 # spent 22µs making 1 call to warnings::unimport
374 local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
3752840µs244µs
# spent 33µs (22+11) within DBIx::Class::Schema::BEGIN@375 which was called: # once (22µs+11µs) by base::import at line 375
use warnings qw/redefine/;
# spent 33µs making 1 call to DBIx::Class::Schema::BEGIN@375 # spent 11µ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
524122µs294.4mssub connect { shift->clone->connection(@_) }
# spent 64.5ms making 1 call to DBIx::Class::Schema::connection # spent 29.9ms 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
543
# spent 289µs (23+266) within DBIx::Class::Schema::resultset which was called: # once (23µs+266µs) by CGI::Compile::ROOT::home_vagrant_kohaclone_mainpage_2epl::BEGIN@32 at line 15 of Koha/Borrower/Discharge.pm
sub resultset {
5448833µs my ($self, $source_name) = @_;
5458835µs $self->throw_exception('resultset() expects a source name')
546 unless defined $source_name;
54788521µs17628.8ms return $self->source($source_name)->resultset;
# spent 27.1ms making 88 calls to DBIx::Class::ResultSource::resultset, avg 308µs/call # spent 1.69ms making 88 calls to DBIx::Class::Schema::source, avg 19µ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
564115µs16µs
# spent 22µs (16+6) within DBIx::Class::Schema::sources which was called: # once (16µs+6µs) by DBIx::Class::Schema::_copy_state_from at line 1028
sub sources { keys %{shift->source_registrations} }
# spent 6µ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 3.32ms (1.33+1.99) within DBIx::Class::Schema::source which was called 262 times, avg 13µs/call: # 174 times (626µs+1.00ms) by DBIx::Class::Schema::_copy_state_from at line 1029, avg 9µs/call # 88 times (702µs+988µs) by C4::Context::preference or C4::Languages::getTranslatedLanguages or C4::Languages::getlanguage or C4::NewsChannels::GetNewsToDisplay or DBIx::Class::Schema::resultset at line 547, avg 19µs/call
sub source {
58426293µs my $self = shift;
585
58626265µs $self->throw_exception("source() expects a source name")
587 unless @_;
588
58926269µs my $source_name = shift;
590
591262368µs2621.99ms my $sreg = $self->source_registrations;
# spent 1.99ms making 262 calls to DBIx::Class::Schema::source_registrations, avg 8µs/call
592262672µ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 64.5ms (63µs+64.4) within DBIx::Class::Schema::connection which was called: # once (63µs+64.4ms) by C4::Context::preference at line 524
sub connection {
79612µs my ($self, @info) = @_;
79711µs return $self if !@info && $self->storage;
798
79916µs244µs my ($storage_class, $args) = ref $self->storage_type
# spent 44µs making 2 calls to DBIx::Class::Schema::storage_type, avg 22µs/call
800 ? $self->_normalize_storage_type($self->storage_type)
801 : $self->storage_type
802 ;
803
804112µs18µs $storage_class =~ s/^::/DBIx::Class::Storage::/;
# spent 8µs making 1 call to DBIx::Class::Schema::CORE:subst
805
806 try {
80717µs163.2ms $self->ensure_class_loaded ($storage_class);
# spent 63.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 );
813143µs263.2ms };
# spent 63.2ms making 1 call to Try::Tiny::try # spent 9µs making 1 call to Try::Tiny::catch
814
81514µs1458µs my $storage = $storage_class->new( $self => $args||{} );
# spent 458µs making 1 call to DBIx::Class::Storage::DBI::new
81612µs1624µs $storage->connect_info(\@info);
# spent 624µs making 1 call to DBIx::Class::Storage::DBI::connect_info
81714µs117µs $self->storage($storage);
# spent 17µs making 1 call to DBIx::Class::Schema::storage
81814µ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 {
896279µs253µs
# spent 43µs (33+10) within DBIx::Class::Schema::BEGIN@896 which was called: # once (33µs+10µs) by base::import at line 896
no warnings qw/redefine/;
# spent 43µs making 1 call to DBIx::Class::Schema::BEGIN@896 # spent 10µs making 1 call to warnings::unimport
897 local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
89821.27ms224µs
# spent 16µs (8+8) within DBIx::Class::Schema::BEGIN@898 which was called: # once (8µs+8µs) by base::import at line 898
use warnings qw/redefine/;
# spent 16µs making 1 call to DBIx::Class::Schema::BEGIN@898 # spent 8µ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 29.9ms (36µs+29.9) within DBIx::Class::Schema::clone which was called: # once (36µs+29.9ms) by C4::Context::preference at line 524
sub clone {
10051500ns my $self = shift;
1006
1007 my $clone = {
1008 (ref $self ? %$self : ()),
1009110µs (@_ == 1 && ref $_[0] eq 'HASH' ? %{ $_[0] } : @_),
1010 };
101111µs bless $clone, (ref $self || $self);
1012
1013113µs374µs $clone->$_(undef) for qw/class_mappings source_registrations storage/;
# spent 56µ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µs129.8ms $clone->_copy_state_from($self);
# spent 29.8ms making 1 call to DBIx::Class::Schema::_copy_state_from
1016
1017129µs return $clone;
1018}
1019
1020# Needed in Schema::Loader - if you refactor, please make a compatibility shim
1021# -- Caelum
1022
# spent 29.8ms (2.31+27.5) within DBIx::Class::Schema::_copy_state_from which was called: # once (2.31ms+27.5ms) by DBIx::Class::Schema::clone at line 1015
sub _copy_state_from {
10231700ns my ($self, $from) = @_;
1024
10251132µs218µs $self->class_mappings({ %{$from->class_mappings} });
# spent 18µs making 2 calls to DBIx::Class::Schema::class_mappings, avg 9µs/call
10261104µ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
1028118µs122µs foreach my $source_name ($from->sources) {
# spent 22µs making 1 call to DBIx::Class::Schema::sources
1029174268µs1741.63ms my $source = $from->source($source_name);
# spent 1.63ms making 174 calls to DBIx::Class::Schema::source, avg 9µs/call
1030174196µs1743.56ms my $new = $source->new($source);
# spent 3.56ms making 174 calls to DBIx::Class::ResultSource::new, avg 20µ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.08ms34822.2ms $self->register_extra_source($source_name => $new);
# spent 17.2ms making 174 calls to DBIx::Class::Schema::register_extra_source, avg 99µs/call # spent 4.97ms making 174 calls to DBIx::Class::ResultSource::DESTROY, avg 29µs/call
1034 }
1035
103617µs154µs if ($from->storage) {
# spent 54µ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.15ms250µs
# spent 34µs (19+16) within DBIx::Class::Schema::BEGIN@1272 which was called: # once (19µs+16µs) by base::import at line 1272
no strict 'refs';
# spent 34µs making 1 call to DBIx::Class::Schema::BEGIN@1272 # spent 16µ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 36.5ms (1.35+35.1) within DBIx::Class::Schema::register_class which was called 174 times, avg 210µs/call: # 174 times (1.35ms+35.1ms) by DBIx::Class::Schema::load_namespaces at line 292, avg 210µs/call
sub register_class {
130117488µs my ($self, $source_name, $to_register) = @_;
13021744.36ms34835.1ms $self->register_source($source_name => $to_register->result_source_instance);
# spent 33.6ms making 174 calls to DBIx::Class::Schema::register_source, avg 193µs/call # spent 26µs making 1 call to Koha::Schema::Result::ClassSource::result_source_instance # spent 19µs making 1 call to Koha::Schema::Result::BorrowerFile::result_source_instance # spent 18µs making 1 call to Koha::Schema::Result::BiblioFramework::result_source_instance # spent 18µs making 1 call to Koha::Schema::Result::Letter::result_source_instance # spent 13µs making 1 call to Koha::Schema::Result::TagsApproval::result_source_instance # spent 11µs making 1 call to Koha::Schema::Result::BorrowerModification::result_source_instance # spent 11µs making 1 call to Koha::Schema::Result::Subscription::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::CreatorLayout::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Matchpoint::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::ColumnsSetting::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::OaiSetsMapping::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Quote::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::BranchTransferLimit::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Collection::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::ImportAuth::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::TagsIndex::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Branch::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::CreatorTemplate::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::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::NeedMergeAuthority::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::OverduerulesTransportType::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::MessageQueue::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::BorrowerAttributeTypesBranch::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Branchrelation::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ImportRecord::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::LanguageScriptMapping::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::Subscriptionhistory::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::DefaultBranchItemRule::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::ExportFormat::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::MiscFile::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::Aqbasketuser::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Biblioimage::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::MatchpointComponent::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::Virtualshelfshare::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::Accountoffset::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AdditionalField::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqbasketgroup::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::CreatorBatch::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::CreatorImage::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::LanguageRfc4646ToIso639::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::Overduerule::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::PatronList::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::Currency::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ImportBatch::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ItemsLastBorrower::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::MessageAttribute::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::Subscriptionroutinglist::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Suggestion::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Virtualshelve::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Alert::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AqordersItem::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AuthType::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::CollectionsTracking::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::CourseInstructor::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Deleteditem::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::PatronListPatron::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Reserve::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqbudgetperiod::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AqordersTransfer::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::Branchcategory::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ImportItem::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ImportRecordMatch::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Linktracker::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Message::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::SavedReport::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Session::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::SubscriptionFrequency::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::Biblio::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BorrowerDebarment::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CourseReserve::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::Item::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MarcModificationTemplate::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MarcModificationTemplateAction::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::MarcTagStructure::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Rating::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Serialitem::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::ActionLog::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Aqbasket::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BorrowerMessagePreference::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::BranchItemRule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ClassSortRule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Deletedbiblio::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::Notify::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::PrintersProfile::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::TransportCost::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::Userflag::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Aqbudgetborrower::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AuthTagStructure::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::Course::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Issue::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::OaiSet::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::TagAll::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::Zebraqueue::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::AuthorisedValuesBranch::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::LanguageDescription::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::MessageTransport::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::Systempreference::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ActionLogs::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Aqcontact::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::Browser::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::Permission::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::PluginData::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Printer::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::AdditionalFieldValue::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::Branchtransfer::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::DefaultBranchCircRule::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::SpecialHoliday::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::Deletedborrower::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Localization::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::Tag::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::Borrower::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::Discharge::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Fieldmapping::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Matchcheck::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::Aqinvoice::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::Issuingrule::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::RepeatableHoliday::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::SocialData::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Serial::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::Aqcontract::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::LanguageScriptBidi::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::Accountline::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::OpacNews::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::TmpHoldsqueue::result_source_instance # spent 100ns making 1 call to Koha::Schema::Result::AqorderUser::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
1320174341µs17433.2ms
# spent 33.6ms (425µs+33.2) within DBIx::Class::Schema::register_source which was called 174 times, avg 193µs/call: # 174 times (425µs+33.2ms) by DBIx::Class::Schema::register_class at line 1302, avg 193µs/call
sub register_source { shift->_register_source(@_) }
# spent 33.2ms making 174 calls to DBIx::Class::Schema::_register_source, avg 191µ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
1349174429µs17416.7ms
# spent 17.2ms (505µs+16.7) within DBIx::Class::Schema::register_extra_source which was called 174 times, avg 99µs/call: # 174 times (505µs+16.7ms) by DBIx::Class::Schema::_copy_state_from at line 1033, avg 99µs/call
sub register_extra_source { shift->_register_source(@_, { extra => 1 }) }
# spent 16.7ms making 174 calls to DBIx::Class::Schema::_register_source, avg 96µs/call
1350
1351
# spent 49.9ms (28.1+21.8) within DBIx::Class::Schema::_register_source which was called 348 times, avg 143µs/call: # 174 times (16.1ms+17.1ms) by DBIx::Class::Schema::register_source at line 1320, avg 191µs/call # 174 times (12.0ms+4.68ms) by DBIx::Class::Schema::register_extra_source at line 1349, avg 96µs/call
sub _register_source {
1352348119µs my ($self, $source_name, $source, $params) = @_;
1353
13543482.25ms3486.80ms $source = $source->new({ %$source, source_name => $source_name });
# spent 6.80ms making 348 calls to DBIx::Class::ResultSource::new, avg 20µs/call
1355
1356348461µs348522µs $source->schema($self);
# spent 522µs making 348 calls to DBIx::Class::ResultSource::schema, avg 1µs/call
1357348569µs174163µs weaken $source->{schema} if ref($self);
# spent 163µs making 174 calls to Scalar::Util::weaken, avg 934ns/call
1358
135934812.9ms3482.04ms my %reg = %{$self->source_registrations};
# spent 2.04ms making 348 calls to DBIx::Class::Schema::source_registrations, avg 6µs/call
1360348182µs $reg{$source_name} = $source;
13613482.33ms3482.26ms $self->source_registrations(\%reg);
# spent 2.26ms making 348 calls to DBIx::Class::Schema::source_registrations, avg 6µs/call
1362
1363348468µs return $source if $params->{extra};
1364
1365174298µs1744.58ms my $rs_class = $source->result_class;
# spent 4.58ms making 174 calls to DBIx::Class::ResultSource::result_class, avg 26µs/call
13663483.15ms3484.77ms if ($rs_class and my $rsrc = try { $rs_class->result_source_instance } ) {
# spent 3.55ms making 174 calls to Try::Tiny::try, avg 20µs/call # spent 53µs making 1 call to Koha::Schema::Result::SocialData::result_source_instance # spent 16µs making 1 call to Koha::Schema::Result::Linktracker::result_source_instance # spent 15µs making 1 call to Koha::Schema::Result::AqorderUser::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Aqbudgetperiod::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::ServicesThrottle::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Accountline::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::OaiSetsMapping::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::SubscriptionNumberpattern::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::SearchHistory::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BiblioFramework::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AuthType::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::DefaultBranchCircRule::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::MessageTransportType::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Systempreference::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AdditionalField::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Aqbudgetborrower::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AudioAlert::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Biblioimage::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::Collection::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ImportRecordMatch::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Subscription::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::UserPermission::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::BorrowerMessagePreference::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::CreatorBatch::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ExportFormat::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Overduerule::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::TagsApproval::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Virtualshelfshare::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Aqbasketgroup::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Aqbasketuser::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Aqbookseller::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::BorrowerSync::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BranchBorrowerCircRule::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::Deleteditem::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::ItemsLastBorrower::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::OaiSetsDescription::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::Permission::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::Virtualshelfcontent::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AdditionalFieldValue::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Aqorder::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AuthSubfieldStructure::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AuthTagStructure::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Biblioitem::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Branch::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::CollectionsTracking::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ColumnsSetting::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::CourseInstructor::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::CreatorImage::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::Deletedbiblioitem::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::HoldFillTarget::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ImportBatch::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::MessageAttribute::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::PatronList::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::RepeatableHoliday::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Subscriptionhistory::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::UploadedFile::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Aqbudget::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::BranchTransferLimit::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::Currency::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::DefaultBorrowerCircRule::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::ItemsSearchField::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::MarcModificationTemplateAction::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::MarcSubfieldStructure::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::MatchpointComponent::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::MessageTransport::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::NeedMergeAuthority::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::OaiSet::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::OldReserve::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::SavedReport::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::SubscriptionFrequency::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::BorrowerAttributeType::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BorrowerDebarment::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::BranchItemRule::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::ClassSource::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Course::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::DefaultCircRule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Deletedborrower::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::LanguageSubtagRegistry::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::Matchcheck::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::MessageQueue::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::Quote::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::TagAll::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Z3950server::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Zebraqueue::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ActionLog::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::AqbudgetsPlanning::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::AuthorisedValuesBranch::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::BorrowerFile::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ImportItem::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::ItemCirculationAlertPreference::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::MatcherMatchpoint::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::Message::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::OaiSetsBiblio::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::Serialitem::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::SpecialHoliday::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::Aqbasket::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::AuthHeader::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::ClassSortRule::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::LanguageDescription::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::MarcMatcher::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Printer::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::Serial::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::Userflag::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::Alert::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::AqordersItem::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BorrowerAttribute::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::CourseItem::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::MiscFile::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::OpacNews::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::Review::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::TagsIndex::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::Aqcontact::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::Itemtype::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::OldIssue::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::ReportsDictionary::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::PendingOfflineOperation::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::Branchtransfer::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ImportBiblio::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::PluginData::result_source_instance
13671744.89ms174866µs my %map = %{$self->class_mappings};
# spent 866µs making 174 calls to DBIx::Class::Schema::class_mappings, avg 5µs/call
136817447µ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
138217487µs $map{$rs_class} = $source_name;
1383174329µs174974µs $self->class_mappings(\%map);
# spent 974µs making 174 calls to DBIx::Class::Schema::class_mappings, avg 6µs/call
1384 }
1385
1386174348µs return $source;
1387}
1388
13891100nsmy $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
152316µs1280µs1;
# spent 280µs making 1 call to B::Hooks::EndOfScope::XS::__ANON__
 
# spent 94µs within DBIx::Class::Schema::CORE:match which was called 174 times, avg 541ns/call: # 174 times (94µs+0s) by DBIx::Class::Schema::_findallmod at line 167, avg 541ns/call
sub DBIx::Class::Schema::CORE:match; # opcode
# spent 746µs (376+370) within DBIx::Class::Schema::CORE:sort which was called 2 times, avg 373µs/call: # once (374µs+370µs) by DBIx::Class::Schema::load_namespaces at line 244 # once (1µ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 (1µs+0s) by DBIx::Class::Schema::_expand_relative_name at line 158, avg 650ns/call # once (8µs+0s) by DBIx::Class::Schema::connection at line 804
sub DBIx::Class::Schema::CORE:subst; # opcode