[CDBI] custom accessor problem?

adam <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.class-dbi
Message-ID <[email protected]>
Hi.

We're looking at using Class::DBI on a subset of our sybase tables,
with the view to gradually migrating to it over time.

I've hit a wall and was hoping that someone may be able to help. I
need to have a custom select to retrieve a precision datetime field:

eg
SELECT
 convert (char(26), topic_updated_dt, 109), topic_view_count, topic_reply_count
FROM topics
WHERE topic_id = ?

as the default sybase return from a select only gives the minutes (no
seconds, no milliseconds).

I looked through the docs and found the suggestion of using a
different accessor, so used the code:

my $topic_precise_updated_dt = Class::DBI::Column->new(
   'convert (char(26), topic_updated_dt, 109)' => {
     accessor => 'precise',
   }
);
__PACKAGE__->columns(
    Others => (
      $topic_precise_updated_dt,
      'topic_view_count',
      'topic_reply_count',
    ),
);

Now, when I access $topic->topic_view_count, the sql is executed
correctly, but I can't access the result, as the accessor method is
missing:
(test code)
my $views = $top2->topic_view_count;
warn(Dumper($top2));
  my $precise = $top2->precise;

With $ENV{DBI_TRACE}=1 I get the following:

...
prepare_cached('SELECT convert (char(26), topic_updated_dt, 109),
topic_view_count, topic_reply_count
FROM   topics
WHERE  topic_id=?
')= DBIx::ContextualFetch::st=HASH(0x8fa604c) at DBI.pm line 381
 T  <- FETCH('Taint')= 1 at ContextualFetch.pm line 49
    <- STORE('Taint' 0)= 1 at ContextualFetch.pm line 50
    <- execute('1')= -1 at ContextualFetch.pm line 51
 T  <- STORE('Taint' 1)= 1 at ContextualFetch.pm line 52
 T  <- fetchrow_array= ( 'Mar  9 2007  4:04:52:446PM' 3  1) [3 items]
row1 at ContextualFetch.pm line 87
 T  <- finish= 1 at ContextualFetch.pm line 88
$VAR1 = bless( {
                   'convert (char(26), topic_updated_dt, 109)' => 'Mar
 9 2007  4:04:52:446PM',
                   'topic_id' => '1',
                   'topic_title' => 'my new topic',
  'topic_updated_dt' => 'Mar  9 2007  4:04PM',
                   'topic_view_count' => 3,
                   'topic_reply_count' => 1,
               }, 'xx::Topics' );

died: Can't locate object method "precise" via package "xx::Topics" at
t/xxTopics.t line 108


I tracked this down to line 344 of Class/DBI.pm, in the
_mk_column_accessors code, and I *think* that the line

 %method = ('_' => $acc);         # make the accessor the mutator too

should be

 %method = ('_' => $default_accessor);

instead, as when the code is called the values are

$default_accessor = 'precise'
$acc = '(convert (char(26), topic_updated_dt, 109))'
$mut = 'precise'

If I change the line in Class/DBI.pm then my code works as expected.
However, I am loath to fiddle with Class::DBI itself if it's something
that I'm doing wrong.

Any ideas?

Thanks,
-- 
Adam
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.