[prev] [thread] [next] [Date index for 2004/12/28]
I am trying to use Class::DBI::MySQL(v0.95) in conjunction with the Time::Piece::MySQL(v0.05) module with ActiveState Perl 5.8.6 for MSWin32 build 811. The problem I am running into is this: after_set_logintime trigger error: Can't inflate logintime to Time::Piece::MySQL using '1->_attr(logintime)': Time::Piece is not a Time::Piece::MySQL at C:/Perl/site/lib/Class/Trigger.pm line 51 at C:\CVS\CafePoints\CafeDatabase.pm line 882 CafeDB::Users CafeDB::Users=HASH(0x2739078) destroyed without saving changes to logintime at C:\CVS\CafePoints\CafeDatabase.pm line 0 The code that causes the error is the following: use Time::Piece::MySQL; my $t = Time::Piece->from_mysql_datetime('1970-01-01 00:00:00'); $user1->logintime($t); The DBI object declares the following for inflation and deflation of the object: CafeDB::Users->has_a(logintime => "Time::Piece::MySQL", inflate => sub {my $t = shift; Time::Piece->from_mysql_datetime( ($t) == 0 ? '1970-01-01 00:00:00' : $t) }, deflate => 'mysql_datetime' ); NOTE: I added the ? : clause because MySQL 4.1 can return a date of '0000-00-00 00:00:00' which causes Time::Piece->strptime to blow up in bad ways since it's not a valid date for that object. Because of thisTime::Piece::DBI causes it to return an undef for such a date. This undef causes Class::DBI to blow up because because it was not a reference to an object that was returned. This was a second issue I ran into, not related to the bug I'm dealing with now, but this seemed to be the right place to report it. I traced into the package and the problem seems to be in the following subroutine: sub _inflate_to_object { my $col = shift; return sub { my $self = shift; return if not defined $self->_attr($col); my ($a_class, %meths) = @{ $self->__hasa_rels->{$col} }; if (my $obj = ref $self->_attr($col)) { return if UNIVERSAL::isa($obj, $a_class); return $self->_croak( "Can't inflate $col to $a_class using '$self->_attr($col)': $obj is not a $a_class" ); } my $get = $meths{'inflate'} || ($a_class->isa('Class::DBI') ? "_simple_bless" : "new"); my $obj = (ref $get eq "CODE") ? $get->($self->_attr($col)) : $a_class->$get($self->_attr($col)); return $self->_croak( "Can't inflate $col to $a_class via $get using '$self->_attr($col)'") unless ref $obj; # use ref as $obj may be overloaded and appear 'false' $self->_attribute_set($col => $obj); }; } It is dieing because you have to tell it to use the class "Time::Piece::MySQL" in order to access the 'from_mysql_datetime' method. However, when it gets to the check for the class of the object created by Time::Piece::MySQL is in the package of "Time::Piece" so it blows up on the UNIVERSAL::isa check. I tried adding the following line in my base class of the object (not the actual Class::DBI file): return if ($a_class =~ /Time::Piece/ && UNIVERSAL::isa($obj, "Time::Piece")); This didn't work however, as it allways traced into the actual Class::DBI file. Does anyone know how to fix this?
Class::DBI::MySQL + Time::Piece::MySQL problems
|
Re: Class::DBI::MySQL + Time::Piece::MySQL problems
|
Generated at 12:15 on 16 Jan 2005 by mariachi v0.52