X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FBlockRunner.pm;h=9b5bdbc6b51a888dd4eca1132d234423a293a815;hb=36600771d6808d7ab45110c77a494510568ce3c7;hp=8dae0c9be71dd4d9f8fdfa21e7609044712f94dd;hpb=59d624cf78c63416f50aceff6391b8b80227e4f5;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/BlockRunner.pm b/lib/DBIx/Class/Storage/BlockRunner.pm index 8dae0c9..9b5bdbc 100644 --- a/lib/DBIx/Class/Storage/BlockRunner.pm +++ b/lib/DBIx/Class/Storage/BlockRunner.pm @@ -1,22 +1,16 @@ package # hide from pause until we figure it all out DBIx::Class::Storage::BlockRunner; +use warnings; use strict; use DBIx::Class::Exception; use DBIx::Class::Carp; use Context::Preserve 'preserve_context'; -use DBIx::Class::_Util 'is_exception'; +use DBIx::Class::_Util qw( is_exception qsub dbic_internal_try ); use Scalar::Util qw(weaken blessed reftype); use Try::Tiny; - -# DO NOT edit away without talking to riba first, he will just put it back -BEGIN { - local $ENV{PERL_STRICTURES_EXTRA} = 0; - require Moo; Moo->import; - require Sub::Quote; Sub::Quote->import('quote_sub'); -} -use warnings NONFATAL => 'all'; +use Moo; use namespace::clean; =head1 NAME @@ -43,16 +37,16 @@ has wrap_txn => ( has retry_handler => ( is => 'ro', required => 1, - isa => quote_sub( q{ + isa => qsub q{ (Scalar::Util::reftype($_[0])||'') eq 'CODE' or DBIx::Class::Exception->throw('retry_handler must be a CODE reference') - }), + }, ); has retry_debug => ( is => 'rw', # use a sub - to be evaluated on the spot lazily - default => quote_sub( '$ENV{DBIC_STORAGE_RETRY_DEBUG}' ), + default => qsub '$ENV{DBIC_STORAGE_RETRY_DEBUG}', lazy => 1, ); @@ -67,19 +61,19 @@ has failed_attempt_count => ( writer => '_set_failed_attempt_count', default => 0, lazy => 1, - trigger => quote_sub(q{ + trigger => qsub q{ $_[0]->throw_exception( sprintf ( 'Reached max_attempts amount of %d, latest exception: %s', $_[0]->max_attempts, $_[0]->last_exception )) if $_[0]->max_attempts <= ($_[1]||0); - }), + }, ); has exception_stack => ( is => 'ro', init_arg => undef, clearer => '_reset_exception_stack', - default => quote_sub(q{ [] }), + default => qsub q{ [] }, lazy => 1, ); @@ -128,7 +122,7 @@ sub _run { my $run_err = ''; return preserve_context { - try { + dbic_internal_try { if (defined $txn_init_depth) { $self->storage->txn_begin; $txn_begin_ok = 1; @@ -142,9 +136,14 @@ sub _run { my @res = @_; my $storage = $self->storage; - my $cur_depth = $storage->transaction_depth; - if (defined $txn_init_depth and $run_err eq '') { + if ( + defined $txn_init_depth + and + ! is_exception $run_err + and + defined( my $cur_depth = $storage->transaction_depth ) + ) { my $delta_txn = (1 + $txn_init_depth) - $cur_depth; if ($delta_txn) { @@ -157,29 +156,23 @@ sub _run { ) unless $delta_txn == 1 and $cur_depth == 0; } else { - $run_err = eval { $storage->txn_commit; 1 } ? '' : $@; + dbic_internal_try { + $storage->txn_commit; + 1; + } + catch { + $run_err = $_; + }; } } # something above threw an error (could be the begin, the code or the commit) if ( is_exception $run_err ) { - # attempt a rollback if we did begin in the first place - if ($txn_begin_ok) { - # some DBDs go crazy if there is nothing to roll back on, perform a soft-check - my $rollback_exception = $storage->_seems_connected - ? (! eval { $storage->txn_rollback; 1 }) ? $@ : '' - : 'lost connection to storage' - ; - - if ( $rollback_exception and ( - ! defined blessed $rollback_exception - or - ! $rollback_exception->isa('DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION') - ) ) { - $run_err = "Transaction aborted: $run_err. Rollback failed: $rollback_exception"; - } - } + # Attempt a rollback if we did begin in the first place + # Will append rollback error if possible + $storage->__delicate_rollback( \$run_err ) + if $txn_begin_ok; push @{ $self->exception_stack }, $run_err; @@ -194,7 +187,12 @@ sub _run { # FIXME - we assume that $storage->{_dbh_autocommit} is there if # txn_init_depth is there, but this is a DBI-ism $txn_init_depth > ( $storage->{_dbh_autocommit} ? 0 : 1 ) - ) or ! $self->retry_handler->($self) + ) + or + ! do { + local $self->storage->{_in_do_block_retry_handler} = 1; + $self->retry_handler->($self) + } ); # we got that far - let's retry @@ -219,13 +217,16 @@ sub _run { }; } -=head1 AUTHOR AND CONTRIBUTORS +=head1 FURTHER QUESTIONS? -See L and L in DBIx::Class +Check the list of L. -=head1 LICENSE +=head1 COPYRIGHT AND LICENSE -You may distribute this code under the same terms as Perl itself. +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. =cut