Problem with _attribute_* methods

[prev] [thread] [next] [Date index for 2004/12/20]

From: Drew Taylor
Subject: Problem with _attribute_* methods
Date: 08:22 on 20 Dec 2004
Hello,

I've found what I consider a bug in the attribute system. I first ran
across this problem last week when working on a table with mixed case
column names and using the _attribute_set() method. Attached is a test
case to reproduce the problem. Essentially it boils down to attributes
being all lower case within the object. So if you have a column "Foo"
and you call $self->_attribute_set("Foo", "bar") it will not get
saved. But if you use an all lowercase column name it works fine. I
definitely expected to be able to use the proper case on these
methods, which is why it took me so long to figure it out.

So at a minimum the requirement to use lower base column names needs
to be documented. I would also be happy to work out a patch that would
also allow the use of the proper cased name if Tony would accept it.
I'm mostly there, but haven't found all the corners yet.

Drew


package Recipe;
use strict;
use warnings;
use base 'Class::DBI';

__PACKAGE__->connection('dbi:mysql:database=recipes;host=localhost',
'recipe', 'recipe');
__PACKAGE__->add_trigger('before_create', \&_beforeCreate);
__PACKAGE__->add_trigger('before_update', \&_beforeUpdate);

__PACKAGE__->table('Recipe');
__PACKAGE__->columns(Primary => 'Id');
__PACKAGE__->columns(Essential=>qw(Intro Created CreatedBy Modified
ModifiedBy));


#==========================================================================
sub now {
  my ($sec, $min, $hour, $mday, $mon, $year) = localtime();
  $mon += 1; $year += 1900;
  return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $mon, $mday,
$hour, $min, $sec);
}

#==========================================================================
sub _beforeCreate {
  my $self = shift;
  $self->_attribute_set(Created=>now());
  $self->_attribute_set(CreatedBy=>$ENV{USER});
}

#==========================================================================
sub _beforeUpdate {
  my $self = shift;
  $self->_attribute_set(Modified=>now());
  $self->_attribute_set(ModifiedBy=>$ENV{USER});
}

1;

        -- 
        ----------------------------------------------------------------
 Drew Taylor                 *  Web development & consulting
 Email: drew@xxxxxxxxxx.xxx  *  Site implementation & hosting
 Web  : www.drewtaylor.com   *  perl/mod_perl/DBI/mysql/postgres
 ----------------------------------------------------------------

Problem with _attribute_* methods
Drew Taylor 08:22 on 20 Dec 2004

Re: Problem with _attribute_* methods
Tony Bowden 08:30 on 20 Dec 2004

Generated at 08:50 on 21 Dec 2004 by mariachi v0.52