Added supports() and rewrote the tests so that Engine::DBI doesn't run the transactio...
Rob Kinyon [Wed, 30 Dec 2009 23:02:15 +0000 (18:02 -0500)]
12 files changed:
lib/DBM/Deep.pm
lib/DBM/Deep.pod
lib/DBM/Deep/Engine.pm
lib/DBM/Deep/Engine/DBI.pm
lib/DBM/Deep/Engine/File.pm
t/33_transactions.t
t/34_transaction_arrays.t
t/35_transaction_multiple.t
t/41_transaction_multilevel.t
t/42_transaction_indexsector.t
t/43_transaction_maximum.t
t/45_references.t

index bf507fc..1ae5d39 100644 (file)
@@ -379,6 +379,11 @@ sub clone {
     );
 }
 
+sub supports {
+    my $self = shift;
+    return $self->_engine->supports( @_ );
+}
+
 #XXX Migrate this to the engine, where it really belongs and go through some
 # API - stop poking in the innards of someone else..
 {
index 1a8f24c..6d0a263 100644 (file)
@@ -412,6 +412,17 @@ This copy is in RAM, not on disk like the DB is.
 
 These are the transactional functions. L</TRANSACTIONS> for more information.
 
+=item * supports( $option )
+
+This returns a boolean depending on if this instance of DBM::Dep supports
+that feature. C<$option> can be one of:
+
+=over 4
+
+=item * transactions
+
+=back
+
 =back
 
 =head2 Hashes
index 83d520f..ad6bff4 100644 (file)
@@ -346,6 +346,21 @@ This is the cache of loaded Reference sectors.
 sub cache       { $_[0]{cache} ||= {} }
 sub clear_cache { %{$_[0]->cache} = () }
 
+=head2 supports( $option )
+
+This returns a boolean depending on if this instance of DBM::Dep supports
+that feature. C<$option> can be one of:
+
+=over 4
+
+=item * transactions
+
+=back
+
+=cut
+
+sub supports { die "supports must be implemented in a child class" }
+
 =head2 ACCESSORS
 
 The following are readonly attributes.
index 6d7a533..4daf00b 100644 (file)
@@ -311,21 +311,17 @@ sub write_value {
     return 1;
 }
 
-sub begin_work {
-    my $self = shift;
-    my ($obj) = @_;
-}
+sub begin_work { die "Transactions are not supported by thie engine" } 
+sub rollback   { die "Transactions are not supported by thie engine" } 
+sub commit     { die "Transactions are not supported by thie engine" }
 
-sub rollback {
-    my $self = shift;
-    my ($obj) = @_;
-}
+sub supports {
+    shift;
+    my ($feature) = @_;
 
-sub commit {
-    my $self = shift;
-    my ($obj) = @_;
+    return if $feature eq 'transactions';
+    return;
 }
 
-
 1;
 __END__
index 846e389..f5145c4 100644 (file)
@@ -1029,6 +1029,14 @@ sub set_trans_loc { $_[0]{trans_loc} = $_[1] }
 sub chains_loc     { $_[0]{chains_loc} }
 sub set_chains_loc { $_[0]{chains_loc} = $_[1] }
 
+sub supports {
+    shift;
+    my ($feature) = @_;
+
+    return 1 if $feature eq 'transactions';
+    return;
+}
+
 =head2 _dump_file()
 
 This method takes no arguments. It's used to print out a textual representation
index 76609f9..3107cc0 100644 (file)
@@ -8,11 +8,6 @@ use t::common qw( new_dbm );
 
 use_ok( 'DBM::Deep' );
 
-if ( $ENV{NO_TEST_TRANSACTIONS} ) {
-    done_testing;
-    exit;
-}
-
 my $dbm_factory = new_dbm(
     locking => 1,
     autoflush => 1,
@@ -20,6 +15,8 @@ my $dbm_factory = new_dbm(
 );
 while ( my $dbm_maker = $dbm_factory->() ) {
     my $db1 = $dbm_maker->();
+    next unless $db1->supports( 'transactions' );
+
     my $db2 = $dbm_maker->();
 
     $db1->{x} = 'y';
index 13b08f3..8513bbe 100644 (file)
@@ -7,11 +7,6 @@ use t::common qw( new_dbm );
 
 use_ok( 'DBM::Deep' );
 
-if ( $ENV{NO_TEST_TRANSACTIONS} ) {
-    done_testing;
-    exit;
-}
-
 my $dbm_factory = new_dbm(
     locking => 1,
     autoflush => 1,
@@ -20,6 +15,7 @@ my $dbm_factory = new_dbm(
 );
 while ( my $dbm_maker = $dbm_factory->() ) {
     my $db1 = $dbm_maker->();
+    next unless $db1->supports( 'transactions' );
     my $db2 = $dbm_maker->();
 
     $db1->[0] = 'y';
index 3dc039a..61505f1 100644 (file)
@@ -7,19 +7,14 @@ use t::common qw( new_dbm );
 
 use_ok( 'DBM::Deep' );
 
-if ( $ENV{NO_TEST_TRANSACTIONS} ) {
-    done_testing;
-    exit;
-}
-
 my $dbm_factory = new_dbm(
     locking => 1,
     autoflush => 1,
     num_txns  => 16,
 );
-
 while ( my $dbm_maker = $dbm_factory->() ) {
     my $db1 = $dbm_maker->();
+    next unless $db1->supports( 'transactions' );
     my $db2 = $dbm_maker->();
     my $db3 = $dbm_maker->();
 
index c1ce955..790fa36 100644 (file)
@@ -5,11 +5,6 @@ use t::common qw( new_dbm );
 
 use_ok( 'DBM::Deep' );
 
-if ( $ENV{NO_TEST_TRANSACTIONS} ) {
-    done_testing;
-    exit;
-}
-
 my $dbm_factory = new_dbm(
     locking   => 1,
     autoflush => 1,
@@ -17,6 +12,7 @@ my $dbm_factory = new_dbm(
 );
 while ( my $dbm_maker = $dbm_factory->() ) {
     my $db1 = $dbm_maker->();
+    next unless $db1->supports('transactions');
     my $db2 = $dbm_maker->();
 
     $db1->{x} = { xy => { foo => 'y' } };
index 44bb375..39274fc 100644 (file)
@@ -14,11 +14,6 @@ use_ok( 'DBM::Deep' );
 # reindexing at 17 keys vs. attempting to hit the second-level reindex which
 # can occur as early as 18 keys and as late as 4097 (256*16+1) keys.
 
-if ( $ENV{NO_TEST_TRANSACTIONS} ) {
-    done_testing;
-    exit;
-}
-
 {
     my $dbm_factory = new_dbm(
         locking => 1,
@@ -27,6 +22,7 @@ if ( $ENV{NO_TEST_TRANSACTIONS} ) {
     );
     while ( my $dbm_maker = $dbm_factory->() ) {
         my $db1 = $dbm_maker->();
+        next unless $db1->supports( 'transactions' );
         my $db2 = $dbm_maker->();
 
         $db1->{x} = 'y';
@@ -62,6 +58,7 @@ if ( $ENV{NO_TEST_TRANSACTIONS} ) {
     );
     while ( my $dbm_maker = $dbm_factory->() ) {
         my $db1 = $dbm_maker->();
+        next unless $db1->supports( 'transactions' );
         my $db2 = $dbm_maker->();
 
         $db1->{x} = 'y';
index cbefd48..2998cea 100644 (file)
@@ -10,19 +10,16 @@ use_ok( 'DBM::Deep' );
 
 my $max_txns = 255;
 
-if ( $ENV{NO_TEST_TRANSACTIONS} ) {
-    done_testing;
-    exit;
-}
-
 my $dbm_factory = new_dbm(
     num_txns  => $max_txns,
 );
 while ( my $dbm_maker = $dbm_factory->() ) {
-    my @dbs = grep { $_ } map {
-        eval { $dbm_maker->() }
-    } 1 .. $max_txns;
+    my @dbs = ( $dbm_maker->() );
+    next unless $dbs[0]->supports('transactions');
 
+    push @dbs, grep { $_ } map {
+        eval { $dbm_maker->() }
+    } 2 .. $max_txns;
 
     cmp_ok( scalar(@dbs), '==', $max_txns, "We could open enough DB handles" );
 
index 0a1a061..b37f8f9 100644 (file)
@@ -7,11 +7,6 @@ use t::common qw( new_dbm );
 
 use_ok( 'DBM::Deep' );
 
-if ( $ENV{NO_TEST_TRANSACTIONS} ) {
-    done_testing;
-    exit;
-}
-
 my $dbm_factory = new_dbm(
     locking => 1,
     autoflush => 1,
@@ -19,6 +14,7 @@ my $dbm_factory = new_dbm(
 );
 while ( my $dbm_maker = $dbm_factory->() ) {
     my $db1 = $dbm_maker->();
+    next unless $db1->supports( 'transactions' );
     my $db2 = $dbm_maker->();
 
     $db1->{foo} = 5;