From: Peter Rabbitson Date: Fri, 7 Aug 2009 09:19:13 +0000 (+0000) Subject: Move discard_changes code to Row.pm, better docs X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=bbd107cf7ae1e53547ce63b710716d88adb73013;p=dbsrgits%2FDBIx-Class-Historic.git Move discard_changes code to Row.pm, better docs --- diff --git a/lib/DBIx/Class/PK.pm b/lib/DBIx/Class/PK.pm index cb59ec9..cf8a194 100644 --- a/lib/DBIx/Class/PK.pm +++ b/lib/DBIx/Class/PK.pm @@ -20,46 +20,6 @@ depending on them. =cut -sub _ident_values { - my ($self) = @_; - return (map { $self->{_column_data}{$_} } $self->primary_columns); -} - -=head2 discard_changes ($attrs) - -Re-selects the row from the database, losing any changes that had -been made. - -This method can also be used to refresh from storage, retrieving any -changes made since the row was last read from storage. - -$attrs is expected to be a hashref of attributes suitable for passing as the -second argument to $resultset->search($cond, $attrs); - -=cut - -sub discard_changes { - my ($self, $attrs) = @_; - delete $self->{_dirty_columns}; - return unless $self->in_storage; # Don't reload if we aren't real! - - $attrs = { force_pool => 'master', %{ defined $attrs ? $attrs:{} } }; - if( my $current_storage = $self->get_from_storage($attrs)) { - - # Set $self to the current. - %$self = %$current_storage; - - # Avoid a possible infinite loop with - # sub DESTROY { $_[0]->discard_changes } - bless $current_storage, 'Do::Not::Exist'; - - return $self; - } else { - $self->in_storage(0); - return $self; - } -} - =head2 id Returns the primary key(s) for a row. Can't be called as @@ -75,12 +35,28 @@ sub id { return (wantarray ? @pk : $pk[0]); } +sub _ident_values { + my ($self) = @_; + return (map { $self->{_column_data}{$_} } $self->primary_columns); +} + =head2 ID Returns a unique id string identifying a row object by primary key. Used by L and L. +=over + +=item WARNING + +The default C<_create_ID> method used by this function orders the returned +values by the alphabetical order of the primary column names, B +the L method, which follows the same order in which columns were fed +to L. + +=back + =cut sub ID { diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index 805c50b..158c215 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -1277,12 +1277,51 @@ sub get_from_storage { my $resultset = $self->result_source->resultset; if(defined $attrs) { - $resultset = $resultset->search(undef, $attrs); + $resultset = $resultset->search(undef, $attrs); } return $resultset->find($self->{_orig_ident} || $self->ident_condition); } +=head2 discard_changes ($attrs) + +Re-selects the row from the database, losing any changes that had +been made. + +This method can also be used to refresh from storage, retrieving any +changes made since the row was last read from storage. + +$attrs is expected to be a hashref of attributes suitable for passing as the +second argument to $resultset->search($cond, $attrs); + +=cut + +sub discard_changes { + my ($self, $attrs) = @_; + delete $self->{_dirty_columns}; + return unless $self->in_storage; # Don't reload if we aren't real! + + # add a replication default to read from the master only + $attrs = { force_pool => 'master', %{$attrs||{}} }; + + if( my $current_storage = $self->get_from_storage($attrs)) { + + # Set $self to the current. + %$self = %$current_storage; + + # Avoid a possible infinite loop with + # sub DESTROY { $_[0]->discard_changes } + bless $current_storage, 'Do::Not::Exist'; + + return $self; + } + else { + $self->in_storage(0); + return $self; + } +} + + =head2 throw_exception See L.