[CDBI] Re: Class::DBI with multiple db connections

Sk8board Kid sk8boardkid at gmail.com
Tue Jan 16 10:45:42 GMT 2007


On 11/01/07, Perrin Harkins <perrin at elem.com> wrote:
> On Thu, 2007-01-11 at 13:58 -0500, Edward J. Sabol wrote:
> > > [Am] I missing something here?
> >
> > Class::DBI forces the Ima::DBI database connection name to be "Main". This
> > was an intentional design decision to simplify the API.
>
> Yes.  To get multiple database support for my project, I set them all up
> with set_db() calls (to the Ima::DBI::set_db, not the Class::DBI version
> that forces the db_name) and override db_Main() in my base class to call
> the correct database handle method for the database I want.  The method
> is called 'db_' . $db_name.
>
> > If you do override this design decision to enable multiple database
> > connections, I think you will need to turn off the object index
>
> Yes, you will.
>
> - Perrin
>
>
>

Thanks to both you guys help on this.

i'm having problems overriding Class::DBI's set_db method as follows:

package mysubclass;
use base qw(Class::DBI);
$Class::DBI::Weaken_Is_Available = 0;   #disable the object index for
the multiple db connections

{
    my $new_set_db = sub {
        my ($class, $db_name, $data_source, $user, $password, $attr) = @_;
        # 'dbi:Pg:dbname=foo' we want 'Pg'. I think this is enough.
        my ($driver) = $data_source =~ /^dbi:(\w+)/i;
        $class->__driver($driver);
        #$class->SUPER::set_db('Main', $data_source, $user, $password, $attr);
        print STDERR "using new set_db with: $class, $db_name\n";
        $class->SUPER::set_db($db_name, $data_source, $user, $password, $attr);
    };
    *Class::DBI::set_db = $new_set_db;
}

but this is method is called in the context of "mysubclass", which
means when you use the "SUPER" method this will give you
Class::DBI::set_db not Ima::DBI::set_db

I thought in the code above i was altering the Class::DBI::set_db method with:

*Class::DBI::set_db = $new_set_db;

so when $class->SUPER::set_db is used inside it it would call
effectively call Ima::DBI::set_db.

I suppose i want to do something like $class->SUPER->SUPER::set_db but
i'm not sure how to do that in perl

Can anyone help here?



More information about the ClassDBI mailing list