Я пишу разветвление 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!
сообщение .