X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=a5e0e120360f2823124426f8da1e4a29f4573509;hb=fcf32d045;hp=6d69cfd52633b2e20fa4cf2081f62cb2643d3bf9;hpb=69bc5f2b82b4a4f027cd9d57c38c25dc4e0b72c0;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index 6d69cfd..a5e0e12 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -5,7 +5,6 @@ use warnings; use base qw/DBIx::Class/; -use DBIx::Class::Exception; use Scalar::Util 'blessed'; use List::Util 'first'; use Try::Tiny; @@ -260,7 +259,7 @@ sub new { next; } } - $new->throw_exception("No such column $key on $class") + $new->throw_exception("No such column '$key' on $class") unless $class->has_column($key); $new->store_column($key => $attrs->{$key}); } @@ -301,9 +300,12 @@ sub new { A column accessor method is created for each column, which is used for getting/setting the value for that column. -The actual method name is based on the L -name given in the table definition. Like L, this will -not store the data until L or L is called on the row. +The actual method name is based on the +L name given during the +L L. Like L, this +will not store the data in the database until L or L +is called on the row. =head2 insert @@ -1189,56 +1191,28 @@ sub inflate_result { foreach my $pre (keys %{$prefetch||{}}) { - my (@pre_vals, $is_multi); - if (ref $prefetch->{$pre}[0] eq 'ARRAY') { - $is_multi = 1; - @pre_vals = @{$prefetch->{$pre}}; - } - else { - @pre_vals = $prefetch->{$pre}; - } + my @pre_vals; + @pre_vals = (ref $prefetch->{$pre}[0] eq 'ARRAY') + ? @{$prefetch->{$pre}} : $prefetch->{$pre} + if @{$prefetch->{$pre}}; - my $pre_source = try { - $source->related_source($pre) - } - catch { - $class->throw_exception(sprintf - - "Can't inflate manual prefetch into non-existent relationship '%s' from '%s', " - . "check the inflation specification (columns/as) ending in '%s.%s'.", - - $pre, - $source->source_name, - $pre, - (keys %{$pre_vals[0][0]})[0] || 'something.something...', - ); - }; + 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 $pre"); - - if (! $is_multi and $accessor eq 'multi') { - $class->throw_exception("Manual prefetch (via select/columns) not supported with accessor 'multi'"); - } + 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, see + # t/resultset/inflate_result_api.t + next unless defined 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') {