X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSet.pm;h=92665d6dfb7cac90ce431e4623d7f795ec1f4d1c;hb=a446d7f8fdc34bde8a31936f7900b77a0c210415;hp=292dbc3664fe94882483d3c47d2e3fc641ca22a3;hpb=8d005ad9929e4bf227919cb6374e2a9e9689324f;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 292dbc3..92665d6 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -6,7 +6,9 @@ use base qw/DBIx::Class/; use DBIx::Class::Carp; use DBIx::Class::ResultSetColumn; use Scalar::Util qw/blessed weaken reftype/; -use DBIx::Class::_Util 'fail_on_internal_wantarray'; +use DBIx::Class::_Util qw( + fail_on_internal_wantarray is_plain_value is_literal_value +); use Try::Tiny; use Data::Compare (); # no imports!!! guard against insane architecture @@ -771,11 +773,15 @@ sub find { next if $keyref eq 'ARRAY'; # has_many for multi_create - my $rel_q = $rsrc->_resolve_condition( + my ($rel_cond, $crosstable) = $rsrc->_resolve_condition( $relinfo->{cond}, $val, $key, $key ); - die "Can't handle complex relationship conditions in find" if ref($rel_q) ne 'HASH'; - @related{keys %$rel_q} = values %$rel_q; + + $self->throw_exception("Complex condition via relationship '$key' is unsupported in find()") + if $crosstable or ref($rel_cond) ne 'HASH'; + + # supplement + @related{keys %$rel_cond} = values %$rel_cond; } } @@ -1942,7 +1948,6 @@ sub _rs_update_delete { $guard = $storage->txn_scope_guard; - $cond = []; for my $row ($subrs->cursor->all) { push @$cond, { map { $idcols->[$_] => $row->[$_] } @@ -1952,11 +1957,11 @@ sub _rs_update_delete { } } - my $res = $storage->$op ( + my $res = $cond ? $storage->$op ( $rsrc, $op eq 'update' ? $values : (), $cond, - ); + ) : '0E0'; $guard->commit if $guard; @@ -2209,7 +2214,7 @@ sub populate { foreach my $rel (@rels) { next unless ref $data->[$index]->{$rel} eq "HASH"; my $result = $self->related_resultset($rel)->create($data->[$index]->{$rel}); - my ($reverse_relname, $reverse_relinfo) = %{$rsrc->reverse_relationship_info($rel)}; + my (undef, $reverse_relinfo) = %{$rsrc->reverse_relationship_info($rel)}; my $related = $result->result_source->_resolve_condition( $reverse_relinfo->{cond}, $self, @@ -2446,19 +2451,11 @@ sub _merge_with_rscond { for my $c (keys %$implied) { my $v = $implied->{$c}; - if ( - ! ref $v - or - overload::Method($v, '""') - ) { + if ( ! length ref $v or is_plain_value($v) ) { $new_data{$c} = $v; } elsif ( - ref $v eq 'HASH' and keys %$v == 1 and exists $v->{'='} and ( - ref $v->{'='} eq 'SCALAR' - or - ( ref $v->{'='} eq 'REF' and ref ${$v->{'='}} eq 'ARRAY' ) - ) + ref $v eq 'HASH' and keys %$v == 1 and exists $v->{'='} and is_literal_value($v->{'='}) ) { $new_data{$c} = $v->{'='}; }