DBI
을 통해 추상화를 제공하는 모듈을 다루겠습니다. 자동으로 다시 연결됩니다. DBI-> connect 후 몇 가지 작업을 수행해야합니다.DBI를 다시 후킹하는 방법
이 모듈을 수정하지 않고 거기에 후크를 추가 할 수있는 방법이 있습니까? 나는 운이 문서에서 그것을 찾아야하지 않습니다. 내가 뭐 놓친 거 없니?
DBI
을 통해 추상화를 제공하는 모듈을 다루겠습니다. 자동으로 다시 연결됩니다. DBI-> connect 후 몇 가지 작업을 수행해야합니다.DBI를 다시 후킹하는 방법
이 모듈을 수정하지 않고 거기에 후크를 추가 할 수있는 방법이 있습니까? 나는 운이 문서에서 그것을 찾아야하지 않습니다. 내가 뭐 놓친 거 없니?
DBI doc은 a chapter about subclassing이며 아무 것도 수행하지 않는 $dbh->connected
메서드가 있습니다. 그것은 정확히 당신이 원하는 것 같다.
$dbh->connected($dsn, $user, $pass, \%attr);
나는 것을 시도하지 않은,하지만 그냥 원숭이에 의해 작동 할 수 있습니다 : 서브 클래스에서, DBI-이> 방법을 연결 성공적인 새 연결 한 후, 다음 사용되는
가 자동으로 호출 - 아무것도 연결하지 않고 DBI에 직접 연결된 메소드를 패치합니다. In
connect
there is definitely a call toconnected
.그러나 패치 할 위치가 확실하지 않습니다. 아마 드라이버에있을 수 있습니다. grep of the cpan은 DBI dist에 포함 된 드라이버가 두 개뿐임을 보여줍니다. DBD::Gofer 및 DBD::Proxy이지만 그 중 하나는 비어 있습니다. 두 제품 모두
DBD::<drivername>::db
패키지에 들어 있습니다.당신이 MySQL을하고 있다고 가정하고, 당신은 가서 드라이버에 연결하십시오. 하나, 또는 단순히 의해 서브 클래스와 해당 드라이버를 사용하여 그것을 원숭이 패치. 그들은 자신의
는connected
가 없다면*DBD::mysql::db::connected = sub { my ($dbh, dsn, $user, $pass, $attr, $old_driver) = @_; warn 'Connected!'; }
이 다른 드라이버와 같은 작동합니다. 이 경우 수동으로 포장하거나 Class::Method::Modifiers의
around
과 같은 것을 사용하여 원래 동작을 그대로 유지해야합니다.실제 연결되어있는 경우
$dbh
이므로 원하는 경우connected
에 데이터베이스를 뒤져 볼 수 있습니다.물론 이것은 이후에 콜백을 줄 것입니다.을 연결하십시오. 재 연결 만 얻으려면 연결을 계산하고 첫 번째 연결을 건너 뛰는 어휘 변수를 통해 클로저를 만들 수 있습니다.
{ my $connection_counter; *DBD::mysql::db::connected = sub { my ($dbh, dsn, $user, $pass, $attr, $old_driver) = @_; return unless $connection_counter++; # skip first connection warn 'Connected!'; } }
이 중 하나를 테스트하지 않았습니다.
나는 이것을 해보지 않았다. 연결처럼 - 나는 @theory 뭔가가 발생할 때마다 코드를 실행할 수 DBI를 활용 할 수있는 옵션에 대한 기록이 문서
http://justatheory.com/computers/databases/postgresql/execute-on-select.html
을 발견했다. 희망이 도움이됩니다!
문서의 [콜백 섹션] (https://metacpan.org/pod/DBI#Callbacks)을 읽은 것으로 간주합니까? connect *를 제외한 모든 메소드에 콜백을 추가 할 수있는 것처럼 보입니다! 내가 생각할 수있는 것은 원숭이 패치'DBI :: connect'가 실제'connect'를 호출 한 다음 반환하는'$ dbh '를 전달하는 것입니다. – Borodin