Skip to content

Commit

Permalink
Revert parts of 6864429 which utterly broke dbh_do() retries
Browse files Browse the repository at this point in the history
Was never noticed because of undertesting, now should behave correctly
  • Loading branch information
ribasushi committed Feb 1, 2013
1 parent 5cbe5b1 commit 8f6986a
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 14 deletions.
1 change: 1 addition & 0 deletions Changes
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
Revision history for DBIx::Class

* Fixes
- Fix dbh_do() failing to properly reconnect (regression in 0.08205)
- Extra sanity check of a fresh DBI handle ($dbh). Fixes
connection coderefs returning garbage (seen in the wild)

Expand Down
13 changes: 1 addition & 12 deletions lib/DBIx/Class/Storage/DBI.pm
Original file line number Diff line number Diff line change
Expand Up @@ -793,25 +793,14 @@ sub dbh_do {
return $self->$run_target($self->_get_dbh, @_)
if $self->{_in_do_block} or $self->transaction_depth;

my $cref = (ref $run_target eq 'CODE')
? $run_target
: $self->can($run_target) || $self->throw_exception(sprintf (
'Can\'t locate object method "%s" via package "%s"',
$run_target,
(ref $self || $self),
))
;

# take a ref instead of a copy, to preserve @_ aliasing
# semantics within the coderef, but only if needed
# (pseudoforking doesn't like this trick much)
my $args = @_ ? \@_ : [];
unshift @$args, $self, $self->_get_dbh;

DBIx::Class::Storage::BlockRunner->new(
storage => $self,
run_code => $cref,
run_args => $args,
run_code => sub { $self->$run_target ($self->_get_dbh, @$args ) },
wrap_txn => 0,
retry_handler => sub { ! ( $_[0]->retried_count or $_[0]->storage->connected ) },
)->run;
Expand Down
16 changes: 14 additions & 2 deletions t/storage/dbh_do.t
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@ use DBICTest;
my $schema = DBICTest->init_schema();
my $storage = $schema->storage;

# test (re)connection
for my $disconnect (0, 1) {
$schema->storage->_dbh->disconnect if $disconnect;
is_deeply (
$schema->storage->dbh_do(sub { $_[1]->selectall_arrayref('SELECT 1') }),
[ [ 1 ] ],
'dbh_do on fresh handle worked',
);
}

my @args;
my $test_func = sub { @args = @_ };

Expand All @@ -31,9 +41,11 @@ is_deeply (
[ $storage, $storage->dbh, "baz", "buz" ],
);

# test aliasing
# test nested aliasing
my $res = 'original';
$storage->dbh_do (sub { $_[2] = 'changed' }, $res);
$storage->dbh_do (sub {
shift->dbh_do(sub { $_[3] = 'changed' }, @_)
}, $res);

is ($res, 'changed', "Arguments properly aliased for dbh_do");

Expand Down

0 comments on commit 8f6986a

Please sign in to comment.