On Tue, Jan 19, 2010 at 09:04:43PM +0000, Martin J. Evans wrote: > 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."
sub clone { my ($old_dbh, $attr) = @_; my $closure = $old_dbh->{dbi_connect_closure} or return; That's a closure created by connect() that performs the $drh->connect call. unless ($attr) { # copy attributes visible in the attribute cache keys %$old_dbh; # reset iterator while ( my ($k, $v) = each %$old_dbh ) { # ignore non-code refs, i.e., caches, handles, Err etc next if ref $v && ref $v ne 'CODE'; # HandleError etc $attr->{$k} = $v; } # explicitly set attributes which are unlikely to be in the # attribute cache, i.e., boolean's and some others $attr->{$_} = $old_dbh->FETCH($_) for (qw( AutoCommit ChopBlanks InactiveDestroy LongTruncOk PrintError PrintWarn Profile RaiseError ShowErrorStatement TaintIn TaintOut )); } # use Data::Dumper; warn Dumper([$old_dbh, $attr]); my $new_dbh = &$closure($old_dbh, $attr); unless ($new_dbh) { # need to copy err/errstr from driver back into $old_dbh my $drh = $old_dbh->{Driver}; return $old_dbh->set_err($drh->err, $drh->errstr, $drh->state); } return $new_dbh; } > but I don't see any call to connect when clone is called. You don't see a call to DBI->connect, but there is a call to $drh->connect via the closure. > I presume there is something I need to do - any ideas? The closure calles the connected() method ad that's a good method to override to (re)setup any private stuff you need. Tim.