sub DESTROY {
my $self = shift;
+
$self->_verify_pid if $self->_dbh;
# some databases need this to stop spewing warnings
if (my $dbh = $self->_dbh) {
+ local $@;
eval { $dbh->disconnect };
}
use DBICTest;
use DBICTest::Schema;
+# make sure nothing eats the exceptions (an unchecked eval in Storage::DESTROY used to be a problem)
+
{
package Dying::Storage;
}
}
-TODO: {
-local $TODO = "I have no idea what is going on here... but it ain't right";
-
for (qw/before_populate after_populate/) {
-
dies_ok (sub {
my $schema = DBICTest::Schema->clone;
$schema->storage_type ('Dying::Storage');
}, "$_ exception found");
}
-}
-
done_testing;
-
-__END__
-For reference - next::method goes to ::Storage::DBI::_populate_dbh
-which is:
-
-sub _populate_dbh {
- my ($self) = @_;
-
- my @info = @{$self->_dbi_connect_info || []};
- $self->_dbh(undef); # in case ->connected failed we might get sent here
- $self->_dbh($self->_connect(@info));
-
- $self->_conn_pid($$);
- $self->_conn_tid(threads->tid) if $INC{'threads.pm'};
-
- $self->_determine_driver;
-
- # Always set the transaction depth on connect, since
- # there is no transaction in progress by definition
- $self->{transaction_depth} = $self->_dbh_autocommit ? 0 : 1;
-
- $self->_run_connection_actions unless $self->{_in_determine_driver};
-}
-
-After further tracing it seems that if I die() before $self->_conn_pid($$)
-the exception is propagated. If I die after it - it's lost. What The Fuck?!