X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=39cd754c7665cce780d9f37d6e1a7b702bb93c5d;hb=52864fbd5c6035f8f3961173ad05c2cc58fe9a34;hp=a5e0e120360f2823124426f8da1e4a29f4573509;hpb=f0fb90aea07b7fd664aae2002ffab51ff64457b6;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index a5e0e12..39cd754 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,39 @@ 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||{}}) { - - 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); + if ($prefetch) { + for my $pre ( keys %$prefetch ) { - my $accessor = $source->relationship_info($pre)->{attrs}{accessor} - or $class->throw_exception("No accessor type declared for prefetched relationship '$pre'"); + my @pre_objects; + if ( + @{$prefetch->{$pre}||[]} + and + ref($prefetch->{$pre}) ne $DBIx::Class::ResultSource::RowParser::Util::null_branch_class + ) { + my $pre_source = $source->related_source($pre); - 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 defined 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);