From: Ash Berlin Date: Sat, 3 Feb 2007 21:33:19 +0000 (+0000) Subject: Made ->update not change the hashref passed in (with test.) X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=bd3d5a5e91e959cc7f4fcf0d10a15d65412115b9;p=dbsrgits%2FDBIx-Class-Historic.git Made ->update not change the hashref passed in (with test.) --- diff --git a/lib/DBIx/Class/Relationship/Accessor.pm b/lib/DBIx/Class/Relationship/Accessor.pm index b77ce00..e98c9a2 100644 --- a/lib/DBIx/Class/Relationship/Accessor.pm +++ b/lib/DBIx/Class/Relationship/Accessor.pm @@ -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); diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index 73500bd..4a55f50 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -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") diff --git a/t/68inflate.t b/t/68inflate.t index 2e7c374..9cbaab9 100644 --- a/t/68inflate.t +++ b/t/68inflate.t @@ -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