X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=bdc7aee8b0d36a6857f171550c55128d005cc6e1;hb=4df1400e9a42e3e19f143151de2c8ba5865cb553;hp=f56ec61e21bc201dae82c0005e007fa03a8da88c;hpb=0077982b2edc8273ab4b6ea59921177667008cb3;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index f56ec61..bdc7aee 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -22,6 +22,8 @@ BEGIN { use namespace::clean; +__PACKAGE__->mk_group_accessors ( simple => [ in_storage => '_in_storage' ] ); + =head1 NAME DBIx::Class::Row - Basic row methods @@ -176,7 +178,7 @@ sub new { my ($class, $attrs) = @_; $class = ref $class if ref $class; - my $new = bless { _column_data => {} }, $class; + my $new = bless { _column_data => {}, _in_storage => 0 }, $class; if ($attrs) { $new->throw_exception("attrs must be a hashref") @@ -480,13 +482,6 @@ are used. Creating a result object using L, or calling L on one, sets it to false. -=cut - -sub in_storage { - my ($self, $val) = @_; - $self->{_in_storage} = $val if @_ > 1; - return $self->{_in_storage} ? 1 : 0; -} =head2 update @@ -619,7 +614,7 @@ sub delete { ); delete $self->{_column_data_in_storage}; - $self->in_storage(undef); + $self->in_storage(0); } else { my $rsrc = try { $self->result_source_instance } @@ -773,6 +768,7 @@ Marks a column as having been changed regardless of whether it has really changed. =cut + sub make_column_dirty { my ($self, $column) = @_; @@ -1181,48 +1177,54 @@ L, see L. sub inflate_result { my ($class, $source, $me, $prefetch) = @_; - $source = $source->resolve - if $source->isa('DBIx::Class::ResultSourceHandle'); - my $new = bless { _column_data => $me, _result_source => $source }, ref $class || $class ; - foreach my $pre (keys %{$prefetch||{}}) { + if ($prefetch) { + for my $pre ( keys %$prefetch ) { - my @pre_vals; - @pre_vals = (ref $prefetch->{$pre}[0] eq 'ARRAY') - ? @{$prefetch->{$pre}} : $prefetch->{$pre} - if @{$prefetch->{$pre}}; - - my $pre_source = $source->related_source($pre); + my @pre_objects; + if ( + @{$prefetch->{$pre}||[]} + and + ref($prefetch->{$pre}) ne $DBIx::Class::ResultSource::RowParser::Util::null_branch_class + ) { + my $pre_source = try { + $source->related_source($pre) + } catch { + my $err = sprintf + "Inflation into non-existent relationship '%s' of '%s' requested", + $pre, + $source->source_name, + ; + if (my ($colname) = sort { length($a) <=> length ($b) } keys %{$prefetch->{$pre}[0] || {}} ) { + $err .= sprintf ", check the inflation specification (columns/as) ending in '...%s.%s'", + $pre, + $colname, + } - my $accessor = $source->relationship_info($pre)->{attrs}{accessor} - or $class->throw_exception("No accessor type declared for prefetched relationship '$pre'"); + $source->throw_exception($err); + }; - my @pre_objects; - for my $me_pref (@pre_vals) { + @pre_objects = map { + $pre_source->result_class->inflate_result( $pre_source, @$_ ) + } ( ref $prefetch->{$pre}[0] eq 'ARRAY' ? @{$prefetch->{$pre}} : $prefetch->{$pre} ); + } - # 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, see - # t/resultset/inflate_result_api.t - next unless first { defined $_ } values %{$me_pref->[0]}; + my $accessor = $source->relationship_info($pre)->{attrs}{accessor} + or $class->throw_exception("No accessor type declared for prefetched relationship '$pre'"); - push @pre_objects, $pre_source->result_class->inflate_result( - $pre_source, @$me_pref - ); - } + if ($accessor eq 'single') { + $new->{_relationship_data}{$pre} = $pre_objects[0]; + } + elsif ($accessor eq 'filter') { + $new->{_inflated_column}{$pre} = $pre_objects[0]; + } - if ($accessor eq 'single') { - $new->{_relationship_data}{$pre} = $pre_objects[0]; + $new->related_resultset($pre)->set_cache(\@pre_objects); } - elsif ($accessor eq 'filter') { - $new->{_inflated_column}{$pre} = $pre_objects[0]; - } - - $new->related_resultset($pre)->set_cache(\@pre_objects); } $new->in_storage (1);