X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FResultSource.pm;h=26b01cd243830523d7485e4cdab5d9bc9215654b;hb=a83cdbf22f334fddea92a3c52e068b755e30265a;hp=39829657038e4f46f99b4e521be569da96e6bb92;hpb=8a3fa4ae894b55795bcea24a643b42d779cc9d13;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/ResultSource.pm b/lib/DBIx/Class/ResultSource.pm index 3982965..26b01cd 100644 --- a/lib/DBIx/Class/ResultSource.pm +++ b/lib/DBIx/Class/ResultSource.pm @@ -5,6 +5,8 @@ use warnings; use DBIx::Class::ResultSet; use DBIx::Class::ResultSourceHandle; + +use DBIx::Class::Exception; use Carp::Clan qw/^DBIx::Class/; use base qw/DBIx::Class/; @@ -26,9 +28,8 @@ DBIx::Class::ResultSource - Result source object # Create a table based result source, in a result class. package MyDB::Schema::Result::Artist; - use base qw/DBIx::Class/; + use base qw/DBIx::Class::Core/; - __PACKAGE__->load_components(qw/Core/); __PACKAGE__->table('artist'); __PACKAGE__->add_columns(qw/ artistid name /); __PACKAGE__->set_primary_key('artistid'); @@ -38,8 +39,9 @@ DBIx::Class::ResultSource - Result source object # Create a query (view) based result source, in a result class package MyDB::Schema::Result::Year2000CDs; + use base qw/DBIx::Class::Core/; - __PACKAGE__->load_components('Core'); + __PACKAGE__->load_components('InflateColumn::DateTime'); __PACKAGE__->table_class('DBIx::Class::ResultSource::View'); __PACKAGE__->table('year2000cds'); @@ -58,10 +60,10 @@ sources, for example L. Table is the default result source type, so one is created for you when defining a result class as described in the synopsis above. -More specifically, the L component pulls in the -L as a base class, which -defines the L -method. When called, C creates and stores an instance of +More specifically, the L base class pulls in the +L component, which defines +the L method. +When called, C
creates and stores an instance of L. Luckily, to use tables as result sources, you don't need to remember any of this. @@ -387,7 +389,7 @@ sub columns { my $self = shift; $self->throw_exception( "columns() is a read-only accessor, did you mean add_columns()?" - ) if (@_ > 1); + ) if @_; return @{$self->{_ordered_columns}||[]}; } @@ -501,6 +503,16 @@ sub primary_columns { return @{shift->_primaries||[]}; } +sub _pri_cols { + my $self = shift; + my @pcols = $self->primary_columns + or $self->throw_exception (sprintf( + 'Operation requires a primary key to be declared on %s via set_primary_key', + ref $self, + )); + return @pcols; +} + =head2 add_unique_constraint =over 4 @@ -1203,7 +1215,7 @@ sub _resolve_join { $self->throw_exception ('You must supply a joinpath arrayref as the 4th argument to _resolve_join') unless ref $jpath eq 'ARRAY'; - $jpath = [@$jpath]; + $jpath = [@$jpath]; # copy if (not defined $join) { return (); @@ -1226,12 +1238,14 @@ sub _resolve_join { $force_left ||= lc($rel_info->{attrs}{join_type}||'') eq 'left'; # the actual seen value will be incremented by the recursion - my $as = ($seen->{$rel} ? join ('_', $rel, $seen->{$rel} + 1) : $rel); + my $as = $self->storage->relname_to_table_alias( + $rel, ($seen->{$rel} && $seen->{$rel} + 1) + ); push @ret, ( $self->_resolve_join($rel, $alias, $seen, [@$jpath], $force_left), $self->related_source($rel)->_resolve_join( - $join->{$rel}, $as, $seen, [@$jpath, $rel], $force_left + $join->{$rel}, $as, $seen, [@$jpath, { $rel => $as }], $force_left ) ); } @@ -1243,7 +1257,9 @@ sub _resolve_join { } else { my $count = ++$seen->{$join}; - my $as = ($count > 1 ? "${join}_${count}" : $join); + my $as = $self->storage->relname_to_table_alias( + $join, ($count > 1 && $count) + ); my $rel_info = $self->relationship_info($join) or $self->throw_exception("No such relationship ${join}"); @@ -1255,7 +1271,8 @@ sub _resolve_join { ? 'left' : $rel_info->{attrs}{join_type} , - -join_path => [@$jpath, $join], + -join_path => [@$jpath, { $join => $as } ], + -is_single => (List::Util::first { $rel_info->{attrs}{accessor} eq $_ } (qw/single filter/) ), -alias => $as, -relation_chain_depth => $seen->{-relation_chain_depth} || 0, }, @@ -1332,13 +1349,13 @@ sub _resolve_condition { unless ($for->has_column_loaded($v)) { if ($for->in_storage) { $self->throw_exception(sprintf - 'Unable to resolve relationship from %s to %s: column %s.%s not ' - . 'loaded from storage (or not passed to new() prior to insert()). ' - . 'Maybe you forgot to call ->discard_changes to get defaults from the db.', - - $for->result_source->source_name, + "Unable to resolve relationship '%s' from object %s: column '%s' not " + . 'loaded from storage (or not passed to new() prior to insert()). You ' + . 'probably need to call ->discard_changes to get the server-side defaults ' + . 'from the database.', $as, - $as, $v, + $for, + $v, ); } return $UNRESOLVABLE_CONDITION; @@ -1441,8 +1458,7 @@ sub resolve_prefetch { # Accepts one or more relationships for the current source and returns an # array of column names for each of those relationships. Column names are # prefixed relative to the current source, in accordance with where they appear -# in the supplied relationships. Needs an alias_map generated by -# $rs->_joinpath_aliases +# in the supplied relationships. sub _resolve_prefetch { my ($self, $pre, $alias, $alias_map, $order, $collapse, $pref_path) = @_; @@ -1577,7 +1593,7 @@ L. =cut sub handle { - return new DBIx::Class::ResultSourceHandle({ + return DBIx::Class::ResultSourceHandle->new({ schema => $_[0]->schema, source_moniker => $_[0]->source_name }); @@ -1591,10 +1607,12 @@ See L. sub throw_exception { my $self = shift; + if (defined $self->schema) { $self->schema->throw_exception(@_); - } else { - croak(@_); + } + else { + DBIx::Class::Exception->throw(@_); } }