subclassing the DBI and the clone method

"Martin J. Evans" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <[email protected]>
Hi,

Is there anything special a subclassed DBI module (DBIx::Log4perl in
this case) needs to do for the clone method?

The DBI docs currently say "The clone method duplicates the $dbh
connection by connecting with the same parameters ($dsn, $user,
$password) as originally used." but I don't see any call to connect when
clone is called.

I presume there is something I need to do - any ideas?

e.g., the following code:

use strict;
use warnings;
use DBI;
use Proc::Fork;
use Data::Dumper;

Log::Log4perl->init_and_watch('fork.conf', 60);

my $ph = DBIx::Log4perl->connect(
    "dbi:Oracle:host=xxx;sid=devel",
    "xxx", "xxx");
print "ph InactiveDestroy = $ph->{InactiveDestroy}\n";

print Data::Dumper->Dump(
    $ph->selectall_arrayref(q/select 1 from dual/), [qw(ph_before_fork)]);
run_fork {
    child {
        my $ch = $ph->clone;

        $ph->{InactiveDestroy} = 1;
        $ph = undef;
        print Data::Dumper->Dump(
            $ch->selectall_arrayref(q/select 1 from dual/), [qw(ch)]);
        exit 0;
    }
    parent {
        my $child_pid = shift;
        print Data::Dumper->Dump(
            $ph->selectall_arrayref(
                q/select 1 from dual/), [qw(ph_before_wait)]);
        waitpid $child_pid, 0;
    }
};
print Data::Dumper->Dump(
    $ph->selectall_arrayref(
        q/select 1 from dual/), [qw(ph_after_child_dies)]);


causes output of:

$ perl fork.pl
ph InactiveDestroy =
$ph_before_fork = [
                    '1'
                  ];
$ph_before_wait = [
                    '1'
                  ];
Use of uninitialized value in bitwise and (&) at
/usr/local/share/perl/5.10.0/DBIx/Log4perl/db.pm line 182.
Use of uninitialized value in subroutine entry at
/usr/local/share/perl/5.10.0/DBIx/Log4perl/db.pm line 40.
Can't use string ("") as a subroutine ref while "strict refs" in use at
/usr/local/share/perl/5.10.0/DBIx/Log4perl/db.pm line 40.
$ph_after_child_dies = [
                         '1'
                       ];

and Log::Log4perl output of:

2010/01/19 20:46:45 DEBUG> fork.pl:14 main:: - connect(0):
dbi:Oracle:host=xxx;sid=devel, xxx
2010/01/19 20:46:45 INFO> fork.pl:14 main:: - DBI: 1.609,
DBIx::Log4perl: 0.18, Driver: Oracle(1.23)
2010/01/19 20:46:45 DEBUG> fork.pl:20 main:: - selectall_arrayref(0):
'select 1 from dual'
2010/01/19 20:46:45 DEBUG> fork.pl:42 main::__ANON__ -
selectall_arrayref(0): 'select 1 from dual'
2010/01/19 20:46:45 DEBUG> fork.pl:34 main::__ANON__ - $STORE(0) =
['InactiveDestroy',1];
2010/01/19 20:46:45 DEBUG> fork.pl:49 main:: - selectall_arrayref(0):
'select 1 from dual'

If I change the code to connect again in the child instead of using
clone the Log::Log4perl output is:

2010/01/19 20:56:38 DEBUG> fork.pl:14 main:: - connect(0):
dbi:Oracle:host=xxx;sid=devel, xxx
2010/01/19 20:56:38 INFO> fork.pl:14 main:: - DBI: 1.609,
DBIx::Log4perl: 0.18, Driver: Oracle(1.23)
2010/01/19 20:56:38 DEBUG> fork.pl:20 main:: - selectall_arrayref(0):
'select 1 from dual'
2010/01/19 20:56:38 DEBUG> fork.pl:42 main::__ANON__ -
selectall_arrayref(0): 'select 1 from dual'
2010/01/19 20:56:38 DEBUG> fork.pl:30 main::__ANON__ - connect(1):
dbi:Oracle:host=xxx;sid=devel, xxx

Notice the second connect above ^

2010/01/19 20:56:38 INFO> fork.pl:30 main::__ANON__ - DBI: 1.609,
DBIx::Log4perl: 0.18, Driver: Oracle(1.23)
2010/01/19 20:56:38 DEBUG> fork.pl:34 main::__ANON__ - $STORE(0) =
['InactiveDestroy',1];
2010/01/19 20:56:38 DEBUG> fork.pl:36 main::__ANON__ -
selectall_arrayref(1): 'select 1 from dual'
2010/01/19 20:56:38 DEBUG> fork.pl:49 main:: - selectall_arrayref(0):
'select 1 from dual'

and it all works fine.

I'd be grateful for any pointers.

Martin
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.