Initial full test pass - all fetches are eager for now
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Row.pm
index 1984d6c..c59f70a 100644 (file)
@@ -357,9 +357,11 @@ sub insert {
       # this ensures we fire store_column only once
       # (some asshats like overriding it)
       if (
-        (! defined $current_rowdata{$_})
+        (!exists $current_rowdata{$_})
           or
-        ( $current_rowdata{$_} ne $returned_cols->{$_})
+        (defined $current_rowdata{$_} xor defined $returned_cols->{$_})
+          or
+        (defined $current_rowdata{$_} and $current_rowdata{$_} ne $returned_cols->{$_})
       );
   }
 
@@ -466,7 +468,7 @@ to C<update>, e.g. ( { %{ $href } } )
 If the values passed or any of the column values set on the object
 contain scalar references, e.g.:
 
-  $row->last_modified(\'NOW()');
+  $row->last_modified(\'NOW()')->update();
   # OR
   $row->update({ last_modified => \'NOW()' });
 
@@ -499,7 +501,7 @@ sub update {
   $self->throw_exception( "Not in database" ) unless $self->in_storage;
 
   my $rows = $self->result_source->storage->update(
-    $self->result_source, \%to_update, $self->ident_condition
+    $self->result_source, \%to_update, $self->_storage_ident_condition
   );
   if ($rows == 0) {
     $self->throw_exception( "Can't update ${self}: row not found" );
@@ -561,7 +563,7 @@ sub delete {
     $self->throw_exception( "Not in database" ) unless $self->in_storage;
 
     $self->result_source->storage->delete(
-      $self->result_source, $self->ident_condition
+      $self->result_source, $self->_storage_ident_condition
     );
 
     delete $self->{_column_data_in_storage};
@@ -591,7 +593,7 @@ sub delete {
 =back
 
 Throws an exception if the column name given doesn't exist according
-to L</has_column>.
+to L<has_column|DBIx::Class::ResultSource/has_column>.
 
 Returns a raw column value from the row object, if it has already
 been fetched from the database or set by an accessor.
@@ -1137,41 +1139,33 @@ sub inflate_result {
 
   foreach my $pre (keys %{$prefetch||{}}) {
 
-    my $pre_source = $source->related_source($pre)
-      or $class->throw_exception("Can't prefetch non-existent relationship ${pre}");
-
-    my $accessor = $source->relationship_info($pre)->{attrs}{accessor}
-      or $class->throw_exception("No accessor for prefetched $pre");
-
     my @pre_vals;
-    if (ref $prefetch->{$pre}[0] eq 'ARRAY') {
-      @pre_vals = @{$prefetch->{$pre}};
+    if (! @{$prefetch->{$pre}}) {
+      # nothing, empty @pre_vals is put in the caches
     }
-    elsif ($accessor eq 'multi') {
-      $class->throw_exception("Implicit prefetch (via select/columns) not supported with accessor 'multi'");
+    elsif (ref $prefetch->{$pre}[0] eq 'ARRAY') {
+      @pre_vals = @{$prefetch->{$pre}};
     }
     else {
       @pre_vals = $prefetch->{$pre};
     }
 
+    my $pre_source = $source->related_source($pre);
+
+    my $accessor = $source->relationship_info($pre)->{attrs}{accessor}
+      or $class->throw_exception("No accessor type declared for prefetched relationship '$pre'");
+
     my @pre_objects;
     for my $me_pref (@pre_vals) {
 
-        # FIXME - this should not be necessary
-        # the collapser currently *could* return bogus elements with all
-        # columns set to undef
-        my $has_def;
-        for (values %{$me_pref->[0]}) {
-          if (defined $_) {
-            $has_def++;
-            last;
-          }
-        }
-        next unless $has_def;
+      # FIXME SUBOPTIMAL - the new row parsers can very well optimize
+      # this away entirely, and *never* return such empty rows.
+      # For now we maintain inflate_result API backcompat
+      next unless first { defined $_ } values %{$me_pref->[0]};
 
-        push @pre_objects, $pre_source->result_class->inflate_result(
-          $pre_source, @$me_pref
-        );
+      push @pre_objects, $pre_source->result_class->inflate_result(
+        $pre_source, @$me_pref
+      );
     }
 
     if ($accessor eq 'single') {
@@ -1370,7 +1364,7 @@ sub get_from_storage {
       $resultset = $resultset->search(undef, $attrs);
     }
 
-    return $resultset->find($self->ident_condition);
+    return $resultset->find($self->_storage_ident_condition);
 }
 
 =head2 discard_changes ($attrs?)
@@ -1430,7 +1424,6 @@ sub discard_changes {
   }
 }
 
-
 =head2 throw_exception
 
 See L<DBIx::Class::Schema/throw_exception>.