X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=a4a18b97f64bee8f1babae7c20e44bb8b3d60b2e;hb=096ab902a;hp=d356218f545b9358674f9de4d37622ffa1983a36;hpb=4006691d207a6c257012c4b9a07d674b211349b0;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index d356218..a4a18b9 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 SQL::Abstract 'is_literal_value'; +use SQL::Abstract qw( is_literal_value is_plain_value ); ### ### Internal method @@ -52,7 +52,7 @@ All "Row objects" derived from a Schema-attached L object (such as a typical C<< L-> L >> call) are actually Result instances, based on your application's -L. +L. L implements most of the row-based communication with the underlying storage, but a Result class B. @@ -480,8 +480,8 @@ sub insert { Indicates whether the object exists as a row in the database or not. This is set to true when L, -L or L -are used. +L or L +are invoked. Creating a result object using L, or calling L on one, sets it to false. @@ -890,7 +890,10 @@ sub get_inflated_columns { } sub _is_column_numeric { - my ($self, $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) @@ -942,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) { @@ -1143,14 +1147,14 @@ 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 = $rsrc->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 }; @@ -1176,10 +1180,8 @@ sub copy { 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}++; } } @@ -1213,7 +1215,13 @@ sub store_column { 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; + + # stringify all refs explicitly, guards against overloaded objects + # with defined stringification AND fallback => 0 (ugh!) + $self->{_column_data}{$column} = ( length ref $value and is_plain_value( $value ) ) + ? "$value" + : $value + ; } =head2 inflate_result @@ -1323,7 +1331,7 @@ sub inflate_result { =back -Ls the object if it's already in the database, according to +Ls the object if it's already in the database, according to L, else Ls it. =head2 insert_or_update @@ -1410,11 +1418,10 @@ sub result_source { # note this is a || not a ||=, the difference is important : $_[0]->{_result_source} || do { - my $class = ref $_[0]; $_[0]->can('result_source_instance') ? $_[0]->result_source_instance : $_[0]->throw_exception( - "No result source instance registered for $class, did you forget to call $class->table(...) ?" + "No result source instance registered for @{[ ref $_[0] ]}, did you forget to call @{[ ref $_[0] ]}->table(...) ?" ) } ; @@ -1563,8 +1570,8 @@ See L. sub throw_exception { my $self=shift; - if (ref $self && ref $self->result_source ) { - $self->result_source->throw_exception(@_) + if (ref $self && ref (my $rsrc = try { $self->result_source_instance } ) ) { + $rsrc->throw_exception(@_) } else { DBIx::Class::Exception->throw(@_); @@ -1586,13 +1593,16 @@ sub throw_exception { Returns the primary key(s) for a row. Can't be called as a class method. Actually implemented in L -=head1 AUTHOR AND CONTRIBUTORS +=head1 FURTHER QUESTIONS? -See L and L in DBIx::Class +Check the list of L. -=head1 LICENSE +=head1 COPYRIGHT AND LICENSE -You may distribute this code under the same terms as Perl itself. +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. =cut