From: Peter Rabbitson Date: Fri, 11 Sep 2009 22:58:58 +0000 (+0000) Subject: scopeguard almost done X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=771298cf23765eb1651a11b47650fdf387c29d45;p=dbsrgits%2FDBIx-Class-Historic.git scopeguard almost done --- diff --git a/lib/DBIx/Class/Storage/TxnScopeGuard.pm b/lib/DBIx/Class/Storage/TxnScopeGuard.pm index a9228c1..92b8d36 100644 --- a/lib/DBIx/Class/Storage/TxnScopeGuard.pm +++ b/lib/DBIx/Class/Storage/TxnScopeGuard.pm @@ -25,7 +25,7 @@ sub DESTROY { my $exception = $@; - carp 'A DBIx::Class::Storage::TxnScopeGuard went out of scope without explicit commit or error - bad' + carp 'A DBIx::Class::Storage::TxnScopeGuard went out of scope without explicit commit or error. Rolling back.' unless $exception; my $rollback_exception; @@ -41,7 +41,8 @@ sub DESTROY { ."Rollback failed: ${rollback_exception}"; } else { - carp "Rollback failed: ${rollback_exception}"; + # throws an object (verified with eval{}) but DESTROY eats the exception + $storage->throw_exception ("Rollback failed: ${rollback_exception}"); } } } diff --git a/t/81transactions.t b/t/81transactions.t index 2c399b0..1028e7f 100644 --- a/t/81transactions.t +++ b/t/81transactions.t @@ -276,7 +276,7 @@ $schema->storage->disconnect; # The 0 arg says don't die, just let the scope guard go out of scope # forcing a txn_rollback to happen outer($schema, 0); - }, qr/A DBIx::Class::Storage::TxnScopeGuard went out of scope without explicit commit or error/, 'Out of scope warning detected'); + }, qr/A DBIx::Class::Storage::TxnScopeGuard went out of scope without explicit commit or error. Rolling back./, 'Out of scope warning detected'); ok(!$artist_rs->find({name => 'Death Cab for Cutie'}), "Artist not created"); }, 'rollback successful withot exception'); @@ -329,21 +329,23 @@ $schema->storage->disconnect; }, qr/Deliberate exception.+Rollback failed/s); } -# make sure it simply warns on failed rollbacks -{ +# make sure it warns and dies on failed rollbacks +TODO: { my $schema = DBICTest->init_schema(); - warnings_exist (sub { - my $guard = $schema->txn_scope_guard; - $schema->resultset ('Artist')->create ({ name => 'bohhoo'}); - $schema->storage->disconnect; # this should freak out the guard rollback + local $TODO = "Can't die in DESTROY :("; + + throws_ok (sub { + warnings_exist (sub { + my $guard = $schema->txn_scope_guard; + $schema->resultset ('Artist')->create ({ name => 'bohhoo'}); + + $schema->storage->disconnect; # this should freak out the guard rollback - }, - [ - qr/A DBIx::Class::Storage::TxnScopeGuard went out of scope without explicit commit or error/, - qr/Rollback failed/, - ], - 'out-of-scope with failed rollback properly warned'); + }, + qr/A DBIx::Class::Storage::TxnScopeGuard went out of scope without explicit commit or error. Rolling back./, + 'out-of-scope warning'); + }, qr/Rollback failed:/, 'rollback error thrown' ); } done_testing;