如何将析构函数添加到从DBI :: connect返回的db句柄?

时间:2013-09-02 10:58:20

标签: perl dbi

该软件包有一个DBI-> connect:

的包装器
Package MyPackage;
our $dbh;
sub connect {
    $dbh = DBI->connect(...)
    return $dbh;
}

sub disconnect {
    $dbh->disconnect;
    #some other things...
}
In the client program:
{
    my $dbh = MyPackage->connect(...)
}

MyPackage只是一个功能包,它不是一个类。 但现在我想使用RAII,当离开客户端调用MyPackage-> connect的范围时,调用disconnect。 无法调用DESTROY函数,因为我们不返回MyPackage的对象。 我不想更改接口和客户端代码,比如添加新方法,所以我想也许有一种方法可以继承DB句柄并覆盖它的DESTROY方法。在DESTROY方法中,它可以调用MyPackage- >断开

它是可行的还是有人可以帮助想出任何其他好的解决方案? 非常感谢你。

1 个答案:

答案 0 :(得分:3)

是的,如果你愿意,可以这样做。

Package MyPackage;
use base 'DBI::db';
sub connect {
    my $dbh = DBI->connect(...)
    bless $dbh => 'MyPackage';
    return $dbh;
}

sub DESTROY {
    my ($dbh) = @_;
    $dbh->disconnect;
    #some other things...
}

客户端程序仍然可以像以前一样调用connect子例程。当实例超出范围时,将调用DESTROY方法并由您的代码处理。其他数据库句柄方法由DBI :: db处理,就像以前一样。