私は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に含まれるドライバが2つしかないことを示しています。 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 *を除く任意のメソッドにコールバックを追加できるようです!私が考えることができるのは、本当の 'connect'を呼び出し、それが返す' $ dbh'を渡すための 'DBI :: connect'パッチを猿に与えることです。 – Borodin