Sub :: Override不会覆盖DBI方法。为什么?

时间:2019-01-28 11:05:59

标签: perl override

我正在编写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.pladded debug output脚本,我看到Sub::Override在工作,但是由于某些原因,覆盖的功能无法启动-没有Execute is working! message

0 个答案:

没有答案