Sub :: Override не переопределяет методы DBI.Зачем? - PullRequest
0 голосов
/ 28 января 2019

Я пишу разветвление 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 );

Вот полный код измененного DBI :: Log module .Он должен делать то же самое, что и исходный DBI :: Log , просто используйте Sub :: Override, поэтому оригинальные модульные тесты должны пройти.

Если я запускаю test.pl и добавлен отладочный вывод скрипт Я вижу, что Sub::Override работает, но по какой-то причине переопределенная функция не может запуститься - нет Execute is working! сообщение .

...