allow pk mutation via column accessor + update
Brandon L. Black [Mon, 11 Dec 2006 01:00:22 +0000 (01:00 +0000)]
lib/DBIx/Class/Row.pm
t/69update.t

index 213f3cc..ee4e84c 100644 (file)
@@ -117,7 +117,7 @@ sub update {
   my %to_update = $self->get_dirty_columns;
   return $self unless keys %to_update;
   my $rows = $self->result_source->storage->update(
-               $self->result_source->from, \%to_update, $ident_cond);
+               $self->result_source->from, \%to_update, $self->{_orig_ident} || $ident_cond);
   if ($rows == 0) {
     $self->throw_exception( "Can't update ${self}: row not found" );
   } elsif ($rows > 1) {
@@ -242,6 +242,18 @@ sub set_column {
   my $self = shift;
   my ($column) = @_;
   my $old = $self->get_column($column);
+
+  # save our original ident condition if
+  #  they modify any part of the PK
+  if(!$self->{_orig_ident}) {
+    foreach ($self->primary_columns) {
+       if($_ eq $column) {
+           $self->{_orig_ident} = $self->ident_condition;
+           last;
+       }
+    }
+  }
+
   my $ret = $self->store_column(@_);
   $self->{_dirty_columns}{$column} = 1
     if (defined $old ^ defined $ret) || (defined $old && $old ne $ret);
index b11ebde..4686876 100644 (file)
@@ -9,7 +9,7 @@ my $schema = DBICTest->init_schema();
 
 BEGIN {
         eval "use DBD::SQLite";
-        plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 5);
+        plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 6);
 }                                                                               
 
 my $art = $schema->resultset("Artist")->find(1);
@@ -30,3 +30,7 @@ $art->discard_changes;
 ok($art->update({ artistid => 100 }), 'update allows pk mutation');
 
 is($art->artistid, 100, 'pk mutation applied');
+
+my $art_100 = $schema->resultset("Artist")->find(100);
+$art_100->artistid(101);
+ok($art_100->update(), 'update allows pk mutation via column accessor');