Filename | /2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/DBIx/Class/InflateColumn/DateTime.pm |
Statements | Executed 4106 statements in 11.6ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
147 | 1 | 1 | 3.86ms | 59.4ms | _flate_or_fallback | DBIx::Class::InflateColumn::DateTime::
119 | 1 | 1 | 2.18ms | 20.3ms | register_column | DBIx::Class::InflateColumn::DateTime::
147 | 1 | 1 | 1.61ms | 62.5ms | __ANON__[:187] | DBIx::Class::InflateColumn::DateTime::
147 | 1 | 1 | 1.42ms | 15.3ms | _datetime_parser | DBIx::Class::InflateColumn::DateTime::
147 | 1 | 1 | 818µs | 60.2ms | _deflate_from_datetime | DBIx::Class::InflateColumn::DateTime::
147 | 1 | 1 | 664µs | 664µs | _pre_deflate_datetime | DBIx::Class::InflateColumn::DateTime::
147 | 1 | 1 | 646µs | 37.4ms | __ANON__[:202] | DBIx::Class::InflateColumn::DateTime::
119 | 1 | 1 | 190µs | 190µs | CORE:match (opcode) | DBIx::Class::InflateColumn::DateTime::
1 | 1 | 1 | 15µs | 95µs | BEGIN@5 | DBIx::Class::InflateColumn::DateTime::
1 | 1 | 1 | 13µs | 16µs | BEGIN@3 | DBIx::Class::InflateColumn::DateTime::
1 | 1 | 1 | 11µs | 58µs | BEGIN@7 | DBIx::Class::InflateColumn::DateTime::
1 | 1 | 1 | 11µs | 21µs | BEGIN@4 | DBIx::Class::InflateColumn::DateTime::
1 | 1 | 1 | 9µs | 99µs | BEGIN@6 | DBIx::Class::InflateColumn::DateTime::
1 | 1 | 1 | 7µs | 207µs | BEGIN@8 | DBIx::Class::InflateColumn::DateTime::
0 | 0 | 0 | 0s | 0s | __ANON__[:181] | DBIx::Class::InflateColumn::DateTime::
0 | 0 | 0 | 0s | 0s | __ANON__[:207] | DBIx::Class::InflateColumn::DateTime::
0 | 0 | 0 | 0s | 0s | _inflate_to_datetime | DBIx::Class::InflateColumn::DateTime::
0 | 0 | 0 | 0s | 0s | _post_inflate_datetime | DBIx::Class::InflateColumn::DateTime::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package DBIx::Class::InflateColumn::DateTime; | ||||
2 | |||||
3 | 3 | 23µs | 2 | 19µ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 # spent 16µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@3
# spent 3µs making 1 call to strict::import |
4 | 3 | 20µs | 2 | 30µ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 # spent 21µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@4
# spent 9µs making 1 call to warnings::import |
5 | 3 | 28µs | 2 | 174µ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 # spent 95µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@5
# spent 80µs making 1 call to base::import |
6 | 3 | 22µs | 2 | 189µ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 # spent 99µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@6
# spent 90µs making 1 call to DBIx::Class::Carp::import |
7 | 3 | 23µs | 2 | 104µ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 # spent 58µs making 1 call to DBIx::Class::InflateColumn::DateTime::BEGIN@7
# spent 46µs making 1 call to Exporter::import |
8 | 3 | 676µs | 2 | 408µ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 # 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 | |||||
12 | DBIx::Class::InflateColumn::DateTime - Auto-create DateTime objects from date and datetime columns. | ||||
13 | |||||
14 | =head1 SYNOPSIS | ||||
15 | |||||
16 | Load this component and then declare one or more | ||||
17 | columns 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 | |||||
28 | Then 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 | |||||
33 | If 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 | |||||
39 | If you want to inflate no matter what data_type your column is, | ||||
40 | use 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 | |||||
50 | It's also possible to explicitly skip inflation: | ||||
51 | |||||
52 | __PACKAGE__->add_columns( | ||||
53 | starts_when => { data_type => 'datetime', inflate_datetime => 0 } | ||||
54 | ); | ||||
55 | |||||
56 | NOTE: Don't rely on C<InflateColumn::DateTime> to parse date strings for you. | ||||
57 | The column is set directly for any non-references and C<InflateColumn::DateTime> | ||||
58 | is completely bypassed. Instead, use an input parser to create a DateTime | ||||
59 | object. For instance, if your user input comes as a 'YYYY-MM-DD' string, you can | ||||
60 | use 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 | |||||
67 | This module figures out the type of DateTime::Format::* class to | ||||
68 | inflate/deflate with based on the type of DBIx::Class::Storage::DBI::* | ||||
69 | that you are using. If you switch from one database to a different | ||||
70 | one your code should continue to work without modification (though note | ||||
71 | that this feature is new as of 0.07, so it may not be perfect yet - bug | ||||
72 | reports to the list very much welcome). | ||||
73 | |||||
74 | If the data_type of a field is C<date>, C<datetime> or C<timestamp> (or | ||||
75 | a derivative of these datatypes, e.g. C<timestamp with timezone>), this | ||||
76 | module will automatically call the appropriate parse/format method for | ||||
77 | deflation/inflation as defined in the storage class. For instance, for | ||||
78 | a C<datetime> field the methods C<parse_datetime> and C<format_datetime> | ||||
79 | would be called on deflation/inflation. If the storage class does not | ||||
80 | provide a specialized inflator/deflator, C<[parse|format]_datetime> will | ||||
81 | be used as a fallback. See L<DateTime::Format> for more information on | ||||
82 | date formatting. | ||||
83 | |||||
84 | For more help with using components, see L<DBIx::Class::Manual::Component/USING>. | ||||
85 | |||||
86 | =cut | ||||
87 | |||||
88 | 1 | 9µs | 1 | 0s | __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 | |||||
92 | Chains with the L<DBIx::Class::Row/register_column> method, and sets | ||||
93 | up datetime columns appropriately. This would not normally be | ||||
94 | directly called by end users. | ||||
95 | |||||
96 | In the case of an invalid date, L<DateTime> will throw an exception. To | ||||
97 | bypass these exceptions and just have the inflation return undef, use | ||||
98 | the 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 | ||||
111 | 935 | 1.64ms | my ($self, $column, $info, @rest) = @_; | ||
112 | |||||
113 | 119 | 863µs | $self->next::method($column, $info, @rest); # spent 863µs making 119 calls to next::method, avg 7µs/call | ||
114 | |||||
115 | my $requested_type; | ||||
116 | for (qw/datetime timestamp date/) { | ||||
117 | 714 | 320µs | my $key = "inflate_${_}"; | ||
118 | if (exists $info->{$key}) { | ||||
119 | |||||
120 | # this bailout is intentional | ||||
121 | return unless $info->{$key}; | ||||
122 | |||||
123 | $requested_type = $_; | ||||
124 | last; | ||||
125 | } | ||||
126 | } | ||||
127 | |||||
128 | return if (!$requested_type and !$info->{data_type}); | ||||
129 | |||||
130 | my $data_type = lc( $info->{data_type} || '' ); | ||||
131 | |||||
132 | # _ic_dt_method will follow whatever the registration requests | ||||
133 | # thus = instead of ||= | ||||
134 | 85 | 176µs | 119 | 190µ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 { | ||||
150 | return; | ||||
151 | } | ||||
152 | |||||
153 | 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 | ||||
164 | 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 | ||||
183 | 441 | 1.24ms | my ($value, $obj) = @_; | ||
184 | |||||
185 | 147 | 664µ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 | ||
186 | 147 | 60.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 | } | ||||
189 | 34 | 5.29ms | ); # spent 5.29ms making 34 calls to DBIx::Class::InflateColumn::inflate_column, avg 156µs/call | ||
190 | } | ||||
191 | |||||
192 | sub _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 | ||||
194 | 735 | 4.11ms | my( $self, $value, $info, $method_fmt ) = @_; | ||
195 | |||||
196 | 147 | 15.3ms | my $parser = $self->_datetime_parser; # spent 15.3ms making 147 calls to DBIx::Class::InflateColumn::DateTime::_datetime_parser, avg 104µs/call | ||
197 | my $preferred_method = sprintf($method_fmt, $info->{ _ic_dt_method }); | ||||
198 | 147 | 659µ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 | ||||
201 | 147 | 582µs | 147 | 36.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 | ||||
207 | 294 | 39.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 | |||||
210 | sub _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 | ||||
216 | 294 | 833µs | my( $self, $value, $info ) = @_; | ||
217 | 147 | 59.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 | ||||
221 | 147 | 1.10ms | 441 | 13.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 | |||||
224 | sub _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 | ||||
234 | 588 | 828µs | my( $self, $dt, $info ) = @_; | ||
235 | |||||
236 | 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 | |||||
246 | $dt->set_locale($info->{locale}) if defined $info->{locale}; | ||||
247 | |||||
248 | return $dt; | ||||
249 | } | ||||
250 | |||||
251 | 1 | 3µs | 1; | ||
252 | 1 | 8µs | 1 | 412µs | __END__ # spent 412µs making 1 call to B::Hooks::EndOfScope::__ANON__[B/Hooks/EndOfScope.pm:26] |
# 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 |