X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FInflateColumn%2FDateTime.pm;h=4f08c1f147c2e58295dc7728c03a6957aedd241e;hb=eef9b484;hp=1b72ac64b72b83cbedc425b96bffc2290336b9c7;hpb=70c288086248e5a4008490df22a56632341f2473;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/InflateColumn/DateTime.pm b/lib/DBIx/Class/InflateColumn/DateTime.pm index 1b72ac6..4f08c1f 100644 --- a/lib/DBIx/Class/InflateColumn/DateTime.pm +++ b/lib/DBIx/Class/InflateColumn/DateTime.pm @@ -4,6 +4,7 @@ use strict; use warnings; use base qw/DBIx::Class/; use DBIx::Class::Carp; +use DBIx::Class::_Util 'dbic_internal_try'; use Try::Tiny; use namespace::clean; @@ -30,12 +31,16 @@ Then you can treat the specified column as a L object. print "This event starts the month of ". $event->starts_when->month_name(); -If you want to set a specific timezone and locale for that field, use: +If you want to set a specific time zone and locale for that field, use: __PACKAGE__->add_columns( - starts_when => { data_type => 'datetime', timezone => "America/Chicago", locale => "de_DE" } + starts_when => { data_type => 'datetime', time_zone => "America/Chicago", locale => "de_DE" } ); +Note: DBIC before 0.082900 only accepted C, and silently discarded +any C arguments. For backwards compatibility, C will +continue being accepted as a synonym for C. + If you want to inflate no matter what data_type your column is, use inflate_datetime or inflate_date: @@ -72,14 +77,14 @@ that this feature is new as of 0.07, so it may not be perfect yet - bug reports to the list very much welcome). If the data_type of a field is C, C or C (or -a derivative of these datatypes, e.g. C), this +a derivative of these datatypes, e.g. C), this module will automatically call the appropriate parse/format method for deflation/inflation as defined in the storage class. For instance, for a C field the methods C and C would be called on deflation/inflation. If the storage class does not provide a specialized inflator/deflator, C<[parse|format]_datetime> will -be used as a fallback. See L for more information on -date formatting. +be used as a fallback. See L +for more information on date formatting. For more help with using components, see L. @@ -151,7 +156,7 @@ sub register_column { } if ($info->{extra}) { - for my $slot (qw/timezone locale floating_tz_ok/) { + for my $slot (qw/time_zone timezone locale floating_tz_ok/) { if ( defined $info->{extra}{$slot} ) { carp "Putting $slot into extra => { $slot => '...' } has been deprecated, ". "please put it directly into the '$column' column definition."; @@ -160,6 +165,12 @@ sub register_column { } } + if ( defined $info->{timezone} ) { + $self->throw_exception("Cannot specify both 'timezone' and 'time_zone' in '$column' column defintion.") + if defined $info->{time_zone}; + $info->{time_zone} = delete $info->{timezone}; + } + # shallow copy to avoid unfounded(?) Devel::Cycle complaints my $infcopy = {%$info}; @@ -169,13 +180,10 @@ sub register_column { inflate => sub { my ($value, $obj) = @_; - my $dt = try - { $obj->_inflate_to_datetime( $value, $infcopy ) } - catch { - $self->throw_exception ("Error while inflating ${value} for ${column} on ${self}: $_") - unless $infcopy->{datetime_undef_if_invalid}; - undef; # rv - }; + # propagate for error reporting + $infcopy->{__dbic_colname} = $column; + + my $dt = $obj->_inflate_to_datetime( $value, $infcopy ); return (defined $dt) ? $obj->_post_inflate_datetime( $dt, $infcopy ) @@ -198,8 +206,16 @@ sub _flate_or_fallback my $parser = $self->_datetime_parser; my $preferred_method = sprintf($method_fmt, $info->{ _ic_dt_method }); - my $method = $parser->can($preferred_method) ? $preferred_method : sprintf($method_fmt, 'datetime'); - return $parser->$method($value); + my $method = $parser->can($preferred_method) || sprintf($method_fmt, 'datetime'); + + return dbic_internal_try { + $parser->$method($value); + } + catch { + $self->throw_exception ("Error while inflating '$value' for $info->{__dbic_colname} on ${self}: $_") + unless $info->{datetime_undef_if_invalid}; + undef; # rv + }; } sub _inflate_to_datetime { @@ -213,13 +229,13 @@ sub _deflate_from_datetime { } sub _datetime_parser { - shift->result_source->storage->datetime_parser (@_); + shift->result_source->schema->storage->datetime_parser (@_); } sub _post_inflate_datetime { my( $self, $dt, $info ) = @_; - $dt->set_time_zone($info->{timezone}) if defined $info->{timezone}; + $dt->set_time_zone($info->{time_zone}) if defined $info->{time_zone}; $dt->set_locale($info->{locale}) if defined $info->{locale}; return $dt; @@ -228,14 +244,14 @@ sub _post_inflate_datetime { sub _pre_deflate_datetime { my( $self, $dt, $info ) = @_; - if (defined $info->{timezone}) { - carp "You're using a floating timezone, please see the documentation of" + if (defined $info->{time_zone}) { + carp "You're using a floating time zone, please see the documentation of" . " DBIx::Class::InflateColumn::DateTime for an explanation" if ref( $dt->time_zone ) eq 'DateTime::TimeZone::Floating' and not $info->{floating_tz_ok} and not $ENV{DBIC_FLOATING_TZ_OK}; - $dt->set_time_zone($info->{timezone}); + $dt->set_time_zone($info->{time_zone}); } $dt->set_locale($info->{locale}) if defined $info->{locale}; @@ -248,13 +264,13 @@ __END__ =head1 USAGE NOTES -If you have a datetime column with an associated C, and subsequently +If you have a datetime column with an associated C, and subsequently create/update this column with a DateTime object in the L -timezone, you will get a warning (as there is a very good chance this will not have the +time zone, you will get a warning (as there is a very good chance this will not have the result you expect). For example: __PACKAGE__->add_columns( - starts_when => { data_type => 'datetime', timezone => "America/Chicago" } + starts_when => { data_type => 'datetime', time_zone => "America/Chicago" } ); my $event = $schema->resultset('EventTZ')->create({ @@ -267,7 +283,7 @@ The warning can be avoided in several ways: =item Fix your broken code -When calling C on a Floating DateTime object, the timezone is simply +When calling C on a Floating DateTime object, the time zone is simply set to the requested value, and B. It is always a good idea to be supply explicit times to the database: @@ -278,7 +294,7 @@ to be supply explicit times to the database: =item Suppress the check on per-column basis __PACKAGE__->add_columns( - starts_when => { data_type => 'datetime', timezone => "America/Chicago", floating_tz_ok => 1 } + starts_when => { data_type => 'datetime', time_zone => "America/Chicago", floating_tz_ok => 1 } ); =item Suppress the check globally @@ -287,7 +303,7 @@ Set the environment variable DBIC_FLOATING_TZ_OK to some true value. =back -Putting extra attributes like timezone, locale or floating_tz_ok into extra => {} has been +Putting extra attributes like time_zone, locale or floating_tz_ok into extra => {} has been B because this gets you into trouble using L. Instead put it directly into the columns definition like in the examples above. If you still use the old way you'll see a warning - please fix your code then! @@ -299,21 +315,19 @@ use the old way you'll see a warning - please fix your code then! =item More information about the add_columns method, and column metadata, can be found in the documentation for L. -=item Further discussion of problems inherent to the Floating timezone: - L +=item Further discussion of problems inherent to the Floating time zone: + L and L<< $dt->set_time_zone|DateTime/"Set" Methods >> =back -=head1 AUTHOR - -Matt S. Trout - -=head1 CONTRIBUTORS - -Aran Deltac +=head1 FURTHER QUESTIONS? -=head1 LICENSE +Check the list of L. -You may distribute this code under the same terms as Perl itself. +=head1 COPYRIGHT AND LICENSE +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L.