+BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
+
use strict;
use warnings;
use Test::More;
use Test::Exception;
-use DBIx::Class::Optional::Dependencies ();
+use DBIx::Class::Optional::Dependencies;
+use DBIx::Class::_Util qw(sigwarn_silencer scope_guard);
+use Scalar::Util 'weaken';
+
+use DBICTest;
+
+{
+ package # moar hide
+ DBICTest::SVPTracerObj;
+
+ use base 'DBIx::Class::Storage::Statistics';
+
+ sub query_start { 'do notning'}
+ sub callback { 'dummy '}
+
+ for my $svpcall (map { "svp_$_" } qw(begin rollback release)) {
+ no strict 'refs';
+ *$svpcall = sub { $_[0]{uc $svpcall}++ };
+ }
+}
my $env2optdep = {
DBICTEST_PG => 'test_rdbms_pg',
DBICTEST_MYSQL => 'test_rdbms_mysql',
};
-use lib qw(t/lib);
-use DBICTest;
-use DBICTest::Stats;
-
my $schema;
for ('', keys %$env2optdep) { SKIP: {
my $prefix;
if ($prefix = $_) {
- my ($dsn, $user, $pass) = map { $ENV{"${prefix}_$_"} } qw/DSN USER PASS/;
- skip ("Skipping tests with $prefix: set \$ENV{${prefix}_DSN} _USER and _PASS", 1)
- unless $dsn;
+ DBIx::Class::Optional::Dependencies->skip_without($env2optdep->{$prefix});
- skip ("Testing with ${prefix}_DSN needs " . DBIx::Class::Optional::Dependencies->req_missing_for( $env2optdep->{$prefix} ), 1)
- unless DBIx::Class::Optional::Dependencies->req_ok_for($env2optdep->{$prefix});
+ my ($dsn, $user, $pass) = map { $ENV{"${prefix}_$_"} } qw/DSN USER PASS/;
$schema = DBICTest::Schema->connect ($dsn,$user,$pass,{ auto_savepoint => 1 });
note "Testing $prefix";
- my $stats = DBICTest::Stats->new;
- $schema->storage->debugobj($stats);
- $schema->storage->debug(1);
+ # can not use local() due to an unknown number of storages
+ # (think replicated)
+ my $orig_states = { map
+ { $_ => $schema->storage->$_ }
+ qw(debugcb debugobj debug)
+ };
+ my $sg = scope_guard {
+ $schema->storage->$_ ( $orig_states->{$_} ) for keys %$orig_states;
+ };
+ $schema->storage->debugobj (my $stats = DBICTest::SVPTracerObj->new);
+ $schema->storage->debug (1);
$schema->resultset('Artist')->create({ name => 'foo' });
undef,
'rollback from inner transaction';
+ # make sure a fresh txn will work after above
+ $schema->storage->txn_do(sub { ok "noop" } );
+
+### Make sure non-existend savepoint release doesn't infloop itself
+ {
+ weaken( my $s = $schema );
+
+ throws_ok {
+ $s->storage->txn_do(sub { $s->svp_release('wibble') })
+ } qr/Savepoint 'wibble' does not exist/,
+ "Calling svp_release on a non-existant savepoint throws expected error"
+ ;
+ }
+
### cleanupz
- $schema->storage->dbh->do ("DROP TABLE artist");
+ $schema->storage->dbh_do(sub { $_[1]->do("DROP TABLE artist") });
}}
done_testing;
END {
- eval { $schema->storage->dbh->do ("DROP TABLE artist") } if defined $schema;
+ eval { $schema->storage->dbh_do(sub { $_[1]->do("DROP TABLE artist") }) } if defined $schema;
undef $schema;
}