X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=72bb2fcdc8edf9cfa8d504bb41e540ee2acfe413;hb=497d874ac78f5b6bba1309001f62c299a9419499;hp=da7ab3602bfc7625f2a79942460ab463d2b31df9;hpb=f928c965ae3ed586452a6f1ab2f1aff97721d8e8;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index da7ab36..72bb2fc 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -112,7 +112,7 @@ sub __new_related_find_or_new_helper { ->resultset ->new_result($data); } - if ($self->result_source->pk_depends_on($relname, $data)) { + if ($self->result_source->_pk_depends_on($relname, $data)) { MULTICREATE_DEBUG and warn "MC $self constructing $relname via find_or_new"; return $self->result_source ->related_source($relname) @@ -132,7 +132,7 @@ sub __their_pk_needs_us { # this should maybe be in resultsource. foreach my $key (keys %$reverse) { # if their primary key depends on us, then we have to # just create a result and we'll fill it out afterwards - return 1 if $rel_source->pk_depends_on($key, $us); + return 1 if $rel_source->_pk_depends_on($key, $us); } return 0; } @@ -304,7 +304,7 @@ sub insert { next REL unless (Scalar::Util::blessed($rel_obj) && $rel_obj->isa('DBIx::Class::Row')); - next REL unless $source->pk_depends_on( + next REL unless $source->_pk_depends_on( $relname, { $rel_obj->get_columns } ); @@ -647,6 +647,8 @@ sub has_column_loaded { Returns all loaded column data as a hash, containing raw values. To get just one value for a particular column, use L. +See L to get the inflated values. + =cut sub get_columns { @@ -708,7 +710,21 @@ sub make_column_dirty { $self->throw_exception( "No such column '${column}'" ) unless exists $self->{_column_data}{$column} || $self->has_column($column); + + # the entire clean/dirty code relieas on exists, not on true/false + return 1 if exists $self->{_dirty_columns}{$column}; + $self->{_dirty_columns}{$column} = 1; + + # if we are just now making the column dirty, and if there is an inflated + # value, force it over the deflated one + if (exists $self->{_inflated_column}{$column}) { + $self->store_column($column, + $self->_deflated_column( + $column, $self->{_inflated_column}{$column} + ) + ); + } } =head2 get_inflated_columns @@ -769,8 +785,39 @@ sub set_column { my $old_value = $self->get_column($column); $self->store_column($column, $new_value); - $self->{_dirty_columns}{$column} = 1 - if (defined $old_value xor defined $new_value) || (defined $old_value && $old_value ne $new_value); + + my $dirty; + if (defined $old_value xor defined $new_value) { + $dirty = 1; + } + elsif (not defined $old_value) { # both undef + $dirty = 0; + } + elsif ($old_value eq $new_value) { + $dirty = 0; + } + else { # do a numeric comparison if datatype allows it + my $colinfo = $self->column_info ($column); + + # cache for speed + if (not defined $colinfo->{is_numeric}) { + $colinfo->{is_numeric} = + $self->result_source->schema->storage->is_datatype_numeric ($colinfo->{data_type}) + ? 1 + : 0 + ; + } + + if ($colinfo->{is_numeric}) { + $dirty = $old_value != $new_value; + } + else { + $dirty = 1; + } + } + + # sadly the update code just checks for keys, not for their value + $self->{_dirty_columns}{$column} = 1 if $dirty; # XXX clear out the relation cache for this column delete $self->{related_resultsets}{$column}; @@ -878,7 +925,11 @@ sub set_inflated_columns { Inserts a new row into the database, as a copy of the original object. If a hashref of replacement data is supplied, these will take -precedence over data in the original. +precedence over data in the original. Also any columns which have +the L +C<< is_auto_increment => 1 >> are explicitly removed before the copy, +so that the database can insert its own autoincremented values into +the new object. Relationships will be followed by the copy procedure B if the relationship specifes a true value for its @@ -913,7 +964,7 @@ sub copy { next unless $rel_info->{attrs}{cascade_copy}; - my $resolved = $self->result_source->resolve_condition( + my $resolved = $self->result_source->_resolve_condition( $rel_info->{cond}, $rel, $new );