r11725@rob-kinyons-powerbook58: rob | 2006-05-01 15:53:46 -0400
rkinyon [Mon, 1 May 2006 19:53:56 +0000 (19:53 +0000)]
 Fixed import() so that it doesn't tied the data structure that was passed in

Build.PL
lib/DBM/Deep.pm
lib/DBM/Deep/Hash.pm
t/17_import.t

index c73c3f1..420b96d 100644 (file)
--- a/Build.PL
+++ b/Build.PL
@@ -7,6 +7,7 @@ my $build = Module::Build->new(
     license => 'perl',
     requires => {
         'perl'              => '5.6.0',
+        'Clone::Any'        => '0',
         'Digest::MD5'       => '1.00',
         'Fcntl'             => '0.01',
         'FileHandle::Fmode' => '0.05',
index 887481f..e51b544 100644 (file)
@@ -37,6 +37,8 @@ use warnings;
 our $VERSION = q(0.99_03);
 
 use Fcntl qw( :DEFAULT :flock :seek );
+
+use Clone::Any '_clone_data';
 use Digest::MD5 ();
 use FileHandle::Fmode ();
 use Scalar::Util ();
@@ -233,11 +235,12 @@ sub import {
         $struct = $self->_repr( @_ );
     }
 
-#XXX These are correct, but impossible until the other bug is fixed
+    #XXX This isn't the best solution. Better would be to use Data::Walker,
+    #XXX but that's a lot more thinking than I want to do right now.
     eval {
-#        $self->begin_work;
-        $self->_import( $struct );
-#        $self->commit;
+        $self->begin_work;
+        $self->_import( _clone_data( $struct ) );
+        $self->commit;
     }; if ( $@ ) {
         $self->rollback;
         die $@;
index bebc926..b9a00cd 100644 (file)
@@ -13,6 +13,7 @@ sub _get_self {
     eval { local $SIG{'__DIE__'}; tied( %{$_[0]} ) } || $_[0]
 }
 
+#XXX Need to add a check here for @_ % 2
 sub _repr { shift;return { @_ } }
 
 sub _import {
index 27f469b..eeb8688 100644 (file)
@@ -55,3 +55,9 @@ ok( !exists $db->{foo}, "\$db doesn't have the 'foo' key, so \$struct is not tie
 $struct->{hash1}->{foo} = 'bar';
 is( $struct->{hash1}->{foo}, 'bar', "\$struct->{hash1} has foo and it's 'bar'" );
 ok( !exists $db->{hash1}->{foo}, "\$db->{hash1} doesn't have the 'foo' key, so \$struct->{hash1} is not tied" );
+
+__END__
+
+Need to add tests for:
+    - Failure case (have something tied or a glob or something like that)
+    - Where we already have $db->{hash1} to make sure that it's not overwritten