From: Ash Berlin Date: Tue, 26 May 2009 14:17:44 +0000 (+0000) Subject: Fix 'timestamp with time zone' columns for IC::DT inflation X-Git-Tag: v0.08103~6 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6c99a3eea0da8f254e67fdda21e27f9ef9fbeec3;p=dbsrgits%2FDBIx-Class.git Fix 'timestamp with time zone' columns for IC::DT inflation --- diff --git a/Changes b/Changes index 20ca87a..af51dae 100644 --- a/Changes +++ b/Changes @@ -31,6 +31,8 @@ Revision history for DBIx::Class - Sybase now supports autoinc PKs (RT#40265) - Prefetch on joins over duplicate relations now works correctly (RT#28451) + - "timestamp with time zone" columns (for Pg) now get inflated with a + time zone information preserved 0.08102 2009-04-30 08:29:00 (UTC) - Fixed two subtle bugs when using columns or select/as diff --git a/Makefile.PL b/Makefile.PL index 8b730ca..8033b36 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -72,6 +72,9 @@ my %force_requires_if_author = ( # t/60core.t 'DateTime::Format::MySQL' => 0, + + # t/89inflate_datetime.t + 'DateTime::Format::Pg' => 0, # t/72pg.t $ENV{DBICTEST_PG_DSN} diff --git a/lib/DBIx/Class/InflateColumn/DateTime.pm b/lib/DBIx/Class/InflateColumn/DateTime.pm index 5b1b313..54e66f5 100644 --- a/lib/DBIx/Class/InflateColumn/DateTime.pm +++ b/lib/DBIx/Class/InflateColumn/DateTime.pm @@ -107,6 +107,10 @@ sub register_column { unless ($type) { $type = lc($info->{data_type}); + if ($type eq "timestamp with time zone" || $type eq "timestamptz") { + $type = "timestamp"; + $info->{_ic_dt_method} ||= "timestamp_with_timezone"; + } } my $timezone; diff --git a/t/89inflate_datetime.t b/t/89inflate_datetime.t index f3c0e01..5a77195 100644 --- a/t/89inflate_datetime.t +++ b/t/89inflate_datetime.t @@ -8,14 +8,17 @@ use DBICTest; { local $SIG{__WARN__} = sub { warn @_ if $_[0] !~ /extra \=\> .+? has been deprecated/ }; DBICTest::Schema->load_classes('EventTZDeprecated'); + DBICTest::Schema->load_classes('EventTZPg'); } my $schema = DBICTest->init_schema(); -eval { require DateTime::Format::MySQL }; -plan skip_all => "Need DateTime::Format::MySQL for inflation tests" if $@; +plan tests => 53; + +SKIP: { + eval { require DateTime::Format::MySQL }; + skip "Need DateTime::Format::MySQL for inflation tests", 50 if $@; -plan tests => 50; # inflation test my $event = $schema->resultset("Event")->find(1); @@ -142,3 +145,17 @@ is("$varchar_datetime", '2006-05-22T19:05:07', 'Correct date/time'); ## skip inflation field my $skip_inflation = $event->skip_inflation; is ("$skip_inflation", '2006-04-21 18:04:06', 'Correct date/time'); + +} # Skip if no MySQL DT::Formatter + +SKIP: { + + skip "ENV{DBIC_FLOATING_TZ_OK} was set, skipping", 3 unless eval { require DateTime::Format::Pg; 1}; + my $event = $schema->resultset("EventTZPg")->find(1); + $event->update({created_on => '2009-01-15 17:00:00+00'}); + $event->discard_changes; + isa_ok($event->created_on, "DateTime") or diag $event->created_on; + is($event->created_on->time_zone->name, "America/Chicago", "Timezone changed"); + # Time zone difference -> -6hours + is($event->created_on->iso8601, "2009-01-15T11:00:00", "Time with TZ correct"); +} diff --git a/t/lib/DBICTest/Schema/EventTZPg.pm b/t/lib/DBICTest/Schema/EventTZPg.pm new file mode 100644 index 0000000..e2b512e --- /dev/null +++ b/t/lib/DBICTest/Schema/EventTZPg.pm @@ -0,0 +1,24 @@ +package DBICTest::Schema::EventTZPg; + +use strict; +use warnings; +use base qw/DBICTest::BaseResult/; + +__PACKAGE__->load_components(qw/InflateColumn::DateTime/); + +__PACKAGE__->table('event'); + +__PACKAGE__->add_columns( + id => { data_type => 'integer', is_auto_increment => 1 }, + starts_at => { data_type => 'datetime', timezone => "America/Chicago", locale => 'de_DE' }, + created_on => { data_type => 'timestamp with time zone', timezone => "America/Chicago" }, +); + +__PACKAGE__->set_primary_key('id'); + +sub _datetime_parser { + require DateTime::Format::Pg; + DateTime::Format::Pg->new(); +} + +1;