Merge 'DBIx-Class-current' into 'source-handle'
Matt S Trout [Thu, 23 Nov 2006 21:21:39 +0000 (21:21 +0000)]
r34019@cain (orig r2917):  matthewt | 2006-11-22 05:22:32 +0000
moved tests to compose_namespace instead of compose_connection, marked compose_connection as deprecated, undocumented DB.pm
r34020@cain (orig r2918):  matthewt | 2006-11-22 05:30:06 +0000
class reg test
r34029@cain (orig r2921):  claco | 2006-11-22 17:38:43 +0000
Updated version requirement for Class::Accessor::Grouped to 0.03
r34035@cain (orig r2925):  ningu | 2006-11-22 22:10:30 +0000
 r18925@haferschleim (orig r2919):  ningu | 2006-11-21 22:44:26 -0800
 - slight optimization to ident_condition in PK.pm
 - get ident_cond in update() before applying arguments, so a column's pk can be updated
 r18926@haferschleim (orig r2920):  ningu | 2006-11-21 22:54:10 -0800
 revert update() change
 r18953@haferschleim (orig r2922):  ningu | 2006-11-22 12:12:43 -0800
 re-commit minimal pk-mutation in update(), with test
 r18956@haferschleim (orig r2924):  ningu | 2006-11-22 14:09:07 -0800
 add shallow copy of $attrs in ResultSet->new

r34039@cain (orig r2929):  ningu | 2006-11-23 00:02:14 +0000
trivial test cleanup
r34041@cain (orig r2931):  matthewt | 2006-11-23 20:05:52 +0000
 r28722@cain (orig r2813):  castaway | 2006-10-06 19:45:42 +0000
 Versioning! With tests! Woo!

r34042@cain (orig r2932):  matthewt | 2006-11-23 20:05:58 +0000
 r28723@cain (orig r2814):  castaway | 2006-10-06 19:52:38 +0000
 s/Path::Class/File::Spec/

r34043@cain (orig r2933):  matthewt | 2006-11-23 20:06:02 +0000

r34044@cain (orig r2934):  matthewt | 2006-11-23 20:06:06 +0000

r34045@cain (orig r2935):  matthewt | 2006-11-23 20:06:09 +0000
 r34031@cain (orig r2923):  castaway | 2006-11-22 20:44:36 +0000
 Fix tests, remove some random rints

r34046@cain (orig r2936):  matthewt | 2006-11-23 20:06:14 +0000

1  2 
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/Row.pm

@@@ -10,10 -10,9 +10,10 @@@ use Carp::Clan qw/^DBIx::Class/
  use Data::Page;
  use Storable;
  use DBIx::Class::ResultSetColumn;
 +use DBIx::Class::ResultSourceHandle;
  use base qw/DBIx::Class/;
  
 -__PACKAGE__->mk_group_accessors('simple' => qw/result_source result_class/);
 +__PACKAGE__->mk_group_accessors('simple' => qw/result_class _source_handle/);
  
  =head1 NAME
  
@@@ -85,8 -84,8 +85,9 @@@ sub new 
    return $class->new_result(@_) if ref $class;
  
    my ($source, $attrs) = @_;
 -  #weaken $source;
 +  $source = $source->handle 
 +    unless $source->isa('DBIx::Class::ResultSourceHandle');
+   $attrs = { %{$attrs||{}} };
  
    if ($attrs->{page}) {
      $attrs->{rows} ||= 10;
@@@ -97,8 -96,8 +98,8 @@@
    $attrs->{alias} ||= 'me';
  
    my $self = {
 -    result_source => $source,
 -    result_class => $attrs->{result_class} || $source->result_class,
 +    _source_handle => $source,
 +    result_class => $attrs->{result_class} || $source->resolve->result_class,
      cond => $attrs->{where},
      count => undef,
      pager => undef,
@@@ -239,7 -238,7 +240,7 @@@ sub search_rs 
          : $having);
    }
  
 -  my $rs = (ref $self)->new($self->result_source, $new_attrs);
 +  my $rs = (ref $self)->new($self->_source_handle, $new_attrs);
    if ($rows) {
      $rs->set_cache($rows);
    }
@@@ -741,7 -740,7 +742,7 @@@ sub next 
  sub _construct_object {
    my ($self, @row) = @_;
    my $info = $self->_collapse_result($self->{_attrs}{as}, \@row);
 -  my @new = $self->result_class->inflate_result($self->result_source, @$info);
 +  my @new = $self->result_class->inflate_result($self->_source_handle, @$info);
    @new = $self->{_attrs}{record_filter}->(@new)
      if exists $self->{_attrs}{record_filter};
    return @new;
@@@ -917,7 -916,7 +918,7 @@@ sub _count { # Separated out so pager c
    # offset, order by and page are not needed to count. record_filter is cdbi
    delete $attrs->{$_} for qw/rows offset order_by page pager record_filter/;
  
 -  my $tmp_rs = (ref $self)->new($self->result_source, $attrs);
 +  my $tmp_rs = (ref $self)->new($self->_source_handle, $attrs);
    my ($count) = $tmp_rs->cursor->next;
    return $count;
  }
@@@ -1228,7 -1227,7 +1229,7 @@@ attribute set on the resultset (10 by d
  
  sub page {
    my ($self, $page) = @_;
 -  return (ref $self)->new($self->result_source, { %{$self->{attrs}}, page => $page });
 +  return (ref $self)->new($self->_source_handle, { %{$self->{attrs}}, page => $page });
  }
  
  =head2 new_result
@@@ -1258,9 -1257,11 +1259,9 @@@ sub new_result 
    my %new = (
      %{ $self->_remove_alias($values, $alias) },
      %{ $self->_remove_alias($collapsed_cond, $alias) },
 -    -result_source => $self->result_source,
    );
  
 -  my $obj = $self->result_class->new(\%new);
 -  return $obj;
 +  return $self->result_class->new(\%new,$self->_source_handle);
  }
  
  # _collapse_cond
@@@ -1554,7 -1555,7 +1555,7 @@@ sub related_resultset 
      my $rel_obj = $self->result_source->relationship_info($rel);
  
      $self->throw_exception(
 -      "search_related: result source '" . $self->result_source->name .
 +      "search_related: result source '" . $self->_source_handle->source_moniker .
          "' has no such relationship $rel")
        unless $rel_obj;
      
      my $join_count = $seen->{$rel};
      my $alias = ($join_count > 1 ? join('_', $rel, $join_count) : $rel);
  
 -    $self->result_source->schema->resultset($rel_obj->{class})->search_rs(
 +    $self->_source_handle->schema->resultset($rel_obj->{class})->search_rs(
        undef, {
          %{$self->{attrs}||{}},
          join => undef,
@@@ -1604,7 -1605,7 +1605,7 @@@ sub _resolved_attrs 
    return $self->{_attrs} if $self->{_attrs};
  
    my $attrs = { %{$self->{attrs}||{}} };
 -  my $source = $self->{result_source};
 +  my $source = $self->result_source;
    my $alias = $attrs->{alias};
  
    $attrs->{columns} ||= delete $attrs->{cols} if exists $attrs->{cols};
@@@ -1736,16 -1737,6 +1737,16 @@@ sub _merge_attr 
    }
  }
  
 +sub result_source {
 +    my $self = shift;
 +
 +    if (@_) {
 +        $self->_source_handle($_[0]->handle);
 +    } else {
 +        $self->_source_handle->resolve;
 +    }
 +}
 +
  =head2 throw_exception
  
  See L<DBIx::Class::Schema/throw_exception> for details.
  
  sub throw_exception {
    my $self=shift;
 -  $self->result_source->schema->throw_exception(@_);
 +  $self->_source_handle->schema->throw_exception(@_);
  }
  
  # XXX: FIXME: Attributes docs need clearing up
diff --combined lib/DBIx/Class/Row.pm
@@@ -6,7 -6,7 +6,7 @@@ use warnings
  use base qw/DBIx::Class/;
  use Carp::Clan qw/^DBIx::Class/;
  
 -__PACKAGE__->mk_group_accessors('simple' => 'result_source');
 +__PACKAGE__->mk_group_accessors('simple' => qw/_source_handle/);
  
  =head1 NAME
  
@@@ -30,7 -30,7 +30,7 @@@ Creates a new row object from column =
  =cut
  
  sub new {
 -  my ($class, $attrs) = @_;
 +  my ($class, $attrs, $source) = @_;
    $class = ref $class if ref $class;
  
    my $new = { _column_data => {} };
@@@ -39,7 -39,9 +39,7 @@@
    if ($attrs) {
      $new->throw_exception("attrs must be a hashref")
        unless ref($attrs) eq 'HASH';
 -    if (my $source = delete $attrs->{-result_source}) {
 -      $new->result_source($source);
 -    }
 +
      foreach my $k (keys %$attrs) {
        $new->throw_exception("No such column $k on $class")
          unless $class->has_column($k);
@@@ -47,8 -49,6 +47,8 @@@
      }
    }
  
 +  $new->_source_handle($source) if $source;
 +
    return $new;
  }
  
@@@ -67,9 -67,9 +67,9 @@@ L<DBIx::Class::ResultSet/create>)
  sub insert {
    my ($self) = @_;
    return $self if $self->in_storage;
 -  $self->{result_source} ||= $self->result_source_instance
 +  my $source = $self->result_source;
 +  $source ||=  $self->result_source($self->result_source_instance)
      if $self->can('result_source_instance');
 -  my $source = $self->{result_source};
    $self->throw_exception("No result_source set on this object; can't insert")
      unless $source;
    #use Data::Dumper; warn Dumper($self);
@@@ -108,12 -108,12 +108,12 @@@ required
  sub update {
    my ($self, $upd) = @_;
    $self->throw_exception( "Not in database" ) unless $self->in_storage;
    my $ident_cond = $self->ident_condition;
    $self->throw_exception("Cannot safely update a row in a PK-less table")
      if ! keys %$ident_cond;
+   $self->set_columns($upd) if $upd;
+   my %to_update = $self->get_dirty_columns;
+   return $self unless keys %to_update;
    my $rows = $self->result_source->storage->update(
                 $self->result_source->from, \%to_update, $ident_cond);
    if ($rows == 0) {
@@@ -325,17 -325,9 +325,17 @@@ Called by ResultSet to inflate a resul
  
  sub inflate_result {
    my ($class, $source, $me, $prefetch) = @_;
 -  #use Data::Dumper; print Dumper(@_);
 +
 +  my ($source_handle) = $source;
 +
 +  if ($source->isa('DBIx::Class::ResultSourceHandle')) {
 +      $source = $source_handle->resolve
 +  } else {
 +      $source_handle = $source->handle
 +  }
 +
    my $new = {
 -    result_source => $source,
 +    _source_handle => $source_handle,
      _column_data => $me,
      _in_storage => 1
    };
@@@ -435,18 -427,6 +435,18 @@@ sub is_column_changed 
  
  Accessor to the ResultSource this object was created from
  
 +=cut
 +
 +sub result_source {
 +    my $self = shift;
 +
 +    if (@_) {
 +        $self->_source_handle($_[0]->handle);
 +    } else {
 +        $self->_source_handle->resolve;
 +    }
 +}
 +
  =head2 register_column
  
    $column_info = { .... };