]> Dogcows Code - chaz/p5-DBIx-Class-ResultSet-RecursiveUpdate/blobdiff - lib/DBIx/Class/ResultSet/RecursiveUpdate.pm
croak instead of carp if fixed_fields isn't an arrayref
[chaz/p5-DBIx-Class-ResultSet-RecursiveUpdate] / lib / DBIx / Class / ResultSet / RecursiveUpdate.pm
index 2d0c235ae5370a532b3add0ce8401ac6c0f70b39..6626c1c9145b66eb110810baafa722e32314559b 100644 (file)
@@ -47,22 +47,27 @@ sub recursive_update {
         };
     $resolved ||= {};
 
-    # warn 'entering: ' . $self->result_source->from();
-    carp 'fixed fields needs to be an array ref'
+    my $source = $self->result_source;
+
+    # warn 'entering: ' . $source->from();
+    croak 'fixed fields needs to be an arrayref'
         if defined $fixed_fields && ref $fixed_fields ne 'ARRAY';
 
     if ( blessed($updates) && $updates->isa('DBIx::Class::Row') ) {
         return $updates;
     }
-    if ( $updates->{id} ) {
+    if ( exists $updates->{id} ) {
+        # warn "finding object by id " . $updates->{id} . "\n";
         $object = $self->find( $updates->{id}, { key => 'primary' } );
+        # warn "object not found by id\n"
+        #     unless defined $object;
     }
 
     my %fixed_fields = map { $_ => 1 } @$fixed_fields
         if $fixed_fields;
     my @missing =
         grep { !exists $updates->{$_} && !exists $fixed_fields{$_} }
-        $self->result_source->primary_columns;
+        $source->primary_columns;
     if ( !$object && !scalar @missing ) {
 
         # warn 'finding by: ' . Dumper( $updates ); use Data::Dumper;
@@ -73,10 +78,12 @@ sub recursive_update {
         grep { !exists $resolved->{$_} } @missing;
     if ( !$object && !scalar @missing ) {
 
-       # warn 'finding by +resolved: ' . Dumper( $updates ); use Data::Dumper;
+        # warn 'finding by +resolved: ' . Dumper( $updates ); use Data::Dumper;
         $object = $self->find( $updates, { key => 'primary' } );
     }
-    $object ||= $self->new( {} );
+
+    $object = $self->new( {} )
+        unless defined $object;
 
     # warn Dumper( $updates ); use Data::Dumper;
     # direct column accessors
@@ -90,14 +97,13 @@ sub recursive_update {
     # database like has_many, might_have and has_one
     my %post_updates;
     my %other_methods;
+    my %m2m_accessors;
     my %columns_by_accessor = _get_columns_by_accessor($self);
 
     #    warn 'resolved: ' . Dumper( $resolved );
     #    warn 'updates: ' . Dumper( $updates ); use Data::Dumper;
     #    warn 'columns: ' . Dumper( \%columns_by_accessor );
     for my $name ( keys %$updates ) {
-        my $source = $self->result_source;
-
         # columns
         if ( exists $columns_by_accessor{$name}
             && !( $source->has_relationship($name)
@@ -129,7 +135,7 @@ sub recursive_update {
         if ( is_m2m( $self, $name ) ) {
 
             #warn "$name is a many-to-many helper accessor\n";
-            $other_methods{$name} = $updates->{$name};
+            $m2m_accessors{$name} = $updates->{$name};
             next;
         }
 
@@ -166,7 +172,7 @@ sub recursive_update {
     for my $name ( keys %other_methods ) {
 
         #warn "update other $name\n";
-        $object->$name( $updates->{$name} );
+        $object->$name( $other_methods{$name} );
     }
     for my $name ( keys %pre_updates ) {
 
@@ -179,48 +185,46 @@ sub recursive_update {
     # don't allow insert to recurse to related objects
     # do the recursion ourselves
     # $object->{_rel_in_storage} = 1;
-    #warn "CHANGED: " . $object->is_changed . "\n":
+    #warn "CHANGED: " . $object->is_changed . "\n";
     #warn "IN STOR: " .  $object->in_storage . "\n";
     $object->update_or_insert if $object->is_changed;
     $object->discard_changes;
 
     # updating many_to_many
-    for my $name ( keys %$updates ) {
-        next if exists $columns{$name};
-        my $value = $updates->{$name};
-
-        if ( is_m2m( $self, $name ) ) {
-
-            #warn "update m2m $name\n";
-            my ($pk) = _get_pk_for_related( $self, $name );
-            my @rows;
-            my $result_source = $object->$name->result_source;
-            my @updates;
-            if ( !defined $value ) {
-                next;
-            }
-            elsif ( ref $value ) {
-                @updates = @{$value};
+    for my $name ( keys %m2m_accessors ) {
+        my $value = $m2m_accessors{$name};
+
+        #warn "update m2m $name\n";
+        # TODO: only first pk col is used
+        my ($pk) = _get_pk_for_related( $self, $name );
+        my @rows;
+        my $result_source = $object->$name->result_source;
+        my @updates;
+        if ( !defined $value ) {
+            #next;
+            @updates = ();
+        }
+        elsif ( ref $value ) {
+            @updates = @{$value};
+        }
+        else {
+            @updates = ($value);
+        }
+        for my $elem (@updates) {
+            if ( ref $elem ) {
+                push @rows, $elem;
+                    # recursive_update(
+                    # resultset => $result_source->resultset,
+                    # updates   => $elem
+                    # );
             }
             else {
-                @updates = ($value);
-            }
-            for my $elem (@updates) {
-                if ( ref $elem ) {
-                    push @rows,
-                        recursive_update(
-                        resultset => $result_source->resultset,
-                        updates   => $elem
-                        );
-                }
-                else {
-                    push @rows,
-                        $result_source->resultset->find( { $pk => $elem } );
-                }
+                push @rows,
+                    $result_source->resultset->find( { $pk => $elem } );
             }
-            my $set_meth = 'set_' . $name;
-            $object->$set_meth( \@rows );
         }
+        my $set_meth = 'set_' . $name;
+        $object->$set_meth( \@rows );
     }
     for my $name ( keys %post_updates ) {
 
This page took 0.021752 seconds and 4 git commands to generate.