Fix stupid oversight in update_all
Peter Rabbitson [Tue, 7 Jun 2011 08:04:13 +0000 (10:04 +0200)]
Changes
lib/DBIx/Class/ResultSet.pm
t/update/all.t [new file with mode: 0644]

diff --git a/Changes b/Changes
index 9b4179e..be62dda 100644 (file)
--- a/Changes
+++ b/Changes
@@ -15,6 +15,8 @@ Revision history for DBIx::Class
           from 0.08191 - documentation was in fact incorrect, not the code
         - Fix Sybase ASE IC::DateTime support (::Storage going out of sync
           with new default format expected by DateTime::Format::Sybase)
+        - Fix a bug in update_all() resulting in the first row receiving a
+          different dataset than the subsequent ones
 
 0.08192 2011-05-10 04:20 (UTC)
     * Fixes
index 7f9174c..b12fca7 100644 (file)
@@ -1830,7 +1830,7 @@ sub update_all {
     unless ref $values eq 'HASH';
 
   my $guard = $self->result_source->schema->txn_scope_guard;
-  $_->update($values) for $self->all;
+  $_->update({%$values}) for $self->all;  # shallow copy - update will mangle it
   $guard->commit;
   return 1;
 }
diff --git a/t/update/all.t b/t/update/all.t
new file mode 100644 (file)
index 0000000..acc8387
--- /dev/null
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+
+use Test::More;
+use lib qw(t/lib);
+use DBICTest;
+
+my $schema = DBICTest->init_schema();
+
+my $new_artist = $schema->resultset('Artist')->create({ name => 'new kid behind the block' });
+
+# see how many cds do we have, and relink them all to the new guy
+my $cds = $schema->resultset('CD');
+my $cds_count = $cds->count;
+cmp_ok($cds_count, '>', 0, 'have some cds');
+
+$cds->update_all({ artist => $new_artist });
+
+is( $new_artist->cds->count, $cds_count, 'All cds properly relinked');
+
+done_testing;