[CDBI] Class::DBI internal column swapping wierdness ?

Richard.Foley at t-online.de Richard.Foley at t-online.de
Thu Sep 29 15:29:19 BST 2005


I have some very wierd behaviour going on using Class::DBI.  Columns
appear to be being swapped internally, which is seriously screwing our
application up.  Now I may be missing something obvious here, of course,
but here is the basic scenario:

Here's the stripped down package:

 package Att::Task;
 use strict;
 use base qw(Att::Dbi);

 __PACKAGE__->table  ('task');
 __PACKAGE__->columns(Primary    => qw(name));
 __PACKAGE__->columns(Essential    => qw(
     created created_by modified modified_by 
     title application stage seq enabled shared freetext
 ));

 __PACKAGE__->has_a(application  =>     qw(Att::Application));
 __PACKAGE__->has_a(stage        =>     qw(Att::Stage));
 __PACKAGE__->has_a(enabled      =>     qw(Att::EnabledDisabled));
 __PACKAGE__->has_a(shared  =>  qw(Att::YesNo));

 1

The relevant lines are shared (YesNo) and enabled(EnabledDisabled).  We
can take a look in the database to see what's in the relevant tables:


 mysql> SELECT name FROM enableddisabled;
 +----------+
 | name     |
 +----------+
 | DISABLED |
 | ENABLED  |
 +----------+

 mysql> SELECT name FROM yesno;
 +------+
 | name |
 +------+
 | NO   |
 | YES  |
 +------+


Just to be pedantic here's the database constraint definitions for the
relevant columns:

  CONSTRAINT `task_ibfk_2` FOREIGN KEY (`ENABLED`) REFERENCES
`enableddisabled` (`NAME`),
  CONSTRAINT `task_ibfk_5` FOREIGN KEY (`SHARED`) REFERENCES `yesno`
(`NAME`)

Pretty simple stuff so far.  Now let's take a look at a record from the
database.


 mysql> SELECT name, enabled, shared FROM task WHERE name LIKE
'thenew%';
 +--------------------------+---------+--------+
 | name                     | enabled | shared |
 +--------------------------+---------+--------+
 | thenewdeliverychec_02397 | ENABLED | YES    |
 +--------------------------+---------+--------+

As expected, enabled=ENABLED and shared=YES.  Now, take a look at what
Class::DBI returns:

Att::Task thenewdeliverychec_02397         $VAR1 = bless( {
    'stage' => bless( {
                     'name' => '2005-09-13 14:08:13'
                   }, 'Att::Stage' ),
    'name' => 'thenewdeliverychec_02397',
    'application' => bless( {
                           'name' => 'att'
                         }, 'Att::Application' ),
    'freetext' => 'Check what was delivered changed to analysis - ppt
pptcomp',
    'modified' => '0000000000analysis_00504',
    'created' => 'The new delivery check',
    'shared' => bless( {
                      'name' => 'ENABLED'
                    }, 'Att::YesNo' ),
    'modified_by' => '1',
    'title' => '2005-09-13 14:08:13',
    'seq' => bless( {
                   'id' => 'att'
                 }, 'Att::Sequence' ),
    'created_by' => 'pptcomp_25143',
    'enabled' => bless( {
                       'name' => 'YES'
                     }, 'Att::EnabledDisabled' )
}, 'Att::Task' );

All of a sudden, enabled=YES and shared=ENABLED!!!

How the hell did that happen...?!  If anyone has any bright ideas here,
before I pull my remaining hair out, I'd appreciate it.  TIA.

-- 
Ciao
Richard Foley
Ciao - shorter than aufwiedersehen








More information about the ClassDBI mailing list