All,

We're trying to override the DBI->connect() method for DBD::DB2 to
support longer database names.

Some background:
- DB2 supports only 8-character database names and aliases
- We plan to have hundreds to thousands of them, so we end up with
  non-intelligeble names.
- We have a mapping file that maps logical names (to us, which means
  something like NYTD_YOUR_APPLICATION or LNQD_OTHER_APPLICATION) to
  one of the 8-character names that DB2 limits us to.

The first approach we came up with was to define a "Morgan Stanley
DB2" driver, as that would allow us to avoid changing DBD::DB2.

Hence we wrote DBD::MSDB2, which basically sub-classes DBD::DB2:

  package DBD::MSDB2;
  
  use DBD::DB2;
  use vars qw(@ISA $VERSION);
  @ISA = qw(DBD::DB2::dr);
  $VERSION = '1.0';

  #
  # Override the 'connect' class method
  #
  sub connect {
      my ($drh, $dbname, $user, $auth, $attr) = @_;

      # Look up the long database name, change $dbname, then...
      $drh->SUPER::connect($dbname, $user, $auth, $attr);
  }

and then we try and connect with:

  DBI->connect('dbi:MSDB2:NYTD_YOUR_APPLICATION', $uid, $pwd);

This leads to the following error:

  DBD::MSDB2 initialisation failed: Can't locate object method "driver" via package 
"DBD::MSDB2" (perhaps you forgot to load "DBD::MSDB2"?) at 
//ms/dist/perl5/PROJ/DBI/1.42-5.6/lib/perl5/DBI.pm line 727.

Okay, so change @ISA:

  @ISA = qw(DBD::DB2 DBD::DB2::dr);

And the next error is:

  Had to create DBD::MSDB2::dr::imp_data_size unexpectedly at
  //ms/dist/perl5/PROJ/DBI/1.42-5.6/lib/perl5/DBI.pm line 1061.  Use
  of uninitialized value in subroutine entry at
  //ms/dist/perl5/PROJ/DBI/1.42-5.6/lib/perl5/DBI.pm line 1061.  Had
  to create DBD::MSDB2::db::imp_data_size unexpectedly at
  //ms/dist/perl5/PROJ/DBI/1.42-5.6/lib/perl5/DBI.pm line 1061.  Use
  of uninitialized value in subroutine entry at
  //ms/dist/perl5/PROJ/DBI/1.42-5.6/lib/perl5/DBI.pm line 1061.  DBD
  driver has not implemented the AutoCommit attribute at
  //ms/dist/perl5/PROJ/DBI/1.42-5.6/lib/perl5/DBI.pm line 631.

Obviously, I'm missing some clues on how to actually do this kind of
thing.  Any suggestions?

Reply via email to