← Index
NYTProf Performance Profile   « block view • line view • sub view »
For xt/tapper-mcp-scheduler-with-db-longrun.t
  Run on Tue May 22 17:18:39 2012
Reported on Tue May 22 17:23:54 2012

Filename/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/DBIx/Class/InflateColumn/DateTime.pm
StatementsExecuted 4106 statements in 11.6ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
147113.86ms59.4msDBIx::Class::InflateColumn::DateTime::::_flate_or_fallbackDBIx::Class::InflateColumn::DateTime::_flate_or_fallback
119112.18ms20.3msDBIx::Class::InflateColumn::DateTime::::register_columnDBIx::Class::InflateColumn::DateTime::register_column
147111.61ms62.5msDBIx::Class::InflateColumn::DateTime::::__ANON__[:187]DBIx::Class::InflateColumn::DateTime::__ANON__[:187]
147111.42ms15.3msDBIx::Class::InflateColumn::DateTime::::_datetime_parserDBIx::Class::InflateColumn::DateTime::_datetime_parser
14711818µs60.2msDBIx::Class::InflateColumn::DateTime::::_deflate_from_datetimeDBIx::Class::InflateColumn::DateTime::_deflate_from_datetime
14711664µs664µsDBIx::Class::InflateColumn::DateTime::::_pre_deflate_datetimeDBIx::Class::InflateColumn::DateTime::_pre_deflate_datetime
14711646µs37.4msDBIx::Class::InflateColumn::DateTime::::__ANON__[:202]DBIx::Class::InflateColumn::DateTime::__ANON__[:202]
11911190µs190µsDBIx::Class::InflateColumn::DateTime::::CORE:matchDBIx::Class::InflateColumn::DateTime::CORE:match (opcode)
11115µs95µsDBIx::Class::InflateColumn::DateTime::::BEGIN@5DBIx::Class::InflateColumn::DateTime::BEGIN@5
11113µs16µsDBIx::Class::InflateColumn::DateTime::::BEGIN@3DBIx::Class::InflateColumn::DateTime::BEGIN@3
11111µs58µsDBIx::Class::InflateColumn::DateTime::::BEGIN@7DBIx::Class::InflateColumn::DateTime::BEGIN@7
11111µs21µsDBIx::Class::InflateColumn::DateTime::::BEGIN@4DBIx::Class::InflateColumn::DateTime::BEGIN@4
1119µs99µsDBIx::Class::InflateColumn::DateTime::::BEGIN@6DBIx::Class::InflateColumn::DateTime::BEGIN@6
1117µs207µsDBIx::Class::InflateColumn::DateTime::::BEGIN@8DBIx::Class::InflateColumn::DateTime::BEGIN@8
0000s0sDBIx::Class::InflateColumn::DateTime::::__ANON__[:181]DBIx::Class::InflateColumn::DateTime::__ANON__[:181]
0000s0sDBIx::Class::InflateColumn::DateTime::::__ANON__[:207]DBIx::Class::InflateColumn::DateTime::__ANON__[:207]
0000s0sDBIx::Class::InflateColumn::DateTime::::_inflate_to_datetimeDBIx::Class::InflateColumn::DateTime::_inflate_to_datetime
0000s0sDBIx::Class::InflateColumn::DateTime::::_post_inflate_datetimeDBIx::Class::InflateColumn::DateTime::_post_inflate_datetime
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::InflateColumn::DateTime;
2
3323µs219µs
# spent 16µs (13+3) within DBIx::Class::InflateColumn::DateTime::BEGIN@3 which was called: # once (13µs+3µs) by Class::C3::Componentised::ensure_class_loaded at line 3
use strict;
# spent 16µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@3 # spent 3µs making 1 call to strict::import
4320µs230µs
# spent 21µs (11+9) within DBIx::Class::InflateColumn::DateTime::BEGIN@4 which was called: # once (11µs+9µs) by Class::C3::Componentised::ensure_class_loaded at line 4
use warnings;
# spent 21µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@4 # spent 9µs making 1 call to warnings::import
5328µs2174µs
# spent 95µs (15+80) within DBIx::Class::InflateColumn::DateTime::BEGIN@5 which was called: # once (15µs+80µs) by Class::C3::Componentised::ensure_class_loaded at line 5
use base qw/DBIx::Class/;
# spent 95µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@5 # spent 80µs making 1 call to base::import
6322µs2189µs
# spent 99µs (9+90) within DBIx::Class::InflateColumn::DateTime::BEGIN@6 which was called: # once (9µs+90µs) by Class::C3::Componentised::ensure_class_loaded at line 6
use DBIx::Class::Carp;
# spent 99µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@6 # spent 90µs making 1 call to DBIx::Class::Carp::import
7323µs2104µs
# spent 58µs (11+46) within DBIx::Class::InflateColumn::DateTime::BEGIN@7 which was called: # once (11µs+46µs) by Class::C3::Componentised::ensure_class_loaded at line 7
use Try::Tiny;
# spent 58µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@7 # spent 46µs making 1 call to Exporter::import
83676µs2408µs
# spent 207µs (7+201) within DBIx::Class::InflateColumn::DateTime::BEGIN@8 which was called: # once (7µs+201µs) by Class::C3::Componentised::ensure_class_loaded at line 8
use namespace::clean;
# spent 207µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@8 # spent 201µs making 1 call to namespace::clean::import
9
10=head1 NAME
11
12DBIx::Class::InflateColumn::DateTime - Auto-create DateTime objects from date and datetime columns.
13
14=head1 SYNOPSIS
15
16Load this component and then declare one or more
17columns to be of the datetime, timestamp or date datatype.
18
19 package Event;
20 use base 'DBIx::Class::Core';
21
22 __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
23 __PACKAGE__->add_columns(
24 starts_when => { data_type => 'datetime' }
25 create_date => { data_type => 'date' }
26 );
27
28Then you can treat the specified column as a L<DateTime> object.
29
30 print "This event starts the month of ".
31 $event->starts_when->month_name();
32
33If you want to set a specific timezone and locale for that field, use:
34
35 __PACKAGE__->add_columns(
36 starts_when => { data_type => 'datetime', timezone => "America/Chicago", locale => "de_DE" }
37 );
38
39If you want to inflate no matter what data_type your column is,
40use inflate_datetime or inflate_date:
41
42 __PACKAGE__->add_columns(
43 starts_when => { data_type => 'varchar', inflate_datetime => 1 }
44 );
45
46 __PACKAGE__->add_columns(
47 starts_when => { data_type => 'varchar', inflate_date => 1 }
48 );
49
50It's also possible to explicitly skip inflation:
51
52 __PACKAGE__->add_columns(
53 starts_when => { data_type => 'datetime', inflate_datetime => 0 }
54 );
55
56NOTE: Don't rely on C<InflateColumn::DateTime> to parse date strings for you.
57The column is set directly for any non-references and C<InflateColumn::DateTime>
58is completely bypassed. Instead, use an input parser to create a DateTime
59object. For instance, if your user input comes as a 'YYYY-MM-DD' string, you can
60use C<DateTime::Format::ISO8601> thusly:
61
62 use DateTime::Format::ISO8601;
63 my $dt = DateTime::Format::ISO8601->parse_datetime('YYYY-MM-DD');
64
65=head1 DESCRIPTION
66
67This module figures out the type of DateTime::Format::* class to
68inflate/deflate with based on the type of DBIx::Class::Storage::DBI::*
69that you are using. If you switch from one database to a different
70one your code should continue to work without modification (though note
71that this feature is new as of 0.07, so it may not be perfect yet - bug
72reports to the list very much welcome).
73
74If the data_type of a field is C<date>, C<datetime> or C<timestamp> (or
75a derivative of these datatypes, e.g. C<timestamp with timezone>), this
76module will automatically call the appropriate parse/format method for
77deflation/inflation as defined in the storage class. For instance, for
78a C<datetime> field the methods C<parse_datetime> and C<format_datetime>
79would be called on deflation/inflation. If the storage class does not
80provide a specialized inflator/deflator, C<[parse|format]_datetime> will
81be used as a fallback. See L<DateTime::Format> for more information on
82date formatting.
83
84For more help with using components, see L<DBIx::Class::Manual::Component/USING>.
85
86=cut
87
8819µs10s__PACKAGE__->load_components(qw/InflateColumn/);
# spent 202µs making 1 call to Class::C3::Componentised::load_components, recursion: max depth 1, sum of overlapping time 202µs
89
90=head2 register_column
91
92Chains with the L<DBIx::Class::Row/register_column> method, and sets
93up datetime columns appropriately. This would not normally be
94directly called by end users.
95
96In the case of an invalid date, L<DateTime> will throw an exception. To
97bypass these exceptions and just have the inflation return undef, use
98the C<datetime_undef_if_invalid> option in the column info:
99
100 "broken_date",
101 {
102 data_type => "datetime",
103 default_value => '0000-00-00',
104 is_nullable => 1,
105 datetime_undef_if_invalid => 1
106 }
107
108=cut
109
110
# spent 20.3ms (2.18+18.1) within DBIx::Class::InflateColumn::DateTime::register_column which was called 119 times, avg 171µs/call: # 119 times (2.18ms+18.1ms) by DBIx::Class::ResultSourceProxy::add_columns at line 34 of DBIx/Class/ResultSourceProxy.pm, avg 171µs/call
sub register_column {
11111991µs my ($self, $column, $info, @rest) = @_;
112
113119189µs119863µs $self->next::method($column, $info, @rest);
# spent 863µs making 119 calls to next::method, avg 7µs/call
114
11511919µs my $requested_type;
11611978µs for (qw/datetime timestamp date/) {
117357124µs my $key = "inflate_${_}";
118357196µs if (exists $info->{$key}) {
119
120 # this bailout is intentional
121 return unless $info->{$key};
122
123 $requested_type = $_;
124 last;
125 }
126 }
127
12811946µs return if (!$requested_type and !$info->{data_type});
129
13011963µs my $data_type = lc( $info->{data_type} || '' );
131
132 # _ic_dt_method will follow whatever the registration requests
133 # thus = instead of ||=
134119486µs119190µs if ($data_type eq 'timestamp with time zone' || $data_type eq 'timestamptz') {
# spent 190µs making 119 calls to DBIx::Class::InflateColumn::DateTime::CORE:match, avg 2µs/call
135 $info->{_ic_dt_method} = 'timestamp_with_timezone';
136 }
137 elsif ($data_type eq 'timestamp without time zone') {
138 $info->{_ic_dt_method} = 'timestamp_without_timezone';
139 }
140 elsif ($data_type eq 'smalldatetime') {
141 $info->{_ic_dt_method} = 'smalldatetime';
142 }
143 elsif ($data_type =~ /^ (?: date | datetime | timestamp ) $/x) {
144 $info->{_ic_dt_method} = $data_type;
145 }
146 elsif ($requested_type) {
147 $info->{_ic_dt_method} = $requested_type;
148 }
149 else {
15085176µs return;
151 }
152
1533412µs if ($info->{extra}) {
154 for my $slot (qw/timezone locale floating_tz_ok/) {
155 if ( defined $info->{extra}{$slot} ) {
156 carp "Putting $slot into extra => { $slot => '...' } has been deprecated, ".
157 "please put it directly into the '$column' column definition.";
158 $info->{$slot} = $info->{extra}{$slot} unless defined $info->{$slot};
159 }
160 }
161 }
162
163 # shallow copy to avoid unfounded(?) Devel::Cycle complaints
1643495µs my $infcopy = {%$info};
165
166 $self->inflate_column(
167 $column =>
168 {
169 inflate => sub {
170 my ($value, $obj) = @_;
171
172 # propagate for error reporting
173 $infcopy->{__dbic_colname} = $column;
174
175 my $dt = $obj->_inflate_to_datetime( $value, $infcopy );
176
177 return (defined $dt)
178 ? $obj->_post_inflate_datetime( $dt, $infcopy )
179 : undef
180 ;
181 },
182
# spent 62.5ms (1.61+60.9) within DBIx::Class::InflateColumn::DateTime::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/DBIx/Class/InflateColumn/DateTime.pm:187] which was called 147 times, avg 425µs/call: # 147 times (1.61ms+60.9ms) by DBIx::Class::InflateColumn::_deflated_column at line 114 of DBIx/Class/InflateColumn.pm, avg 425µs/call
deflate => sub {
183147110µs my ($value, $obj) = @_;
184
185147408µs147664µs $value = $obj->_pre_deflate_datetime( $value, $infcopy );
# spent 664µs making 147 calls to DBIx::Class::InflateColumn::DateTime::_pre_deflate_datetime, avg 5µs/call
186147725µs14760.2ms $obj->_deflate_from_datetime( $value, $infcopy );
# spent 60.2ms making 147 calls to DBIx::Class::InflateColumn::DateTime::_deflate_from_datetime, avg 410µs/call
187 },
188 }
18934563µs345.29ms );
# spent 5.29ms making 34 calls to DBIx::Class::InflateColumn::inflate_column, avg 156µs/call
190}
191
192sub _flate_or_fallback
193
# spent 59.4ms (3.86+55.6) within DBIx::Class::InflateColumn::DateTime::_flate_or_fallback which was called 147 times, avg 404µs/call: # 147 times (3.86ms+55.6ms) by DBIx::Class::InflateColumn::DateTime::_deflate_from_datetime at line 217, avg 404µs/call
{
194147168µs my( $self, $value, $info, $method_fmt ) = @_;
195
196147352µs14715.3ms my $parser = $self->_datetime_parser;
# spent 15.3ms making 147 calls to DBIx::Class::InflateColumn::DateTime::_datetime_parser, avg 104µs/call
197147709µs my $preferred_method = sprintf($method_fmt, $info->{ _ic_dt_method });
1981471.39ms147659µs my $method = $parser->can($preferred_method) || sprintf($method_fmt, 'datetime');
# spent 659µs making 147 calls to UNIVERSAL::can, avg 4µs/call
199
200
# spent 37.4ms (646µs+36.8) within DBIx::Class::InflateColumn::DateTime::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/DBIx/Class/InflateColumn/DateTime.pm:202] which was called 147 times, avg 254µs/call: # 147 times (646µs+36.8ms) by Try::Tiny::try at line 71 of Try/Tiny.pm, avg 254µs/call
return try {
201147582µs14736.8ms $parser->$method($value);
# spent 36.8ms making 147 calls to DateTime::Format::SQLite::format_datetime, avg 250µs/call
202 }
203 catch {
204 $self->throw_exception ("Error while inflating ${value} for $info->{__dbic_colname} on ${self}: $_")
205 unless $info->{datetime_undef_if_invalid};
206 undef; # rv
2071471.48ms29439.6ms };
# spent 39.2ms making 147 calls to Try::Tiny::try, avg 267µs/call # spent 408µs making 147 calls to Try::Tiny::catch, avg 3µs/call
208}
209
210sub _inflate_to_datetime {
211 my( $self, $value, $info ) = @_;
212 return $self->_flate_or_fallback( $value, $info, 'parse_%s' );
213}
214
215
# spent 60.2ms (818µs+59.4) within DBIx::Class::InflateColumn::DateTime::_deflate_from_datetime which was called 147 times, avg 410µs/call: # 147 times (818µs+59.4ms) by DBIx::Class::InflateColumn::DateTime::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/DBIx/Class/InflateColumn/DateTime.pm:187] at line 186, avg 410µs/call
sub _deflate_from_datetime {
216147114µs my( $self, $value, $info ) = @_;
217147719µs14759.4ms return $self->_flate_or_fallback( $value, $info, 'format_%s' );
# spent 59.4ms making 147 calls to DBIx::Class::InflateColumn::DateTime::_flate_or_fallback, avg 404µs/call
218}
219
220
# spent 15.3ms (1.42+13.9) within DBIx::Class::InflateColumn::DateTime::_datetime_parser which was called 147 times, avg 104µs/call: # 147 times (1.42ms+13.9ms) by DBIx::Class::InflateColumn::DateTime::_flate_or_fallback at line 196, avg 104µs/call
sub _datetime_parser {
2211471.10ms44113.9ms shift->result_source->storage->datetime_parser (@_);
# spent 11.3ms making 147 calls to DBIx::Class::Storage::DBI::datetime_parser, avg 77µs/call # spent 2.27ms making 147 calls to DBIx::Class::ResultSource::storage, avg 15µs/call # spent 262µs making 147 calls to DBIx::Class::Row::result_source, avg 2µs/call
222}
223
224sub _post_inflate_datetime {
225 my( $self, $dt, $info ) = @_;
226
227 $dt->set_time_zone($info->{timezone}) if defined $info->{timezone};
228 $dt->set_locale($info->{locale}) if defined $info->{locale};
229
230 return $dt;
231}
232
233
# spent 664µs within DBIx::Class::InflateColumn::DateTime::_pre_deflate_datetime which was called 147 times, avg 5µs/call: # 147 times (664µs+0s) by DBIx::Class::InflateColumn::DateTime::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/DBIx/Class/InflateColumn/DateTime.pm:187] at line 185, avg 5µs/call
sub _pre_deflate_datetime {
234147106µs my( $self, $dt, $info ) = @_;
235
236147145µs if (defined $info->{timezone}) {
237 carp "You're using a floating timezone, please see the documentation of"
238 . " DBIx::Class::InflateColumn::DateTime for an explanation"
239 if ref( $dt->time_zone ) eq 'DateTime::TimeZone::Floating'
240 and not $info->{floating_tz_ok}
241 and not $ENV{DBIC_FLOATING_TZ_OK};
242
243 $dt->set_time_zone($info->{timezone});
244 }
245
24614788µs $dt->set_locale($info->{locale}) if defined $info->{locale};
247
248147489µs return $dt;
249}
250
25113µs1;
25218µs1412µs__END__
 
# spent 190µs within DBIx::Class::InflateColumn::DateTime::CORE:match which was called 119 times, avg 2µs/call: # 119 times (190µs+0s) by DBIx::Class::InflateColumn::DateTime::register_column at line 134, avg 2µs/call
sub DBIx::Class::InflateColumn::DateTime::CORE:match; # opcode