← 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:16:49 2016
Reported on Fri Jan 8 14:23:06 2016

Filename/usr/share/perl5/DBIx/Class/Schema.pm
StatementsExecuted 8 statements in 35µs
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
3482159.9ms89.1msDBIx::Class::Schema::::_register_sourceDBIx::Class::Schema::_register_source
11115.1ms1.96sDBIx::Class::Schema::::load_namespacesDBIx::Class::Schema::load_namespaces
11112.6ms49.4msDBIx::Class::Schema::::_copy_state_fromDBIx::Class::Schema::_copy_state_from
348212.33ms11.8msDBIx::Class::Schema::::_ns_get_rsrc_instanceDBIx::Class::Schema::_ns_get_rsrc_instance
177212.31ms3.57msDBIx::Class::Schema::::sourceDBIx::Class::Schema::source
174111.40ms64.6msDBIx::Class::Schema::::register_classDBIx::Class::Schema::register_class
2111.36ms46.5msDBIx::Class::Schema::::_findallmodDBIx::Class::Schema::_findallmod
17411627µs28.5msDBIx::Class::Schema::::register_extra_sourceDBIx::Class::Schema::register_extra_source
221570µs11.4msDBIx::Class::Schema::::CORE:sortDBIx::Class::Schema::CORE:sort (opcode)
17411452µs61.7msDBIx::Class::Schema::::register_sourceDBIx::Class::Schema::register_source
221124µs46.6msDBIx::Class::Schema::::_map_namespacesDBIx::Class::Schema::_map_namespaces
17411109µs109µsDBIx::Class::Schema::::CORE:matchDBIx::Class::Schema::CORE:match (opcode)
11162µs154msDBIx::Class::Schema::::connectionDBIx::Class::Schema::connection
11136µs47µsDBIx::Class::Schema::::BEGIN@12DBIx::Class::Schema::BEGIN@12
11128µs49.5msDBIx::Class::Schema::::cloneDBIx::Class::Schema::clone
11120µs34µsDBIx::Class::Schema::::BEGIN@896DBIx::Class::Schema::BEGIN@896
11118µs30µsDBIx::Class::Schema::::BEGIN@898DBIx::Class::Schema::BEGIN@898
11117µs48µsDBIx::Class::Schema::::BEGIN@9DBIx::Class::Schema::BEGIN@9
11115µs20µsDBIx::Class::Schema::::sourcesDBIx::Class::Schema::sources
11114µs20µsDBIx::Class::Schema::::BEGIN@3DBIx::Class::Schema::BEGIN@3
11114µs25µsDBIx::Class::Schema::::BEGIN@1272DBIx::Class::Schema::BEGIN@1272
11113µs33µsDBIx::Class::Schema::::BEGIN@233DBIx::Class::Schema::BEGIN@233
21112µs14µsDBIx::Class::Schema::::_expand_relative_nameDBIx::Class::Schema::_expand_relative_name
11112µs31.1msDBIx::Class::Schema::::BEGIN@6DBIx::Class::Schema::BEGIN@6
32111µs11µsDBIx::Class::Schema::::CORE:substDBIx::Class::Schema::CORE:subst (opcode)
1119µs18µsDBIx::Class::Schema::::BEGIN@373DBIx::Class::Schema::BEGIN@373
1118µs173µsDBIx::Class::Schema::::BEGIN@13DBIx::Class::Schema::BEGIN@13
1118µs45µsDBIx::Class::Schema::::BEGIN@8DBIx::Class::Schema::BEGIN@8
1118µs22µsDBIx::Class::Schema::::BEGIN@235DBIx::Class::Schema::BEGIN@235
1118µs12µsDBIx::Class::Schema::::BEGIN@4DBIx::Class::Schema::BEGIN@4
1118µs25µsDBIx::Class::Schema::::BEGIN@10DBIx::Class::Schema::BEGIN@10
1118µs15µsDBIx::Class::Schema::::BEGIN@375DBIx::Class::Schema::BEGIN@375
1117µs36µsDBIx::Class::Schema::::BEGIN@11DBIx::Class::Schema::BEGIN@11
0000s0sDBIx::Class::Schema::::DESTROYDBIx::Class::Schema::DESTROY
0000s0sDBIx::Class::Schema::::__ANON__[:1366]DBIx::Class::Schema::__ANON__[:1366]
0000s0sDBIx::Class::Schema::::__ANON__[:1476]DBIx::Class::Schema::__ANON__[:1476]
0000s0sDBIx::Class::Schema::::__ANON__[:1480]DBIx::Class::Schema::__ANON__[:1480]
0000s0sDBIx::Class::Schema::::__ANON__[:196]DBIx::Class::Schema::__ANON__[:196]
0000s0sDBIx::Class::Schema::::__ANON__[:200]DBIx::Class::Schema::__ANON__[:200]
0000s0sDBIx::Class::Schema::::__ANON__[:234]DBIx::Class::Schema::__ANON__[:234]
0000s0sDBIx::Class::Schema::::__ANON__[:374]DBIx::Class::Schema::__ANON__[:374]
0000s0sDBIx::Class::Schema::::__ANON__[:808]DBIx::Class::Schema::__ANON__[:808]
0000s0sDBIx::Class::Schema::::__ANON__[:813]DBIx::Class::Schema::__ANON__[:813]
0000s0sDBIx::Class::Schema::::__ANON__[:897]DBIx::Class::Schema::__ANON__[:897]
0000s0sDBIx::Class::Schema::::_normalize_storage_typeDBIx::Class::Schema::_normalize_storage_type
0000s0sDBIx::Class::Schema::::_unregister_sourceDBIx::Class::Schema::_unregister_source
0000s0sDBIx::Class::Schema::::catch {...} DBIx::Class::Schema::catch {...}
0000s0sDBIx::Class::Schema::::classDBIx::Class::Schema::class
0000s0sDBIx::Class::Schema::::compose_connectionDBIx::Class::Schema::compose_connection
0000s0sDBIx::Class::Schema::::compose_namespaceDBIx::Class::Schema::compose_namespace
0000s0sDBIx::Class::Schema::::connectDBIx::Class::Schema::connect
0000s0sDBIx::Class::Schema::::create_ddl_dirDBIx::Class::Schema::create_ddl_dir
0000s0sDBIx::Class::Schema::::dcloneDBIx::Class::Schema::dclone
0000s0sDBIx::Class::Schema::::ddl_filenameDBIx::Class::Schema::ddl_filename
0000s0sDBIx::Class::Schema::::deployDBIx::Class::Schema::deploy
0000s0sDBIx::Class::Schema::::deployment_statementsDBIx::Class::Schema::deployment_statements
0000s0sDBIx::Class::Schema::::freezeDBIx::Class::Schema::freeze
0000s0sDBIx::Class::Schema::::load_classesDBIx::Class::Schema::load_classes
0000s0sDBIx::Class::Schema::::populateDBIx::Class::Schema::populate
0000s0sDBIx::Class::Schema::::resultsetDBIx::Class::Schema::resultset
0000s0sDBIx::Class::Schema::::schema_versionDBIx::Class::Schema::schema_version
0000s0sDBIx::Class::Schema::::setup_connection_classDBIx::Class::Schema::setup_connection_class
0000s0sDBIx::Class::Schema::::svp_beginDBIx::Class::Schema::svp_begin
0000s0sDBIx::Class::Schema::::svp_releaseDBIx::Class::Schema::svp_release
0000s0sDBIx::Class::Schema::::svp_rollbackDBIx::Class::Schema::svp_rollback
0000s0sDBIx::Class::Schema::::thawDBIx::Class::Schema::thaw
0000s0sDBIx::Class::Schema::::throw_exceptionDBIx::Class::Schema::throw_exception
0000s0sDBIx::Class::Schema::::try {...} DBIx::Class::Schema::try {...}
0000s0sDBIx::Class::Schema::::txn_beginDBIx::Class::Schema::txn_begin
0000s0sDBIx::Class::Schema::::txn_commitDBIx::Class::Schema::txn_commit
0000s0sDBIx::Class::Schema::::txn_doDBIx::Class::Schema::txn_do
0000s0sDBIx::Class::Schema::::txn_rollbackDBIx::Class::Schema::txn_rollback
0000s0sDBIx::Class::Schema::::txn_scope_guardDBIx::Class::Schema::txn_scope_guard
0000s0sDBIx::Class::Schema::::unregister_sourceDBIx::Class::Schema::unregister_source
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package DBIx::Class::Schema;
2
3227µs
# spent 20µs (14+6) within DBIx::Class::Schema::BEGIN@3 which was called: # once (14µs+6µs) by base::import at line 3
use strict;
# spent 20µs making 1 call to DBIx::Class::Schema::BEGIN@3 # spent 6µs making 1 call to strict::import
4216µs
# spent 12µs (8+4) within DBIx::Class::Schema::BEGIN@4 which was called: # once (8µs+4µs) by base::import at line 4
use warnings;
# spent 12µs making 1 call to DBIx::Class::Schema::BEGIN@4 # spent 4µs making 1 call to warnings::import
5
6231.1ms
# spent 31.1ms (12µs+31.1) within DBIx::Class::Schema::BEGIN@6 which was called: # once (12µs+31.1ms) by base::import at line 6
use base 'DBIx::Class';
# spent 31.1ms making 1 call to DBIx::Class::Schema::BEGIN@6 # spent 31.1ms making 1 call to base::import, recursion: max depth 1, sum of overlapping time 31.1ms
7
8282µs
# spent 45µs (8+37) within DBIx::Class::Schema::BEGIN@8 which was called: # once (8µs+37µs) by base::import at line 8
use DBIx::Class::Carp;
# spent 45µs making 1 call to DBIx::Class::Schema::BEGIN@8 # spent 37µs making 1 call to DBIx::Class::Carp::import
9280µs
# spent 48µs (17+31) within DBIx::Class::Schema::BEGIN@9 which was called: # once (17µs+31µs) by base::import at line 9
use Try::Tiny;
# spent 48µs making 1 call to DBIx::Class::Schema::BEGIN@9 # spent 31µs making 1 call to Exporter::import
10242µs
# spent 25µs (8+17) within DBIx::Class::Schema::BEGIN@10 which was called: # once (8µs+17µs) by base::import at line 10
use Scalar::Util qw/weaken blessed/;
# spent 25µs making 1 call to DBIx::Class::Schema::BEGIN@10 # spent 17µs making 1 call to Exporter::import
11264µs
# spent 36µs (7+28) within DBIx::Class::Schema::BEGIN@11 which was called: # once (7µs+28µs) by base::import at line 11
use DBIx::Class::_Util qw(refcount quote_sub);
# spent 36µs making 1 call to DBIx::Class::Schema::BEGIN@11 # spent 28µs making 1 call to Exporter::import
12257µs
# spent 47µs (36+10) within DBIx::Class::Schema::BEGIN@12 which was called: # once (36µs+10µs) by base::import at line 12
use Devel::GlobalDestruction;
# spent 47µs making 1 call to DBIx::Class::Schema::BEGIN@12 # spent 10µs making 1 call to Sub::Exporter::Progressive::__ANON__
132337µs
# spent 173µs (8+165) within DBIx::Class::Schema::BEGIN@13 which was called: # once (8µs+165µs) by base::import at line 13
use namespace::clean;
# spent 173µs making 1 call to DBIx::Class::Schema::BEGIN@13 # spent 165µs making 1 call to namespace::clean::import
14
151416µs__PACKAGE__->mk_classdata('class_mappings' => {});
# spent 416µs making 1 call to DBIx::Class::mk_classdata
161271µs__PACKAGE__->mk_classdata('source_registrations' => {});
# spent 271µs making 1 call to DBIx::Class::mk_classdata
171275µs__PACKAGE__->mk_classdata('storage_type' => '::DBI');
# spent 275µs making 1 call to DBIx::Class::mk_classdata
181260µs__PACKAGE__->mk_classdata('storage');
# spent 260µs making 1 call to DBIx::Class::mk_classdata
191160µs__PACKAGE__->mk_classdata('exception_action');
# spent 160µs making 1 call to DBIx::Class::mk_classdata
201288µs__PACKAGE__->mk_classdata('stacktrace' => $ENV{DBIC_TRACE} || 0);
# spent 288µs making 1 call to DBIx::Class::mk_classdata
211411µs__PACKAGE__->mk_classdata('default_resultset_attributes' => {});
# spent 411µ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+2) within DBIx::Class::Schema::_expand_relative_name which was called 2 times, avg 7µs/call: # 2 times (12µs+2µs) by DBIx::Class::Schema::load_namespaces at line 225, avg 7µs/call
sub _expand_relative_name {
157 my ($class, $name) = @_;
15822µs $name =~ s/^\+// or $name = "${class}::${name}";
# spent 2µs making 2 calls to DBIx::Class::Schema::CORE:subst, avg 1µs/call
159 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.5ms (1.36+45.1) within DBIx::Class::Schema::_findallmod which was called 2 times, avg 23.2ms/call: # 2 times (1.36ms+45.1ms) by DBIx::Class::Schema::_map_namespaces at line 182, avg 23.2ms/call
sub _findallmod {
166 require Module::Find;
167174109µs return map
# spent 109µs making 174 calls to DBIx::Class::Schema::CORE:match, avg 625ns/call
168244.9ms { $_ =~ /(.+)/ } # untaint result
# spent 44.9ms making 2 calls to Module::Find::findallmod, avg 22.4ms/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.6ms (124µs+46.5) within DBIx::Class::Schema::_map_namespaces which was called 2 times, avg 23.3ms/call: # once (116µs+46.3ms) by DBIx::Class::Schema::load_namespaces at line 228 # once (7µs+141µs) by DBIx::Class::Schema::load_namespaces at line 229
sub _map_namespaces {
177 my ($me, $namespaces) = @_;
178
179 my %res;
180 for my $ns (@$namespaces) {
181 $res{ substr($_, length "${ns}::") } = $_
182246.5ms for $me->_findallmod($ns);
# spent 46.5ms making 2 calls to DBIx::Class::Schema::_findallmod, avg 23.2ms/call
183 }
184
185 \%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 11.8ms (2.33+9.52) within DBIx::Class::Schema::_ns_get_rsrc_instance which was called 348 times, avg 34µs/call: # 174 times (1.13ms+5.85ms) by DBIx::Class::Schema::load_namespaces at line 259, avg 40µs/call # 174 times (1.20ms+3.67ms) by DBIx::Class::Schema::load_namespaces at line 279, avg 28µs/call
sub _ns_get_rsrc_instance {
191 my $me = shift;
192 my $rs_class = ref ($_[0]) || $_[0];
193
194 return try {
1953484.03ms $rs_class->result_source_instance
# spent 53µs making 2 calls to Koha::Schema::Result::AuthSubfieldStructure::result_source_instance, avg 27µs/call # spent 52µs making 2 calls to Koha::Schema::Result::MessageTransport::result_source_instance, avg 26µs/call # spent 48µs making 2 calls to Koha::Schema::Result::Z3950server::result_source_instance, avg 24µs/call # spent 45µs making 2 calls to Koha::Schema::Result::Linktracker::result_source_instance, avg 22µs/call # spent 41µs making 2 calls to Koha::Schema::Result::CourseItem::result_source_instance, avg 21µs/call # spent 39µs making 2 calls to Koha::Schema::Result::DefaultBranchItemRule::result_source_instance, avg 19µs/call # spent 38µs making 2 calls to Koha::Schema::Result::SpecialHoliday::result_source_instance, avg 19µs/call # spent 36µs making 2 calls to Koha::Schema::Result::Biblioitem::result_source_instance, avg 18µs/call # spent 35µs making 2 calls to Koha::Schema::Result::Session::result_source_instance, avg 18µs/call # spent 35µs making 2 calls to Koha::Schema::Result::Biblio::result_source_instance, avg 18µs/call # spent 34µs making 2 calls to Koha::Schema::Result::Tag::result_source_instance, avg 17µs/call # spent 34µs making 2 calls to Koha::Schema::Result::PendingOfflineOperation::result_source_instance, avg 17µs/call # spent 34µs making 2 calls to Koha::Schema::Result::BorrowerModification::result_source_instance, avg 17µs/call # spent 34µs making 2 calls to Koha::Schema::Result::Category::result_source_instance, avg 17µs/call # spent 33µs making 2 calls to Koha::Schema::Result::Aqinvoice::result_source_instance, avg 17µs/call # spent 31µs making 2 calls to Koha::Schema::Result::ColumnsSetting::result_source_instance, avg 16µs/call # spent 28µs making 2 calls to Koha::Schema::Result::OldIssue::result_source_instance, avg 14µs/call # spent 28µs making 2 calls to Koha::Schema::Result::OaiSetsMapping::result_source_instance, avg 14µs/call # spent 27µs making 2 calls to Koha::Schema::Result::Serialitem::result_source_instance, avg 14µs/call # spent 25µs making 2 calls to Koha::Schema::Result::PatronListPatron::result_source_instance, avg 13µs/call # spent 24µs making 2 calls to Koha::Schema::Result::Deleteditem::result_source_instance, avg 12µs/call # spent 24µs making 2 calls to Koha::Schema::Result::LanguageScriptBidi::result_source_instance, avg 12µs/call # spent 24µs making 2 calls to Koha::Schema::Result::Suggestion::result_source_instance, avg 12µs/call # spent 24µs making 2 calls to Koha::Schema::Result::AuthorisedValue::result_source_instance, avg 12µs/call # spent 24µs making 2 calls to Koha::Schema::Result::Deletedbiblioitem::result_source_instance, avg 12µs/call # spent 24µs making 2 calls to Koha::Schema::Result::OverduerulesTransportType::result_source_instance, avg 12µs/call # spent 24µs making 2 calls to Koha::Schema::Result::Virtualshelve::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Aqbasketgroup::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::ItemCirculationAlertPreference::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::DefaultBranchCircRule::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::BorrowerAttributeTypesBranch::result_source_instance, avg 12µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Notify::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::UserPermission::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Branchcategory::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Deletedbiblio::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Subscriptionroutinglist::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::AuthType::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Currency::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::SubscriptionFrequency::result_source_instance, avg 11µs/call # spent 23µs making 2 calls to Koha::Schema::Result::Branch::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Accountline::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AdditionalFieldValue::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::AqbudgetsPlanning::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::City::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ClassSource::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::LanguageDescription::result_source_instance, avg 11µs/call # spent 22µ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::BranchItemRule::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AdditionalField::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::HoldFillTarget::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ItemsLastBorrower::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ActionLog::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::CourseInstructor::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::CreatorImage::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::AuthTagStructure::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::Branchrelation::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AuthorisedValuesBranch::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::CategoriesBranch::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::LanguageSubtagRegistry::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::CourseReserve::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Deletedborrower::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Matchcheck::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::MatcherMatchpoint::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::Course::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::CreatorLayout::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::MarcSubfieldStructure::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::NeedMergeAuthority::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Patronimage::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::SocialData::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Virtualshelfcontent::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Aqcontract::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::ImportRecord::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::OaiSetsDescription::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::Virtualshelfshare::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Aqbudgetperiod::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AqordersItem::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::AqordersTransfer::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::BranchBorrowerCircRule::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::OldReserve::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::SubscriptionNumberpattern::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Accountoffset::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Aqbudgetborrower::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::BranchTransferLimit::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::CollectionsTracking::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::ImportRecordMatch::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::Itemtype::result_source_instance, avg 11µs/call # spent 22µs making 2 calls to Koha::Schema::Result::MarcMatcher::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbasket::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Discharge::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ItemsSearchField::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Message::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MessageQueue::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Reserve::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::UploadedFile::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::BorrowerAttributeType::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::CreatorTemplate::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::MatchpointComponentNorm::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::OaiSet::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::RepeatableHoliday::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Review::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::SavedSql::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Stopword::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::Aqbookseller::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqcontact::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqorder::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Fieldmapping::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::Matchpoint::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MatchpointComponent::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Permission::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Quote::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::SavedReport::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Zebraqueue::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::BorrowerAttribute::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::DefaultBorrowerCircRule::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MessageAttribute::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Serial::result_source_instance, avg 11µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ImportAuth::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::PrintersProfile::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::TransportCost::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::BorrowerMessageTransportPreference::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ClassSortRule::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Collection::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ExportFormat::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MarcModificationTemplateAction::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::Overduerule::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::PatronList::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::TagsIndex::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Aqbasketuser::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::AqorderUser::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Localization::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::PluginData::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ServicesThrottle::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Biblioimage::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ImportItem::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::Rating::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::ReportsDictionary::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::Subscriptionhistory::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::Issuingrule::result_source_instance, avg 10µs/call # spent 21µs making 2 calls to Koha::Schema::Result::MiscFile::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::MarcModificationTemplate::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::OpacNews::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::TagsApproval::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::ImportBiblio::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::MarcTagStructure::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::DefaultCircRule::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::ImportBatch::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::LanguageScriptMapping::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::TagAll::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Statistic::result_source_instance, avg 10µs/call # spent 20µs making 2 calls to Koha::Schema::Result::Branchtransfer::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 13µs making 2 calls to Koha::Schema::Result::BiblioFramework::result_source_instance, avg 7µs/call # spent 300ns making 2 calls to Koha::Schema::Result::SearchHistory::result_source_instance, avg 150ns/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 );
2006969.52ms };
# spent 8.90ms making 348 calls to Try::Tiny::try, avg 26µs/call # spent 621µs making 348 calls to Try::Tiny::catch, avg 2µs/call
201}
202
203
# spent 1.96s (15.1ms+1.95) within DBIx::Class::Schema::load_namespaces which was called: # once (15.1ms+1.95s) by Koha::Objects::search at line 12 of Koha/Schema.pm
sub load_namespaces {
204 my ($class, %args) = @_;
205
206 my $result_namespace = delete $args{result_namespace} || 'Result';
207 my $resultset_namespace = delete $args{resultset_namespace} || 'ResultSet';
208
209 my $default_resultset_class = delete $args{default_resultset_class};
210
211 $default_resultset_class = $class->_expand_relative_name($default_resultset_class)
212 if $default_resultset_class;
213
214 $class->throw_exception('load_namespaces: unknown option(s): '
215 . join(q{,}, map { qq{'$_'} } keys %args))
216 if scalar keys %args;
217
218 for my $arg ($result_namespace, $resultset_namespace) {
219 $arg = [ $arg ] if ( $arg and ! ref $arg );
220
221 $class->throw_exception('load_namespaces: namespace arguments must be '
222 . 'a simple string or an arrayref')
223 if ref($arg) ne 'ARRAY';
224
225214µ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
228146.4ms my $results_by_source_name = $class->_map_namespaces($result_namespace);
# spent 46.4ms making 1 call to DBIx::Class::Schema::_map_namespaces
2291148µs my $resultsets_by_source_name = $class->_map_namespaces($resultset_namespace);
# spent 148µs making 1 call to DBIx::Class::Schema::_map_namespaces
230
231 my @to_register;
232 {
233252µs
# spent 33µs (13+19) within DBIx::Class::Schema::BEGIN@233 which was called: # once (13µs+19µs) by base::import at line 233
no warnings qw/redefine/;
# spent 33µs making 1 call to DBIx::Class::Schema::BEGIN@233 # spent 19µs making 1 call to warnings::unimport
234 local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
235236µs
# spent 22µs (8+14) within DBIx::Class::Schema::BEGIN@235 which was called: # once (8µs+14µs) by base::import at line 235
use warnings qw/redefine/;
# spent 22µs making 1 call to DBIx::Class::Schema::BEGIN@235 # spent 14µs making 1 call to warnings::import
236
237 # ensure classes are loaded and attached in inheritance order
238 for my $result_class (values %$results_by_source_name) {
2391741.80s $class->ensure_class_loaded($result_class);
# spent 1.80s making 174 calls to Class::C3::Componentised::ensure_class_loaded, avg 10.3ms/call
240 }
241 my %inh_idx;
242 my @source_names_by_subclass_last = sort {
243
24417522.3ms ($inh_idx{$a} ||=
# spent 11.4ms making 1 call to DBIx::Class::Schema::CORE:sort # spent 10.8ms making 174 calls to mro::get_linear_isa, avg 62µ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
256 foreach my $source_name (@source_names_by_subclass_last) {
257 my $result_class = $results_by_source_name->{$source_name};
258
25934822.7ms my $preset_resultset_class = $class->_ns_get_rsrc_instance ($result_class)->resultset_class;
# spent 15.8ms making 174 calls to DBIx::Class::ResultSource::resultset_class, avg 91µs/call # spent 6.98ms making 174 calls to DBIx::Class::Schema::_ns_get_rsrc_instance, avg 40µs/call
260 my $found_resultset_class = delete $resultsets_by_source_name->{$source_name};
261
262 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
2791765.05ms my $source_name = $class->_ns_get_rsrc_instance ($result_class)->source_name || $source_name;
# spent 4.87ms making 174 calls to DBIx::Class::Schema::_ns_get_rsrc_instance, avg 28µs/call # spent 179µs making 1 call to DBIx::Class::ResultSource::source_name # spent 900ns making 1 call to DBIx::Class::ResultSource::Table::source_name
280
281 push(@to_register, [ $source_name, $result_class ]);
282 }
283 }
284
28512µs foreach (sort keys %$resultsets_by_source_name) {
# spent 2µs making 1 call to DBIx::Class::Schema::CORE:sort
286 carp "load_namespaces found ResultSet class '$resultsets_by_source_name->{$_}' "
287 .'with no corresponding Result class';
288 }
289
290 Class::C3->reinitialize if DBIx::Class::_ENV_::OLD_MRO;
291
29217464.6ms $class->register_class(@$_) for (@to_register);
# spent 64.6ms making 174 calls to DBIx::Class::Schema::register_class, avg 371µs/call
293
294 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 {
373227µs
# spent 18µs (9+9) within DBIx::Class::Schema::BEGIN@373 which was called: # once (9µs+9µs) by base::import at line 373
no warnings qw/redefine/;
# spent 18µs making 1 call to DBIx::Class::Schema::BEGIN@373 # spent 9µs making 1 call to warnings::unimport
374 local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
375223µs
# spent 15µs (8+7) within DBIx::Class::Schema::BEGIN@375 which was called: # once (8µs+7µs) by base::import at line 375
use warnings qw/redefine/;
# spent 15µs making 1 call to DBIx::Class::Schema::BEGIN@375 # spent 7µ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
5242204mssub connect { shift->clone->connection(@_) }
# spent 154ms making 1 call to DBIx::Class::Schema::connection # spent 49.5ms making 1 call to DBIx::Class::Schema::clone
525
526=head2 resultset
527
528=over 4
529
530=item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name>
531
532=item Return Value: L<$resultset|DBIx::Class::ResultSet>
533
534=back
535
536 my $rs = $schema->resultset('DVD');
537
538Returns the L<DBIx::Class::ResultSet> object for the registered source
539name.
540
541=cut
542
543sub resultset {
54412µs my ($self, $source_name) = @_;
5451500ns $self->throw_exception('resultset() expects a source name')
546 unless defined $source_name;
547113µs62.03ms return $self->source($source_name)->resultset;
# spent 1.87ms making 3 calls to DBIx::Class::ResultSource::resultset, avg 623µs/call # spent 158µs making 3 calls to DBIx::Class::Schema::source, avg 53µ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
56416µs
# spent 20µs (15+6) within DBIx::Class::Schema::sources which was called: # once (15µ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.57ms (2.31+1.26) within DBIx::Class::Schema::source which was called 177 times, avg 20µs/call: # 174 times (2.26ms+1.15ms) by DBIx::Class::Schema::_copy_state_from at line 1029, avg 20µs/call # 3 times (46µs+111µs) by Koha::Objects::search at line 547, avg 53µs/call
sub source {
5841400ns my $self = shift;
585
5861400ns $self->throw_exception("source() expects a source name")
587 unless @_;
588
58911µs my $source_name = shift;
590
59118µs1771.26ms my $sreg = $self->source_registrations;
# spent 1.26ms making 177 calls to DBIx::Class::Schema::source_registrations, avg 7µs/call
59219µ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 154ms (62µs+154) within DBIx::Class::Schema::connection which was called: # once (62µs+154ms) by Koha::Objects::search at line 524
sub connection {
796 my ($self, @info) = @_;
797 return $self if !@info && $self->storage;
798
799243µs my ($storage_class, $args) = ref $self->storage_type
# spent 43µs making 2 calls to DBIx::Class::Schema::storage_type, avg 21µs/call
800 ? $self->_normalize_storage_type($self->storage_type)
801 : $self->storage_type
802 ;
803
80419µs $storage_class =~ s/^::/DBIx::Class::Storage::/;
# spent 9µs making 1 call to DBIx::Class::Schema::CORE:subst
805
806 try {
8071153ms $self->ensure_class_loaded ($storage_class);
# spent 153ms 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 );
8132153ms };
# spent 153ms making 1 call to Try::Tiny::try # spent 9µs making 1 call to Try::Tiny::catch
814
8151599µs my $storage = $storage_class->new( $self => $args||{} );
# spent 599µs making 1 call to DBIx::Class::Storage::DBI::new
8161678µs $storage->connect_info(\@info);
# spent 678µs making 1 call to DBIx::Class::Storage::DBI::connect_info
817124µs $self->storage($storage);
# spent 24µs making 1 call to DBIx::Class::Schema::storage
818 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 {
896247µs
# spent 34µs (20+13) within DBIx::Class::Schema::BEGIN@896 which was called: # once (20µs+13µs) by base::import at line 896
no warnings qw/redefine/;
# spent 34µs making 1 call to DBIx::Class::Schema::BEGIN@896 # spent 13µs making 1 call to warnings::unimport
897 local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
898243µs
# spent 30µs (18+12) within DBIx::Class::Schema::BEGIN@898 which was called: # once (18µs+12µs) by base::import at line 898
use warnings qw/redefine/;
# spent 30µs making 1 call to DBIx::Class::Schema::BEGIN@898 # spent 12µ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 49.5ms (28µs+49.5) within DBIx::Class::Schema::clone which was called: # once (28µs+49.5ms) by Koha::Objects::search at line 524
sub clone {
1005 my $self = shift;
1006
1007 my $clone = {
1008 (ref $self ? %$self : ()),
1009 (@_ == 1 && ref $_[0] eq 'HASH' ? %{ $_[0] } : @_),
1010 };
1011 bless $clone, (ref $self || $self);
1012
1013360µs $clone->$_(undef) for qw/class_mappings source_registrations storage/;
# spent 42µs making 1 call to DBIx::Class::Schema::class_mappings # spent 9µs making 1 call to DBIx::Class::Schema::storage # spent 8µs making 1 call to DBIx::Class::Schema::source_registrations
1014
1015149.4ms $clone->_copy_state_from($self);
# spent 49.4ms making 1 call to DBIx::Class::Schema::_copy_state_from
1016
1017 return $clone;
1018}
1019
1020# Needed in Schema::Loader - if you refactor, please make a compatibility shim
1021# -- Caelum
1022
# spent 49.4ms (12.6+36.8) within DBIx::Class::Schema::_copy_state_from which was called: # once (12.6ms+36.8ms) by DBIx::Class::Schema::clone at line 1015
sub _copy_state_from {
1023 my ($self, $from) = @_;
1024
1025220µs $self->class_mappings({ %{$from->class_mappings} });
# spent 20µs making 2 calls to DBIx::Class::Schema::class_mappings, avg 10µs/call
1026215µs $self->source_registrations({ %{$from->source_registrations} });
# spent 15µs making 2 calls to DBIx::Class::Schema::source_registrations, avg 8µs/call
1027
1028120µs foreach my $source_name ($from->sources) {
# spent 20µs making 1 call to DBIx::Class::Schema::sources
10291743.41ms my $source = $from->source($source_name);
# spent 3.41ms making 174 calls to DBIx::Class::Schema::source, avg 20µs/call
10301743.86ms my $new = $source->new($source);
# spent 3.86ms making 174 calls to DBIx::Class::ResultSource::new, avg 22µ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
103334829.4ms $self->register_extra_source($source_name => $new);
# spent 28.5ms making 174 calls to DBIx::Class::Schema::register_extra_source, avg 164µs/call # spent 942µs making 174 calls to DBIx::Class::ResultSource::DESTROY, avg 5µs/call
1034 }
1035
1036157µs if ($from->storage) {
# spent 57µ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 {
1272236µs
# spent 25µs (14+11) within DBIx::Class::Schema::BEGIN@1272 which was called: # once (14µs+11µs) by base::import at line 1272
no strict 'refs';
# spent 25µs making 1 call to DBIx::Class::Schema::BEGIN@1272 # spent 11µ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 64.6ms (1.40+63.2) within DBIx::Class::Schema::register_class which was called 174 times, avg 371µs/call: # 174 times (1.40ms+63.2ms) by DBIx::Class::Schema::load_namespaces at line 292, avg 371µs/call
sub register_class {
1301 my ($self, $source_name, $to_register) = @_;
130234863.2ms $self->register_source($source_name => $to_register->result_source_instance);
# spent 61.7ms making 174 calls to DBIx::Class::Schema::register_source, avg 355µs/call # spent 14µs making 1 call to Koha::Schema::Result::LanguageScriptMapping::result_source_instance # spent 14µs making 1 call to Koha::Schema::Result::SearchHistory::result_source_instance # spent 14µs making 1 call to Koha::Schema::Result::Virtualshelfshare::result_source_instance # spent 14µs making 1 call to Koha::Schema::Result::Virtualshelve::result_source_instance # spent 14µs making 1 call to Koha::Schema::Result::Browser::result_source_instance # spent 13µs making 1 call to Koha::Schema::Result::Z3950server::result_source_instance # spent 13µs making 1 call to Koha::Schema::Result::CreatorBatch::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::UserPermission::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Suggestion::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Accountoffset::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::OverduerulesTransportType::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::Branch::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::BranchBorrowerCircRule::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::ItemsLastBorrower::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::Aqcontract::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::BorrowerMessagePreference::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::BorrowerSync::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::TagsIndex::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AuthorisedValuesBranch::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::BranchItemRule::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::CourseReserve::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::DefaultBranchCircRule::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::Discharge::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ItemsSearchField::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::Issue::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::RepeatableHoliday::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::BorrowerAttributeTypesBranch::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::BranchTransferLimit::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Deletedbiblio::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ImportRecordMatch::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::LanguageSubtagRegistry::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::PrintersProfile::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AqordersItem::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AudioAlert::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AuthTagStructure::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Branchcategory::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Deletedbiblioitem::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::LanguageDescription::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::LanguageScriptBidi::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::PendingOfflineOperation::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqbasket::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Aqbudget::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::AuthHeader::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Borrower::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::DefaultBorrowerCircRule::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::OldReserve::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Patronimage::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::SpecialHoliday::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::AqordersTransfer::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Biblio::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::CreatorTemplate::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Item::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::NeedMergeAuthority::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::ReportsDictionary::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Aqbasketuser::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AuthorisedValue::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BiblioFramework::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BorrowerAttribute::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::Deletedborrower::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::MatcherMatchpoint::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::OaiSetsDescription::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::PatronListPatron::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Session::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::SubscriptionFrequency::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::Aqbasketgroup::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::Aqorder::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Category::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Collection::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::HoldFillTarget::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ImportRecord::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MessageQueue::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::Printer::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Quote::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::AdditionalField::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::ClassSource::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::Issuingrule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Linktracker::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MarcMatcher::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::MessageTransportType::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::Systempreference::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::Aqbookseller::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AuthType::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::BorrowerFile::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::ImportBatch::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::MarcTagStructure::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Message::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MiscFile::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::PatronList::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::SavedSql::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Subscription::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Subscriptionroutinglist::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::TmpHoldsqueue::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::Aqinvoice::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CollectionsTracking::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ColumnsSetting::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CourseInstructor::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::CreatorImage::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::DefaultBranchItemRule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::LanguageRfc4646ToIso639::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::Subscriptionhistory::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::BorrowerAttributeType::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::BorrowerModification::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::ClassSortRule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ImportBiblio::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Itemtype::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Letter::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Matchpoint::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::SavedReport::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Statistic::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::TagsApproval::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::AdditionalFieldValue::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::AqorderUser::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::MessageAttribute::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::OpacNews::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::UploadedFile::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::Course::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ImportItem::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::OaiSetsMapping::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::Serial::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::Virtualshelfcontent::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Biblioimage::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::MarcModificationTemplate::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::ExportFormat::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::MatchpointComponent::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::DefaultCircRule::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::ImportAuth::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::PluginData::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::TagAll::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Aqbudgetperiod::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
132017461.3ms
# spent 61.7ms (452µs+61.3) within DBIx::Class::Schema::register_source which was called 174 times, avg 355µs/call: # 174 times (452µs+61.3ms) by DBIx::Class::Schema::register_class at line 1302, avg 355µs/call
sub register_source { shift->_register_source(@_) }
# spent 61.3ms making 174 calls to DBIx::Class::Schema::_register_source, avg 352µ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
134917427.9ms
# spent 28.5ms (627µs+27.9) within DBIx::Class::Schema::register_extra_source which was called 174 times, avg 164µs/call: # 174 times (627µs+27.9ms) by DBIx::Class::Schema::_copy_state_from at line 1033, avg 164µs/call
sub register_extra_source { shift->_register_source(@_, { extra => 1 }) }
# spent 27.9ms making 174 calls to DBIx::Class::Schema::_register_source, avg 160µs/call
1350
1351
# spent 89.1ms (59.9+29.2) within DBIx::Class::Schema::_register_source which was called 348 times, avg 256µs/call: # 174 times (37.1ms+24.2ms) by DBIx::Class::Schema::register_source at line 1320, avg 352µs/call # 174 times (22.9ms+5.02ms) by DBIx::Class::Schema::register_extra_source at line 1349, avg 160µs/call
sub _register_source {
1352 my ($self, $source_name, $source, $params) = @_;
1353
13543485.27ms $source = $source->new({ %$source, source_name => $source_name });
# spent 5.27ms making 348 calls to DBIx::Class::ResultSource::new, avg 15µs/call
1355
1356348557µs $source->schema($self);
# spent 557µs making 348 calls to DBIx::Class::ResultSource::schema, avg 2µs/call
1357174174µs weaken $source->{schema} if ref($self);
# spent 174µs making 174 calls to Scalar::Util::weaken, avg 998ns/call
1358
135934810.5ms my %reg = %{$self->source_registrations};
# spent 10.5ms making 348 calls to DBIx::Class::Schema::source_registrations, avg 30µs/call
1360 $reg{$source_name} = $source;
13613482.47ms $self->source_registrations(\%reg);
# spent 2.47ms making 348 calls to DBIx::Class::Schema::source_registrations, avg 7µs/call
1362
1363 return $source if $params->{extra};
1364
13651744.76ms my $rs_class = $source->result_class;
# spent 4.76ms making 174 calls to DBIx::Class::ResultSource::result_class, avg 27µs/call
13663484.94ms if ($rs_class and my $rsrc = try { $rs_class->result_source_instance } ) {
# spent 3.74ms making 174 calls to Try::Tiny::try, avg 21µs/call # spent 18µs making 1 call to Koha::Schema::Result::DefaultCircRule::result_source_instance # spent 17µs making 1 call to Koha::Schema::Result::Notify::result_source_instance # spent 14µs making 1 call to Koha::Schema::Result::Suggestion::result_source_instance # spent 13µs making 1 call to Koha::Schema::Result::Browser::result_source_instance # spent 12µs making 1 call to Koha::Schema::Result::Aqbudgetperiod::result_source_instance # spent 12µs making 1 call to Koha::Schema::Result::BranchItemRule::result_source_instance # spent 12µs making 1 call to Koha::Schema::Result::LanguageScriptMapping::result_source_instance # spent 12µs making 1 call to Koha::Schema::Result::Virtualshelfshare::result_source_instance # spent 12µs making 1 call to Koha::Schema::Result::Stopword::result_source_instance # spent 11µs making 1 call to Koha::Schema::Result::Subscriptionroutinglist::result_source_instance # spent 10µs making 1 call to Koha::Schema::Result::CreatorBatch::result_source_instance # spent 9µs making 1 call to Koha::Schema::Result::Serial::result_source_instance # spent 8µs making 1 call to Koha::Schema::Result::Permission::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Issue::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::Deleteditem::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::Biblioitem::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::LanguageDescription::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::Z3950server::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BorrowerAttributeType::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::BorrowerDebarment::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Deletedborrower::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::OldReserve::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::PendingOfflineOperation::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::PrintersProfile::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::TagsIndex::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::BranchBorrowerCircRule::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::CreatorLayout::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::OverduerulesTransportType::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::SavedSql::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::SubscriptionFrequency::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::SubscriptionNumberpattern::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AqordersItem::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::AuthTagStructure::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::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::LanguageScriptBidi::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::SpecialHoliday::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::Aqbudget::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AqbudgetsPlanning::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::AuthHeader::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::AuthorisedValuesBranch::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::BorrowerAttribute::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::Branchcategory::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::CategoriesBranch::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::ClassSortRule::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::ItemCirculationAlertPreference::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::LanguageSubtagRegistry::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Localization::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::MatcherMatchpoint::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::Quote::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::Systempreference::result_source_instance # spent 7µs making 1 call to Koha::Schema::Result::Virtualshelve::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqbasketgroup::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqbasketuser::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqbookseller::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::AuthSubfieldStructure::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::Branchtransfer::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::CourseReserve::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Deletedbiblio::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::ImportRecord::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ItemsLastBorrower::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MarcModificationTemplate::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MarcModificationTemplateAction::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::NeedMergeAuthority::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::OpacNews::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::UserPermission::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Accountline::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::AuthorisedValue::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Category::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::City::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CollectionsTracking::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CourseInstructor::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CreatorImage::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::DefaultBranchItemRule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Deletedbiblioitem::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ExportFormat::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::HoldFillTarget::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Issuingrule::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::LanguageRfc4646ToIso639::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Linktracker::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MarcSubfieldStructure::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::MatchpointComponentNorm::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::OaiSetsBiblio::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::OaiSetsMapping::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::Rating::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::SavedReport::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ServicesThrottle::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Tag::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::TagsApproval::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::TransportCost::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::UploadedFile::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Accountoffset::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::AdditionalFieldValue::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::Aqbasket::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqbudgetborrower::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqcontact::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::AuthType::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Biblioimage::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Borrower::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::BorrowerFile::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Branch::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Collection::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::ColumnsSetting::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::CourseItem::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::ImportRecordMatch::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::Letter::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Matchcheck::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Matchpoint::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MatchpointComponent::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MessageAttribute::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MessageTransport::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::PatronList::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Printer::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::Statistic::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Subscriptionhistory::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::TagAll::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::Zebraqueue::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AdditionalField::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Biblio::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Currency::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Item::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::OaiSet::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::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::SocialData::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Subscription::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Branchrelation::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::ImportBatch::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::PatronListPatron::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::PluginData::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Session::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::Message::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::AqorderUser::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Userflag::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::Aqorder::result_source_instance # spent 6µs making 1 call to Koha::Schema::Result::MiscFile::result_source_instance
1367174919µs my %map = %{$self->class_mappings};
# spent 919µs making 174 calls to DBIx::Class::Schema::class_mappings, avg 5µs/call
1368 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
1382 $map{$rs_class} = $source_name;
1383174882µs $self->class_mappings(\%map);
# spent 882µs making 174 calls to DBIx::Class::Schema::class_mappings, avg 5µs/call
1384 }
1385
1386 return $source;
1387}
1388
1389my $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
15231259µs1;
# spent 259µs making 1 call to B::Hooks::EndOfScope::XS::__ANON__
 
# spent 109µs within DBIx::Class::Schema::CORE:match which was called 174 times, avg 625ns/call: # 174 times (109µs+0s) by DBIx::Class::Schema::_findallmod at line 167, avg 625ns/call
sub DBIx::Class::Schema::CORE:match; # opcode
# spent 11.4ms (570µs+10.8) within DBIx::Class::Schema::CORE:sort which was called 2 times, avg 5.71ms/call: # once (568µs+10.8ms) by DBIx::Class::Schema::load_namespaces at line 244 # once (2µs+0s) by DBIx::Class::Schema::load_namespaces at line 285
sub DBIx::Class::Schema::CORE:sort; # opcode
# spent 11µs within DBIx::Class::Schema::CORE:subst which was called 3 times, avg 4µs/call: # 2 times (2µs+0s) by DBIx::Class::Schema::_expand_relative_name at line 158, avg 1µs/call # once (9µs+0s) by DBIx::Class::Schema::connection at line 804
sub DBIx::Class::Schema::CORE:subst; # opcode