Skip to content

Commit

Permalink
Merge branch 'topic/invalidate_txn_manager'
Browse files Browse the repository at this point in the history
  • Loading branch information
lestrrat committed Mar 8, 2011
2 parents 27378f5 + 1e29329 commit 0292e9e
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 1 deletion.
5 changes: 4 additions & 1 deletion lib/DBIx/Skinny.pm
Expand Up @@ -253,7 +253,10 @@ sub do_on_connect {

sub disconnect {
my $class = shift;
$class->_attributes->{dbh} = undef;
delete $class->_attributes->{txn_manager};
if (my $dbh = delete $class->_attributes->{dbh}) {
$dbh->disconnect;
}
}

sub set_dbh {
Expand Down
50 changes: 50 additions & 0 deletions t/999_regression/dbh_and_txn_manager.t
@@ -0,0 +1,50 @@
use strict;
use Test::More;
use t::Utils;
use Mock::Basic;

subtest 'use transaction, disconnect, reconnect and use transaction again' => sub {
my %connect_info = (
dsn => 'dbi:SQLite::memory:',
connect_options => {RaiseError => 1, AutoCommit => 1},
);
my $model = Mock::Basic->new(\%connect_info);

eval {
$model->txn_begin();
$model->txn_rollback();
};
ok !$@, "regular txn begin, then rollback - should be clean" . ( $@ ? ", but got $@" : '');

ok $model->_attributes->{dbh}, "dbh should be defined";
ok $model->_attributes->{txn_manager}, "txn manager should be defined";

eval {
$model->disconnect();
};
ok !$@, "regular disconnect - should be clean" . ( $@ ? ", but got $@" : '');

ok ! $model->_attributes->{dbh}, "dbh should be undefined";
if (! ok ! $model->_attributes->{txn_manager}, "txn manager should be undefined" ) {
# What, txn_manager still exists?!
# Emulate this: long time passes... txn_manager and its dbh is
# still dangling... and mysql server disconnects
my $tm = $model->_attributes->{txn_manager};
if (my $dbh = $tm->{dbh}) {
$dbh->disconnect;
}
}

eval {
$model->connect();
};
ok !$@, "regular connect - should be clean" . ( $@ ? ", but got $@" : '' );

eval {
$model->txn_begin();
$model->txn_rollback();
};
ok !$@, "regular txn (again) - should be clean" . ($@ ? ", but got $@" : '');
};

done_testing;
11 changes: 11 additions & 0 deletions xt/Utils/mysql.pm
Expand Up @@ -15,6 +15,17 @@ my $mysql = Test::mysqld->new({
sub t::Utils::setup_dbh {
DBI->connect($mysql->dsn( dbname => "test" ), '','',{ RaiseError => 1, PrintError => 0, AutoCommit => 1 });
}

sub t::Utils::connect_info {
return {
dsn => $mysql->dsn( dbname => "test" ),
connect_options => {
RaiseError => 1,
PrintError => 0,
AutoCommit => 1,
}
}
}
}

1;
40 changes: 40 additions & 0 deletions xt/mysql/transaction.t
Expand Up @@ -257,6 +257,46 @@ subtest 'do nested scope rollback-commit-commit' => sub {
done_testing;
};

subtest 'do txn, disconnect, connect, and then txn' => sub {
my $model = Mock::Basic->new(t::Utils::connect_info());

eval {
$model->txn_begin();
$model->txn_rollback();
};
ok !$@, "regular txn begin, then rollback - should be clean" . ( $@ ? ", but got $@" : '');

ok $model->_attributes->{dbh}, "dbh should be defined";
ok $model->_attributes->{txn_manager}, "txn manager should be defined";

eval {
$model->disconnect();
};
ok !$@, "regular disconnect - should be clean" . ( $@ ? ", but got $@" : '');

ok ! $model->_attributes->{dbh}, "dbh should be undefined";
if (! ok ! $model->_attributes->{txn_manager}, "txn manager should be undefined" ) {
# What, txn_manager still exists?!
# Emulate this: long time passes... txn_manager and its dbh is
# still dangling... and mysql server disconnects
my $tm = $model->_attributes->{txn_manager};
if (my $dbh = $tm->{dbh}) {
$dbh->disconnect;
}
}

eval {
$model->connect();
};
ok !$@, "regular connect - should be clean" . ( $@ ? ", but got $@" : '' );

eval {
$model->txn_begin();
$model->txn_rollback();
};
ok !$@, "regular txn (again) - should be clean" . ($@ ? ", but got $@" : '');
};

done_testing;


0 comments on commit 0292e9e

Please sign in to comment.