Made ->update not change the hashref passed in (with test.)
Ash Berlin [Sat, 3 Feb 2007 21:33:19 +0000 (21:33 +0000)]
lib/DBIx/Class/Relationship/Accessor.pm
lib/DBIx/Class/Row.pm
t/68inflate.t

index b77ce00..e98c9a2 100644 (file)
@@ -84,6 +84,7 @@ sub new {
 
 sub update {
   my ($obj, $attrs, @rest) = @_;
+  $attrs = { %$attrs} if $attrs; # Take copy so we dont change passed hashref
   my $info;
   foreach my $key (keys %{$attrs||{}}) {
     next unless $info = $obj->relationship_info($key);
index 73500bd..4a55f50 100644 (file)
@@ -110,6 +110,9 @@ required.
 
 sub update {
   my ($self, $upd) = @_;
+  # Create a copy so we dont mess with original  
+  $upd = { %$upd } if $upd;
+
   $self->throw_exception( "Not in database" ) unless $self->in_storage;
   my $ident_cond = $self->ident_condition;
   $self->throw_exception("Cannot safely update a row in a PK-less table")
index 2e7c374..9cbaab9 100644 (file)
@@ -11,7 +11,7 @@ my $schema = DBICTest->init_schema();
 eval { require DateTime };
 plan skip_all => "Need DateTime for inflation tests" if $@;
 
-plan tests => 20;
+plan tests => 22;
 
 DBICTest::Schema::CD->inflate_column( 'year',
     { inflate => sub { DateTime->new( year => shift ) },
@@ -90,6 +90,12 @@ ok(!$@, 'update using scalarref ok');
 $cd = $schema->resultset("CD")->find(3);                 
 is($cd->year->year, $before_year + 1, 'deflate ok');
 
+my $upd = { 'year' => $now->truncate(to => 'month'), title => 'An Updated Title' };
+my $upd_copy = { %$upd };
+eval { $cd->update($upd) };
+ok(!$@, 'update worked okay');
+ok(exists $upd->{year} && $upd->{year} == $upd_copy->{year}, "update doesn't change passed hashref");
+
 # discard_changes test
 $cd = $schema->resultset("CD")->find(3);                 
 # inflate the year