X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FTxnScopeGuard.pm;h=ca7cad7418eb1dc0854150a182a619de6d1b61fb;hb=64cdad22d9b4022de379ae43174c15ce8dc81b59;hp=04978f93a3816706a39f841fcd2e757e2e6126e7;hpb=1bc193ac4c3bb934d1877e49bf7c465fc82815d6;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/TxnScopeGuard.pm b/lib/DBIx/Class/Storage/TxnScopeGuard.pm index 04978f9..ca7cad7 100644 --- a/lib/DBIx/Class/Storage/TxnScopeGuard.pm +++ b/lib/DBIx/Class/Storage/TxnScopeGuard.pm @@ -1,4 +1,5 @@ -package DBIx::Class::Storage::TxnScopeGuard; +package # Hide from pause for now - till we get it working + DBIx::Class::Storage::TxnScopeGuard; use strict; use warnings; @@ -20,7 +21,24 @@ sub commit { sub DESTROY { my ($dismiss, $storage) = @{$_[0]}; - $storage->txn_rollback unless $dismiss; + return if $dismiss; + + my $exception = $@; + Carp::cluck("A DBIx::Class::Storage::TxnScopeGuard went out of scope without explicit commit or an error - bad") + unless $exception; + { + local $@; + eval { $storage->txn_rollback }; + my $rollback_exception = $@; + if($rollback_exception) { + my $exception_class = "DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION"; + + $storage->throw_exception( + "Transaction aborted: ${exception}. " + . "Rollback failed: ${rollback_exception}" + ) unless $rollback_exception =~ /$exception_class/; + } + } } 1; @@ -29,7 +47,7 @@ __END__ =head1 NAME -DBIx::Class::Storage::TxnScopeGuard +DBIx::Class::Storage::TxnScopeGuard - Experimental =head1 SYNOPSIS