我正在编写DBI::Log的分支,我的目的是使它可以有条件地插入,以便能够更灵活地记录SQL查询,例如仅从特定模块或在指定的调用之后。
我遇到了一个奇怪的问题-Sub::Override
无法覆盖DBI::db::*
和DBI::st::execute
方法。
紧随其后的计划
1)我将对原始方法的引用保存到变量中,例如my $orig_execute = \&DBI::st::execute;
2)通过添加一些其他日志记录代码来创建新功能,例如
sub _execute {
my ( $sth, @args ) = @_;
warn "Execute is working!";
my $log = dbilog( "execute", $sth->{Database}, $sth->{Statement}, \@args );
my $retval = $orig_execute->( $sth, @args );
dbilog2($log);
return $retval;
}
3)使用Sub::Override
my $sub = Sub::Override->new;
$sub->replace( 'DBI::st::execute', \&_execute );
Here is a full code of changed DBI::Log module。它必须与original DBI::Log相同,只是使用Sub :: Override,因此原始单元测试必须通过。
如果我运行test.pl和added debug output脚本,我看到Sub::Override
在工作,但是由于某些原因,覆盖的功能无法启动-没有Execute is working!
message