[Dbix-class] Re: Tests for MySQL's illustrious 0000-00-00

J. Shirley jshirley at gmail.com
Fri Jul 18 17:48:52 BST 2008


Tactlessly replying to myself... spoke with mst on irc and came up
with http://dev.catalystframework.org/svnweb/bast/revision?rev=4596


On Fri, Jul 18, 2008 at 9:01 AM, J. Shirley <jshirley at gmail.com> wrote:
> Ok, we all hate MySQL.  That's a given, but some of us have to work
> with it so lets make it better.  There's been several threads on the
> mailing list about how MySQL handles undef dates (and the default
> idiom is to use 0000-00-00)
>
> Here's a patch I wrote that will simply return undef if there is an
> exception inflating the date.  I'm not fully convinced that eating the
> error is a good thing, but I also don't want a ton of pollution in the
> logs.  Because of that, I'm thinking that also adding in:
>            my $dt = eval { $obj->_datetime_parser->$parse($value); };
>            warn $@ if $@ and $value !~ /^00(?:00)?-00-00$/;
>
> I don't like this at all, which is one reason why I didn't put it in
> the patch, but throwing that out because I'm sure someone has better
> ideas.
>
> I have a commit bit, so if you guys approve just holler and I'll check
> in the patch.
>
> === lib/DBIx/Class/InflateColumn/DateTime.pm
> ==================================================================
> --- lib/DBIx/Class/InflateColumn/DateTime.pm    (revision 14362)
> +++ lib/DBIx/Class/InflateColumn/DateTime.pm    (local)
> @@ -73,8 +73,8 @@
>         {
>           inflate => sub {
>             my ($value, $obj) = @_;
> -            my $dt = $obj->_datetime_parser->$parse($value);
> -            $dt->set_time_zone($timezone) if $timezone;
> +            my $dt = eval { $obj->_datetime_parser->$parse($value); };
> +            $dt->set_time_zone($timezone) if $dt and $timezone;
>             return $dt;
>           },
>           deflate => sub {
> === t/89inflate_datetime.t
> ==================================================================
> --- t/89inflate_datetime.t      (revision 14362)
> +++ t/89inflate_datetime.t      (local)
> @@ -10,7 +10,7 @@
>  eval { require DateTime::Format::MySQL };
>  plan skip_all => "Need DateTime::Format::MySQL for inflation tests" if $@;
>
> -plan tests => 17;
> +plan tests => 20;
>
>  # inflation test
>  my $event = $schema->resultset("Event")->find(1);
> @@ -70,3 +70,15 @@
>  is("$created_on", '2006-01-31T12:34:56', 'Loaded correct timestamp
> using timezone');
>  is($created_on->time_zone->name, 'America/Chicago', 'Correct timezone');
>
> +# This should fail to set
> +my $prev_str = "$created_on";
> +$loaded_event->update({ created_on => '0000-00-00' });
> +is("$created_on", $prev_str, "Don't update invalid dates");
> +
> +my $invalid = $schema->resultset('Event')->create({
> +    starts_at  => '0000-00-00',
> +    created_on => '0000-00-00'
> +});
> +
> +is( $invalid->get_column('created_on'), '0000-00-00', "Invalid date stored" );
> +is( $invalid->created_on, undef, "Inflate to undef" );
>



More information about the DBIx-Class mailing list