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

Reply via email to