X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=630d2bc8458084b52101edbb6aa41a643c6e6063;hb=cc506f8b4fdf305b5f4483c7fdad19bc84ea68c8;hp=2aa5b2395148e499acb91e94c4d38eca5c64eb9f;hpb=a5f5e47019daf25c0b0f9708cbd3ab2695584c5a;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index 2aa5b23..630d2bc 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -9,7 +9,7 @@ use Scalar::Util 'blessed'; use List::Util 'first'; use Try::Tiny; use DBIx::Class::Carp; -use DBIx::Class::_Util 'is_literal_value'; +use SQL::Abstract 'is_literal_value'; ### ### Internal method @@ -257,14 +257,16 @@ sub new { } $inflated->{$key} = $rel_obj; next; - } elsif ($class->has_column($key) - && $class->column_info($key)->{_inflate_info}) { + } + elsif ( + $rsrc->has_column($key) + and + $rsrc->column_info($key)->{_inflate_info} + ) { $inflated->{$key} = $attrs->{$key}; next; } } - $new->throw_exception("No such column '$key' on $class") - unless $class->has_column($key); $new->store_column($key => $attrs->{$key}); } @@ -673,8 +675,8 @@ sub get_column { )); } - $self->throw_exception( "No such column '${column}'" ) - unless $self->has_column($column); + $self->throw_exception( "No such column '${column}' on " . ref $self ) + unless $self->result_source->has_column($column); return undef; } @@ -801,8 +803,8 @@ really changed. sub make_column_dirty { my ($self, $column) = @_; - $self->throw_exception( "No such column '${column}'" ) - unless exists $self->{_column_data}{$column} || $self->has_column($column); + $self->throw_exception( "No such column '${column}' on " . ref $self ) + unless exists $self->{_column_data}{$column} || $self->result_source->has_column($column); # the entire clean/dirty code relies on exists, not on true/false return 1 if exists $self->{_dirty_columns}{$column}; @@ -844,9 +846,9 @@ See L for how to setup inflation. sub get_inflated_columns { my $self = shift; - my $loaded_colinfo = $self->columns_info ([ - grep { $self->has_column_loaded($_) } $self->columns - ]); + my $loaded_colinfo = $self->result_source->columns_info; + $self->has_column_loaded($_) or delete $loaded_colinfo->{$_} + for keys %$loaded_colinfo; my %cols_to_return = ( %{$self->{_column_data}}, %$loaded_colinfo ); @@ -888,8 +890,11 @@ sub get_inflated_columns { } sub _is_column_numeric { - my ($self, $column) = @_; - my $colinfo = $self->column_info ($column); + my ($self, $column) = @_; + + return undef unless $self->result_source->has_column($column); + + my $colinfo = $self->result_source->column_info ($column); # cache for speed (the object may *not* have a resultsource instance) if ( @@ -940,9 +945,10 @@ sub set_column { my $dirty = $self->{_dirty_columns}{$column} || - $self->in_storage # no point tracking dirtyness on uninserted data + ( $self->in_storage # no point tracking dirtyness on uninserted data ? ! $self->_eq_column_values ($column, $old_value, $new_value) : 1 + ) ; if ($dirty) { @@ -1020,7 +1026,7 @@ sub _eq_column_values { # value tracked between column changes and commitment to storage sub _track_storage_value { my ($self, $col) = @_; - return defined first { $col eq $_ } ($self->primary_columns); + return defined first { $col eq $_ } ($self->result_source->primary_columns); } =head2 set_columns @@ -1082,9 +1088,11 @@ See also L. sub set_inflated_columns { my ( $self, $upd ) = @_; + my $rsrc; foreach my $key (keys %$upd) { if (ref $upd->{$key}) { - my $info = $self->relationship_info($key); + $rsrc ||= $self->result_source; + my $info = $rsrc->relationship_info($key); my $acc_type = $info->{attrs}{accessor} || ''; if ($acc_type eq 'single') { @@ -1097,7 +1105,11 @@ sub set_inflated_columns { "Recursive update is not supported over relationships of type '$acc_type' ($key)" ); } - elsif ($self->has_column($key) && exists $self->column_info($key)->{_inflate_info}) { + elsif ( + $rsrc->has_column($key) + and + exists $rsrc->column_info($key)->{_inflate_info} + ) { $self->set_inflated_column($key, delete $upd->{$key}); } } @@ -1135,18 +1147,20 @@ is set by default on C relationships and unset on all others. sub copy { my ($self, $changes) = @_; $changes ||= {}; - my $col_data = { %{$self->{_column_data}} }; + my $col_data = { $self->get_columns }; + + my $rsrc = $self->result_source; - my $colinfo = $self->columns_info([ keys %$col_data ]); + my $colinfo = $rsrc->columns_info; foreach my $col (keys %$col_data) { delete $col_data->{$col} - if $colinfo->{$col}{is_auto_increment}; + if ( ! $colinfo->{$col} or $colinfo->{$col}{is_auto_increment} ); } my $new = { _column_data => $col_data }; bless $new, ref $self; - $new->result_source($self->result_source); + $new->result_source($rsrc); $new->set_inflated_columns($changes); $new->insert; @@ -1155,21 +1169,19 @@ sub copy { # constraints my $rel_names_copied = {}; - foreach my $rel_name ($self->result_source->relationships) { - my $rel_info = $self->result_source->relationship_info($rel_name); + foreach my $rel_name ($rsrc->relationships) { + my $rel_info = $rsrc->relationship_info($rel_name); next unless $rel_info->{attrs}{cascade_copy}; - my $resolved = $self->result_source->_resolve_condition( + my $resolved = $rsrc->_resolve_condition( $rel_info->{cond}, $rel_name, $new, $rel_name ); my $copied = $rel_names_copied->{ $rel_info->{source} } ||= {}; foreach my $related ($self->search_related($rel_name)->all) { - my $id_str = join("\0", $related->id); - next if $copied->{$id_str}; - $copied->{$id_str} = 1; - my $rel_copy = $related->copy($resolved); + $related->copy($resolved) + unless $copied->{$related->ID}++; } } @@ -1199,8 +1211,8 @@ extend this method to catch all data setting methods. sub store_column { my ($self, $column, $value) = @_; - $self->throw_exception( "No such column '${column}'" ) - unless exists $self->{_column_data}{$column} || $self->has_column($column); + $self->throw_exception( "No such column '${column}' on " . ref $self ) + unless exists $self->{_column_data}{$column} || $self->result_source->has_column($column); $self->throw_exception( "set_column called for ${column} without value" ) if @_ < 3; return $self->{_column_data}{$column} = $value;