X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=7195bba57e4e224eb9084a8fe249e9e40b88e250;hb=2bc3c81ece67606c69cfb18eaeebb05db706d776;hp=332171a69f44deed951b0405ef3d0aef7990da48;hpb=ae66ef475f0d47dff21ad7682c813f643ee5dfa6;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index 332171a..7195bba 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -76,8 +76,10 @@ sub new { my $rel_obj = delete $attrs->{$key}; if(!Scalar::Util::blessed($rel_obj)) { $rel_obj = $new->find_or_new_related($key, $rel_obj); - $new->{_rel_in_storage} = 0 unless ($rel_obj->in_storage); } + + $new->{_rel_in_storage} = 0 unless ($rel_obj->in_storage); + $new->set_from_related($key, $rel_obj); $related->{$key} = $rel_obj; next; @@ -90,6 +92,8 @@ sub new { $rel_obj = $new->new_related($key, $rel_obj); $new->{_rel_in_storage} = 0; } + + $new->{_rel_in_storage} = 0 unless ($rel_obj->in_storage); } $related->{$key} = $others; next; @@ -164,24 +168,38 @@ sub insert { my @pri = $self->primary_columns; REL: foreach my $relname (keys %related_stuff) { - my $keyhash = $source->resolve_condition( - $source->relationship_info($relname)->{cond}, - undef, 1 - ); # the above argset gives me the dependent cols on self + + my $rel_obj = $related_stuff{$relname}; + + next REL unless (Scalar::Util::blessed($rel_obj) + && $rel_obj->isa('DBIx::Class::Row')); + + my $cond = $source->relationship_info($relname)->{cond}; + + next REL unless ref($cond) eq 'HASH'; + + # map { foreign.foo => 'self.bar' } to { bar => 'foo' } + + my $keyhash = { map { my $x = $_; $x =~ s/.*\.//; $x; } reverse %$cond }; # assume anything that references our PK probably is dependent on us - # rather than vice versa + # rather than vice versa, unless the far side is (a) defined or (b) + # auto-increment foreach my $p (@pri) { - next REL if exists $keyhash->{$p}; + if (exists $keyhash->{$p}) { + warn $keyhash->{$p}; + unless (defined($rel_obj->get_column($keyhash->{$p})) + || $rel_obj->column_info($keyhash->{$p}) + ->{is_auto_increment}) { + next REL; + } + } } - my $rel_obj = $related_stuff{$relname}; - if(Scalar::Util::blessed($rel_obj) && $rel_obj->isa('DBIx::Class::Row')) { - $rel_obj->insert(); - $self->set_from_related($relname, $rel_obj); - delete $related_stuff{$relname}; - } + $rel_obj->insert(); + $self->set_from_related($relname, $rel_obj); + delete $related_stuff{$relname}; } }