Fix missing $@ in try::tiny conversion
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSource.pm
1 package DBIx::Class::ResultSource;
2
3 use strict;
4 use warnings;
5
6 use DBIx::Class::ResultSet;
7 use DBIx::Class::ResultSourceHandle;
8
9 use DBIx::Class::Exception;
10 use Carp::Clan qw/^DBIx::Class/;
11 use Try::Tiny;
12
13 use base qw/DBIx::Class/;
14
15 __PACKAGE__->mk_group_accessors('simple' => qw/_ordered_columns
16   _columns _primaries _unique_constraints name resultset_attributes
17   schema from _relationships column_info_from_storage source_info
18   source_name sqlt_deploy_callback/);
19
20 __PACKAGE__->mk_group_accessors('component_class' => qw/resultset_class
21   result_class/);
22
23 =head1 NAME
24
25 DBIx::Class::ResultSource - Result source object
26
27 =head1 SYNOPSIS
28
29   # Create a table based result source, in a result class.
30
31   package MyDB::Schema::Result::Artist;
32   use base qw/DBIx::Class::Core/;
33
34   __PACKAGE__->table('artist');
35   __PACKAGE__->add_columns(qw/ artistid name /);
36   __PACKAGE__->set_primary_key('artistid');
37   __PACKAGE__->has_many(cds => 'MyDB::Schema::Result::CD');
38
39   1;
40
41   # Create a query (view) based result source, in a result class
42   package MyDB::Schema::Result::Year2000CDs;
43   use base qw/DBIx::Class::Core/;
44
45   __PACKAGE__->load_components('InflateColumn::DateTime');
46   __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
47
48   __PACKAGE__->table('year2000cds');
49   __PACKAGE__->result_source_instance->is_virtual(1);
50   __PACKAGE__->result_source_instance->view_definition(
51       "SELECT cdid, artist, title FROM cd WHERE year ='2000'"
52       );
53
54
55 =head1 DESCRIPTION
56
57 A ResultSource is an object that represents a source of data for querying.
58
59 This class is a base class for various specialised types of result
60 sources, for example L<DBIx::Class::ResultSource::Table>. Table is the
61 default result source type, so one is created for you when defining a
62 result class as described in the synopsis above.
63
64 More specifically, the L<DBIx::Class::Core> base class pulls in the
65 L<DBIx::Class::ResultSourceProxy::Table> component, which defines
66 the L<table|DBIx::Class::ResultSourceProxy::Table/table> method.
67 When called, C<table> creates and stores an instance of
68 L<DBIx::Class::ResultSoure::Table>. Luckily, to use tables as result
69 sources, you don't need to remember any of this.
70
71 Result sources representing select queries, or views, can also be
72 created, see L<DBIx::Class::ResultSource::View> for full details.
73
74 =head2 Finding result source objects
75
76 As mentioned above, a result source instance is created and stored for
77 you when you define a L<Result Class|DBIx::Class::Manual::Glossary/Result Class>.
78
79 You can retrieve the result source at runtime in the following ways:
80
81 =over
82
83 =item From a Schema object:
84
85    $schema->source($source_name);
86
87 =item From a Row object:
88
89    $row->result_source;
90
91 =item From a ResultSet object:
92
93    $rs->result_source;
94
95 =back
96
97 =head1 METHODS
98
99 =pod
100
101 =cut
102
103 sub new {
104   my ($class, $attrs) = @_;
105   $class = ref $class if ref $class;
106
107   my $new = bless { %{$attrs || {}} }, $class;
108   $new->{resultset_class} ||= 'DBIx::Class::ResultSet';
109   $new->{resultset_attributes} = { %{$new->{resultset_attributes} || {}} };
110   $new->{_ordered_columns} = [ @{$new->{_ordered_columns}||[]}];
111   $new->{_columns} = { %{$new->{_columns}||{}} };
112   $new->{_relationships} = { %{$new->{_relationships}||{}} };
113   $new->{name} ||= "!!NAME NOT SET!!";
114   $new->{_columns_info_loaded} ||= 0;
115   $new->{sqlt_deploy_callback} ||= "default_sqlt_deploy_hook";
116   return $new;
117 }
118
119 =pod
120
121 =head2 add_columns
122
123 =over
124
125 =item Arguments: @columns
126
127 =item Return value: The ResultSource object
128
129 =back
130
131   $source->add_columns(qw/col1 col2 col3/);
132
133   $source->add_columns('col1' => \%col1_info, 'col2' => \%col2_info, ...);
134
135 Adds columns to the result source. If supplied colname => hashref
136 pairs, uses the hashref as the L</column_info> for that column. Repeated
137 calls of this method will add more columns, not replace them.
138
139 The column names given will be created as accessor methods on your
140 L<DBIx::Class::Row> objects. You can change the name of the accessor
141 by supplying an L</accessor> in the column_info hash.
142
143 If a column name beginning with a plus sign ('+col1') is provided, the
144 attributes provided will be merged with any existing attributes for the
145 column, with the new attributes taking precedence in the case that an
146 attribute already exists. Using this without a hashref 
147 (C<< $source->add_columns(qw/+col1 +col2/) >>) is legal, but useless --
148 it does the same thing it would do without the plus.
149
150 The contents of the column_info are not set in stone. The following
151 keys are currently recognised/used by DBIx::Class:
152
153 =over 4
154
155 =item accessor
156
157    { accessor => '_name' }
158
159    # example use, replace standard accessor with one of your own:
160    sub name {
161        my ($self, $value) = @_;
162
163        die "Name cannot contain digits!" if($value =~ /\d/);
164        $self->_name($value);
165
166        return $self->_name();
167    }
168
169 Use this to set the name of the accessor method for this column. If unset,
170 the name of the column will be used.
171
172 =item data_type
173
174    { data_type => 'integer' }
175
176 This contains the column type. It is automatically filled if you use the
177 L<SQL::Translator::Producer::DBIx::Class::File> producer, or the
178 L<DBIx::Class::Schema::Loader> module. 
179
180 Currently there is no standard set of values for the data_type. Use
181 whatever your database supports.
182
183 =item size
184
185    { size => 20 }
186
187 The length of your column, if it is a column type that can have a size
188 restriction. This is currently only used to create tables from your
189 schema, see L<DBIx::Class::Schema/deploy>.
190
191 =item is_nullable
192
193    { is_nullable => 1 }
194
195 Set this to a true value for a columns that is allowed to contain NULL
196 values, default is false. This is currently only used to create tables
197 from your schema, see L<DBIx::Class::Schema/deploy>.
198
199 =item is_auto_increment
200
201    { is_auto_increment => 1 }
202
203 Set this to a true value for a column whose value is somehow
204 automatically set, defaults to false. This is used to determine which
205 columns to empty when cloning objects using
206 L<DBIx::Class::Row/copy>. It is also used by
207 L<DBIx::Class::Schema/deploy>.
208
209 =item is_numeric
210
211    { is_numeric => 1 }
212
213 Set this to a true or false value (not C<undef>) to explicitly specify
214 if this column contains numeric data. This controls how set_column
215 decides whether to consider a column dirty after an update: if
216 C<is_numeric> is true a numeric comparison C<< != >> will take place
217 instead of the usual C<eq>
218
219 If not specified the storage class will attempt to figure this out on
220 first access to the column, based on the column C<data_type>. The
221 result will be cached in this attribute.
222
223 =item is_foreign_key
224
225    { is_foreign_key => 1 }
226
227 Set this to a true value for a column that contains a key from a
228 foreign table, defaults to false. This is currently only used to
229 create tables from your schema, see L<DBIx::Class::Schema/deploy>.
230
231 =item default_value
232
233    { default_value => \'now()' }
234
235 Set this to the default value which will be inserted into a column by
236 the database. Can contain either a value or a function (use a
237 reference to a scalar e.g. C<\'now()'> if you want a function). This
238 is currently only used to create tables from your schema, see
239 L<DBIx::Class::Schema/deploy>.
240
241 See the note on L<DBIx::Class::Row/new> for more information about possible
242 issues related to db-side default values.
243
244 =item sequence
245
246    { sequence => 'my_table_seq' }
247
248 Set this on a primary key column to the name of the sequence used to
249 generate a new key value. If not specified, L<DBIx::Class::PK::Auto>
250 will attempt to retrieve the name of the sequence from the database
251 automatically.
252
253 =item auto_nextval
254
255 Set this to a true value for a column whose value is retrieved automatically
256 from a sequence or function (if supported by your Storage driver.) For a
257 sequence, if you do not use a trigger to get the nextval, you have to set the
258 L</sequence> value as well.
259
260 Also set this for MSSQL columns with the 'uniqueidentifier'
261 L<data_type|DBIx::Class::ResultSource/data_type> whose values you want to
262 automatically generate using C<NEWID()>, unless they are a primary key in which
263 case this will be done anyway.
264
265 =item extra
266
267 This is used by L<DBIx::Class::Schema/deploy> and L<SQL::Translator>
268 to add extra non-generic data to the column. For example: C<< extra
269 => { unsigned => 1} >> is used by the MySQL producer to set an integer
270 column to unsigned. For more details, see
271 L<SQL::Translator::Producer::MySQL>.
272
273 =back
274
275 =head2 add_column
276
277 =over
278
279 =item Arguments: $colname, \%columninfo?
280
281 =item Return value: 1/0 (true/false)
282
283 =back
284
285   $source->add_column('col' => \%info);
286
287 Add a single column and optional column info. Uses the same column
288 info keys as L</add_columns>.
289
290 =cut
291
292 sub add_columns {
293   my ($self, @cols) = @_;
294   $self->_ordered_columns(\@cols) unless $self->_ordered_columns;
295
296   my @added;
297   my $columns = $self->_columns;
298   while (my $col = shift @cols) {
299     my $column_info = {};
300     if ($col =~ s/^\+//) {
301       $column_info = $self->column_info($col);
302     }
303
304     # If next entry is { ... } use that for the column info, if not
305     # use an empty hashref
306     if (ref $cols[0]) {
307       my $new_info = shift(@cols);
308       %$column_info = (%$column_info, %$new_info);
309     }
310     push(@added, $col) unless exists $columns->{$col};
311     $columns->{$col} = $column_info;
312   }
313   push @{ $self->_ordered_columns }, @added;
314   return $self;
315 }
316
317 sub add_column { shift->add_columns(@_); } # DO NOT CHANGE THIS TO GLOB
318
319 =head2 has_column
320
321 =over
322
323 =item Arguments: $colname
324
325 =item Return value: 1/0 (true/false)
326
327 =back
328
329   if ($source->has_column($colname)) { ... }
330
331 Returns true if the source has a column of this name, false otherwise.
332
333 =cut
334
335 sub has_column {
336   my ($self, $column) = @_;
337   return exists $self->_columns->{$column};
338 }
339
340 =head2 column_info
341
342 =over
343
344 =item Arguments: $colname
345
346 =item Return value: Hashref of info
347
348 =back
349
350   my $info = $source->column_info($col);
351
352 Returns the column metadata hashref for a column, as originally passed
353 to L</add_columns>. See L</add_columns> above for information on the
354 contents of the hashref.
355
356 =cut
357
358 sub column_info {
359   my ($self, $column) = @_;
360   $self->throw_exception("No such column $column")
361     unless exists $self->_columns->{$column};
362   #warn $self->{_columns_info_loaded}, "\n";
363   if ( ! $self->_columns->{$column}{data_type}
364        and $self->column_info_from_storage
365        and ! $self->{_columns_info_loaded}
366        and $self->schema and $self->storage )
367   {
368     $self->{_columns_info_loaded}++;
369     my $info = {};
370     my $lc_info = {};
371     # try for the case of storage without table
372     my $caught;
373     try { $info = $self->storage->columns_info_for( $self->from ) }
374     catch { $caught = 1 };
375     unless ($caught) {
376       for my $realcol ( keys %{$info} ) {
377         $lc_info->{lc $realcol} = $info->{$realcol};
378       }
379       foreach my $col ( keys %{$self->_columns} ) {
380         $self->_columns->{$col} = {
381           %{ $self->_columns->{$col} },
382           %{ $info->{$col} || $lc_info->{lc $col} || {} }
383         };
384       }
385     }
386   }
387   return $self->_columns->{$column};
388 }
389
390 =head2 columns
391
392 =over
393
394 =item Arguments: None
395
396 =item Return value: Ordered list of column names
397
398 =back
399
400   my @column_names = $source->columns;
401
402 Returns all column names in the order they were declared to L</add_columns>.
403
404 =cut
405
406 sub columns {
407   my $self = shift;
408   $self->throw_exception(
409     "columns() is a read-only accessor, did you mean add_columns()?"
410   ) if @_;
411   return @{$self->{_ordered_columns}||[]};
412 }
413
414 =head2 remove_columns
415
416 =over
417
418 =item Arguments: @colnames
419
420 =item Return value: undefined
421
422 =back
423
424   $source->remove_columns(qw/col1 col2 col3/);
425
426 Removes the given list of columns by name, from the result source.
427
428 B<Warning>: Removing a column that is also used in the sources primary
429 key, or in one of the sources unique constraints, B<will> result in a
430 broken result source.
431
432 =head2 remove_column
433
434 =over
435
436 =item Arguments: $colname
437
438 =item Return value: undefined
439
440 =back
441
442   $source->remove_column('col');
443
444 Remove a single column by name from the result source, similar to
445 L</remove_columns>.
446
447 B<Warning>: Removing a column that is also used in the sources primary
448 key, or in one of the sources unique constraints, B<will> result in a
449 broken result source.
450
451 =cut
452
453 sub remove_columns {
454   my ($self, @to_remove) = @_;
455
456   my $columns = $self->_columns
457     or return;
458
459   my %to_remove;
460   for (@to_remove) {
461     delete $columns->{$_};
462     ++$to_remove{$_};
463   }
464
465   $self->_ordered_columns([ grep { not $to_remove{$_} } @{$self->_ordered_columns} ]);
466 }
467
468 sub remove_column { shift->remove_columns(@_); } # DO NOT CHANGE THIS TO GLOB
469
470 =head2 set_primary_key
471
472 =over 4
473
474 =item Arguments: @cols
475
476 =item Return value: undefined
477
478 =back
479
480 Defines one or more columns as primary key for this source. Must be
481 called after L</add_columns>.
482
483 Additionally, defines a L<unique constraint|add_unique_constraint>
484 named C<primary>.
485
486 Note: you normally do want to define a primary key on your sources
487 B<even if the underlying database table does not have a primary key>.
488 See
489 L<DBIx::Class::Intro/The Significance and Importance of Primary Keys>
490 for more info.
491
492 =cut
493
494 sub set_primary_key {
495   my ($self, @cols) = @_;
496   # check if primary key columns are valid columns
497   foreach my $col (@cols) {
498     $self->throw_exception("No such column $col on table " . $self->name)
499       unless $self->has_column($col);
500   }
501   $self->_primaries(\@cols);
502
503   $self->add_unique_constraint(primary => \@cols);
504 }
505
506 =head2 primary_columns
507
508 =over 4
509
510 =item Arguments: None
511
512 =item Return value: Ordered list of primary column names
513
514 =back
515
516 Read-only accessor which returns the list of primary keys, supplied by
517 L</set_primary_key>.
518
519 =cut
520
521 sub primary_columns {
522   return @{shift->_primaries||[]};
523 }
524
525 # a helper method that will automatically die with a descriptive message if
526 # no pk is defined on the source in question. For internal use to save
527 # on if @pks... boilerplate
528 sub _pri_cols {
529   my $self = shift;
530   my @pcols = $self->primary_columns
531     or $self->throw_exception (sprintf(
532       "Operation requires a primary key to be declared on '%s' via set_primary_key",
533       $self->source_name,
534     ));
535   return @pcols;
536 }
537
538 =head2 add_unique_constraint
539
540 =over 4
541
542 =item Arguments: $name?, \@colnames
543
544 =item Return value: undefined
545
546 =back
547
548 Declare a unique constraint on this source. Call once for each unique
549 constraint.
550
551   # For UNIQUE (column1, column2)
552   __PACKAGE__->add_unique_constraint(
553     constraint_name => [ qw/column1 column2/ ],
554   );
555
556 Alternatively, you can specify only the columns:
557
558   __PACKAGE__->add_unique_constraint([ qw/column1 column2/ ]);
559
560 This will result in a unique constraint named
561 C<table_column1_column2>, where C<table> is replaced with the table
562 name.
563
564 Unique constraints are used, for example, when you pass the constraint
565 name as the C<key> attribute to L<DBIx::Class::ResultSet/find>. Then
566 only columns in the constraint are searched.
567
568 Throws an error if any of the given column names do not yet exist on
569 the result source.
570
571 =cut
572
573 sub add_unique_constraint {
574   my $self = shift;
575   my $cols = pop @_;
576   my $name = shift;
577
578   $name ||= $self->name_unique_constraint($cols);
579
580   foreach my $col (@$cols) {
581     $self->throw_exception("No such column $col on table " . $self->name)
582       unless $self->has_column($col);
583   }
584
585   my %unique_constraints = $self->unique_constraints;
586   $unique_constraints{$name} = $cols;
587   $self->_unique_constraints(\%unique_constraints);
588 }
589
590 =head2 name_unique_constraint
591
592 =over 4
593
594 =item Arguments: @colnames
595
596 =item Return value: Constraint name
597
598 =back
599
600   $source->table('mytable');
601   $source->name_unique_constraint('col1', 'col2');
602   # returns
603   'mytable_col1_col2'
604
605 Return a name for a unique constraint containing the specified
606 columns. The name is created by joining the table name and each column
607 name, using an underscore character.
608
609 For example, a constraint on a table named C<cd> containing the columns
610 C<artist> and C<title> would result in a constraint name of C<cd_artist_title>.
611
612 This is used by L</add_unique_constraint> if you do not specify the
613 optional constraint name.
614
615 =cut
616
617 sub name_unique_constraint {
618   my ($self, $cols) = @_;
619
620   my $name = $self->name;
621   $name = $$name if (ref $name eq 'SCALAR');
622
623   return join '_', $name, @$cols;
624 }
625
626 =head2 unique_constraints
627
628 =over 4
629
630 =item Arguments: None
631
632 =item Return value: Hash of unique constraint data
633
634 =back
635
636   $source->unique_constraints();
637
638 Read-only accessor which returns a hash of unique constraints on this
639 source.
640
641 The hash is keyed by constraint name, and contains an arrayref of
642 column names as values.
643
644 =cut
645
646 sub unique_constraints {
647   return %{shift->_unique_constraints||{}};
648 }
649
650 =head2 unique_constraint_names
651
652 =over 4
653
654 =item Arguments: None
655
656 =item Return value: Unique constraint names
657
658 =back
659
660   $source->unique_constraint_names();
661
662 Returns the list of unique constraint names defined on this source.
663
664 =cut
665
666 sub unique_constraint_names {
667   my ($self) = @_;
668
669   my %unique_constraints = $self->unique_constraints;
670
671   return keys %unique_constraints;
672 }
673
674 =head2 unique_constraint_columns
675
676 =over 4
677
678 =item Arguments: $constraintname
679
680 =item Return value: List of constraint columns
681
682 =back
683
684   $source->unique_constraint_columns('myconstraint');
685
686 Returns the list of columns that make up the specified unique constraint.
687
688 =cut
689
690 sub unique_constraint_columns {
691   my ($self, $constraint_name) = @_;
692
693   my %unique_constraints = $self->unique_constraints;
694
695   $self->throw_exception(
696     "Unknown unique constraint $constraint_name on '" . $self->name . "'"
697   ) unless exists $unique_constraints{$constraint_name};
698
699   return @{ $unique_constraints{$constraint_name} };
700 }
701
702 =head2 sqlt_deploy_callback
703
704 =over
705
706 =item Arguments: $callback
707
708 =back
709
710   __PACKAGE__->sqlt_deploy_callback('mycallbackmethod');
711
712 An accessor to set a callback to be called during deployment of
713 the schema via L<DBIx::Class::Schema/create_ddl_dir> or
714 L<DBIx::Class::Schema/deploy>.
715
716 The callback can be set as either a code reference or the name of a
717 method in the current result class.
718
719 If not set, the L</default_sqlt_deploy_hook> is called.
720
721 Your callback will be passed the $source object representing the
722 ResultSource instance being deployed, and the
723 L<SQL::Translator::Schema::Table> object being created from it. The
724 callback can be used to manipulate the table object or add your own
725 customised indexes. If you need to manipulate a non-table object, use
726 the L<DBIx::Class::Schema/sqlt_deploy_hook>.
727
728 See L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To
729 Your SQL> for examples.
730
731 This sqlt deployment callback can only be used to manipulate
732 SQL::Translator objects as they get turned into SQL. To execute
733 post-deploy statements which SQL::Translator does not currently
734 handle, override L<DBIx::Class::Schema/deploy> in your Schema class
735 and call L<dbh_do|DBIx::Class::Storage::DBI/dbh_do>.
736
737 =head2 default_sqlt_deploy_hook
738
739 =over
740
741 =item Arguments: $source, $sqlt_table
742
743 =item Return value: undefined
744
745 =back
746
747 This is the sensible default for L</sqlt_deploy_callback>.
748
749 If a method named C<sqlt_deploy_hook> exists in your Result class, it
750 will be called and passed the current C<$source> and the
751 C<$sqlt_table> being deployed.
752
753 =cut
754
755 sub default_sqlt_deploy_hook {
756   my $self = shift;
757
758   my $class = $self->result_class;
759
760   if ($class and $class->can('sqlt_deploy_hook')) {
761     $class->sqlt_deploy_hook(@_);
762   }
763 }
764
765 sub _invoke_sqlt_deploy_hook {
766   my $self = shift;
767   if ( my $hook = $self->sqlt_deploy_callback) {
768     $self->$hook(@_);
769   }
770 }
771
772 =head2 resultset
773
774 =over 4
775
776 =item Arguments: None
777
778 =item Return value: $resultset
779
780 =back
781
782 Returns a resultset for the given source. This will initially be created
783 on demand by calling
784
785   $self->resultset_class->new($self, $self->resultset_attributes)
786
787 but is cached from then on unless resultset_class changes.
788
789 =head2 resultset_class
790
791 =over 4
792
793 =item Arguments: $classname
794
795 =item Return value: $classname
796
797 =back
798
799   package My::Schema::ResultSet::Artist;
800   use base 'DBIx::Class::ResultSet';
801   ...
802
803   # In the result class
804   __PACKAGE__->resultset_class('My::Schema::ResultSet::Artist');
805
806   # Or in code
807   $source->resultset_class('My::Schema::ResultSet::Artist');
808
809 Set the class of the resultset. This is useful if you want to create your
810 own resultset methods. Create your own class derived from
811 L<DBIx::Class::ResultSet>, and set it here. If called with no arguments,
812 this method returns the name of the existing resultset class, if one
813 exists.
814
815 =head2 resultset_attributes
816
817 =over 4
818
819 =item Arguments: \%attrs
820
821 =item Return value: \%attrs
822
823 =back
824
825   # In the result class
826   __PACKAGE__->resultset_attributes({ order_by => [ 'id' ] });
827
828   # Or in code
829   $source->resultset_attributes({ order_by => [ 'id' ] });
830
831 Store a collection of resultset attributes, that will be set on every
832 L<DBIx::Class::ResultSet> produced from this result source. For a full
833 list see L<DBIx::Class::ResultSet/ATTRIBUTES>.
834
835 =cut
836
837 sub resultset {
838   my $self = shift;
839   $self->throw_exception(
840     'resultset does not take any arguments. If you want another resultset, '.
841     'call it on the schema instead.'
842   ) if scalar @_;
843
844   return $self->resultset_class->new(
845     $self,
846     {
847       %{$self->{resultset_attributes}},
848       %{$self->schema->default_resultset_attributes}
849     },
850   );
851 }
852
853 =head2 source_name
854
855 =over 4
856
857 =item Arguments: $source_name
858
859 =item Result value: $source_name
860
861 =back
862
863 Set an alternate name for the result source when it is loaded into a schema.
864 This is useful if you want to refer to a result source by a name other than
865 its class name.
866
867   package ArchivedBooks;
868   use base qw/DBIx::Class/;
869   __PACKAGE__->table('books_archive');
870   __PACKAGE__->source_name('Books');
871
872   # from your schema...
873   $schema->resultset('Books')->find(1);
874
875 =head2 from
876
877 =over 4
878
879 =item Arguments: None
880
881 =item Return value: FROM clause
882
883 =back
884
885   my $from_clause = $source->from();
886
887 Returns an expression of the source to be supplied to storage to specify
888 retrieval from this source. In the case of a database, the required FROM
889 clause contents.
890
891 =head2 schema
892
893 =over 4
894
895 =item Arguments: None
896
897 =item Return value: A schema object
898
899 =back
900
901   my $schema = $source->schema();
902
903 Returns the L<DBIx::Class::Schema> object that this result source 
904 belongs to.
905
906 =head2 storage
907
908 =over 4
909
910 =item Arguments: None
911
912 =item Return value: A Storage object
913
914 =back
915
916   $source->storage->debug(1);
917
918 Returns the storage handle for the current schema.
919
920 See also: L<DBIx::Class::Storage>
921
922 =cut
923
924 sub storage { shift->schema->storage; }
925
926 =head2 add_relationship
927
928 =over 4
929
930 =item Arguments: $relname, $related_source_name, \%cond, [ \%attrs ]
931
932 =item Return value: 1/true if it succeeded
933
934 =back
935
936   $source->add_relationship('relname', 'related_source', $cond, $attrs);
937
938 L<DBIx::Class::Relationship> describes a series of methods which
939 create pre-defined useful types of relationships. Look there first
940 before using this method directly.
941
942 The relationship name can be arbitrary, but must be unique for each
943 relationship attached to this result source. 'related_source' should
944 be the name with which the related result source was registered with
945 the current schema. For example:
946
947   $schema->source('Book')->add_relationship('reviews', 'Review', {
948     'foreign.book_id' => 'self.id',
949   });
950
951 The condition C<$cond> needs to be an L<SQL::Abstract>-style
952 representation of the join between the tables. For example, if you're
953 creating a relation from Author to Book,
954
955   { 'foreign.author_id' => 'self.id' }
956
957 will result in the JOIN clause
958
959   author me JOIN book foreign ON foreign.author_id = me.id
960
961 You can specify as many foreign => self mappings as necessary.
962
963 Valid attributes are as follows:
964
965 =over 4
966
967 =item join_type
968
969 Explicitly specifies the type of join to use in the relationship. Any
970 SQL join type is valid, e.g. C<LEFT> or C<RIGHT>. It will be placed in
971 the SQL command immediately before C<JOIN>.
972
973 =item proxy
974
975 An arrayref containing a list of accessors in the foreign class to proxy in
976 the main class. If, for example, you do the following:
977
978   CD->might_have(liner_notes => 'LinerNotes', undef, {
979     proxy => [ qw/notes/ ],
980   });
981
982 Then, assuming LinerNotes has an accessor named notes, you can do:
983
984   my $cd = CD->find(1);
985   # set notes -- LinerNotes object is created if it doesn't exist
986   $cd->notes('Notes go here');
987
988 =item accessor
989
990 Specifies the type of accessor that should be created for the
991 relationship. Valid values are C<single> (for when there is only a single
992 related object), C<multi> (when there can be many), and C<filter> (for
993 when there is a single related object, but you also want the relationship
994 accessor to double as a column accessor). For C<multi> accessors, an
995 add_to_* method is also created, which calls C<create_related> for the
996 relationship.
997
998 =back
999
1000 Throws an exception if the condition is improperly supplied, or cannot
1001 be resolved.
1002
1003 =cut
1004
1005 sub add_relationship {
1006   my ($self, $rel, $f_source_name, $cond, $attrs) = @_;
1007   $self->throw_exception("Can't create relationship without join condition")
1008     unless $cond;
1009   $attrs ||= {};
1010
1011   # Check foreign and self are right in cond
1012   if ( (ref $cond ||'') eq 'HASH') {
1013     for (keys %$cond) {
1014       $self->throw_exception("Keys of condition should be of form 'foreign.col', not '$_'")
1015         if /\./ && !/^foreign\./;
1016     }
1017   }
1018
1019   my %rels = %{ $self->_relationships };
1020   $rels{$rel} = { class => $f_source_name,
1021                   source => $f_source_name,
1022                   cond  => $cond,
1023                   attrs => $attrs };
1024   $self->_relationships(\%rels);
1025
1026   return $self;
1027
1028   # XXX disabled. doesn't work properly currently. skip in tests.
1029
1030   my $f_source = $self->schema->source($f_source_name);
1031   unless ($f_source) {
1032     $self->ensure_class_loaded($f_source_name);
1033     $f_source = $f_source_name->result_source;
1034     #my $s_class = ref($self->schema);
1035     #$f_source_name =~ m/^${s_class}::(.*)$/;
1036     #$self->schema->register_class(($1 || $f_source_name), $f_source_name);
1037     #$f_source = $self->schema->source($f_source_name);
1038   }
1039   return unless $f_source; # Can't test rel without f_source
1040
1041   try { $self->_resolve_join($rel, 'me', {}, []) }
1042   catch {
1043     # If the resolve failed, back out and re-throw the error
1044     delete $rels{$rel}; #
1045     $self->_relationships(\%rels);
1046     $self->throw_exception("Error creating relationship $rel: $_");
1047   };
1048   1;
1049 }
1050
1051 =head2 relationships
1052
1053 =over 4
1054
1055 =item Arguments: None
1056
1057 =item Return value: List of relationship names
1058
1059 =back
1060
1061   my @relnames = $source->relationships();
1062
1063 Returns all relationship names for this source.
1064
1065 =cut
1066
1067 sub relationships {
1068   return keys %{shift->_relationships};
1069 }
1070
1071 =head2 relationship_info
1072
1073 =over 4
1074
1075 =item Arguments: $relname
1076
1077 =item Return value: Hashref of relation data,
1078
1079 =back
1080
1081 Returns a hash of relationship information for the specified relationship
1082 name. The keys/values are as specified for L</add_relationship>.
1083
1084 =cut
1085
1086 sub relationship_info {
1087   my ($self, $rel) = @_;
1088   return $self->_relationships->{$rel};
1089 }
1090
1091 =head2 has_relationship
1092
1093 =over 4
1094
1095 =item Arguments: $rel
1096
1097 =item Return value: 1/0 (true/false)
1098
1099 =back
1100
1101 Returns true if the source has a relationship of this name, false otherwise.
1102
1103 =cut
1104
1105 sub has_relationship {
1106   my ($self, $rel) = @_;
1107   return exists $self->_relationships->{$rel};
1108 }
1109
1110 =head2 reverse_relationship_info
1111
1112 =over 4
1113
1114 =item Arguments: $relname
1115
1116 =item Return value: Hashref of relationship data
1117
1118 =back
1119
1120 Looks through all the relationships on the source this relationship
1121 points to, looking for one whose condition is the reverse of the
1122 condition on this relationship.
1123
1124 A common use of this is to find the name of the C<belongs_to> relation
1125 opposing a C<has_many> relation. For definition of these look in
1126 L<DBIx::Class::Relationship>.
1127
1128 The returned hashref is keyed by the name of the opposing
1129 relationship, and contains its data in the same manner as
1130 L</relationship_info>.
1131
1132 =cut
1133
1134 sub reverse_relationship_info {
1135   my ($self, $rel) = @_;
1136   my $rel_info = $self->relationship_info($rel);
1137   my $ret = {};
1138
1139   return $ret unless ((ref $rel_info->{cond}) eq 'HASH');
1140
1141   my @cond = keys(%{$rel_info->{cond}});
1142   my @refkeys = map {/^\w+\.(\w+)$/} @cond;
1143   my @keys = map {$rel_info->{cond}->{$_} =~ /^\w+\.(\w+)$/} @cond;
1144
1145   # Get the related result source for this relationship
1146   my $othertable = $self->related_source($rel);
1147
1148   # Get all the relationships for that source that related to this source
1149   # whose foreign column set are our self columns on $rel and whose self
1150   # columns are our foreign columns on $rel.
1151   my @otherrels = $othertable->relationships();
1152   my $otherrelationship;
1153   foreach my $otherrel (@otherrels) {
1154     my $otherrel_info = $othertable->relationship_info($otherrel);
1155
1156     my $back = $othertable->related_source($otherrel);
1157     next unless $back->source_name eq $self->source_name;
1158
1159     my @othertestconds;
1160
1161     if (ref $otherrel_info->{cond} eq 'HASH') {
1162       @othertestconds = ($otherrel_info->{cond});
1163     }
1164     elsif (ref $otherrel_info->{cond} eq 'ARRAY') {
1165       @othertestconds = @{$otherrel_info->{cond}};
1166     }
1167     else {
1168       next;
1169     }
1170
1171     foreach my $othercond (@othertestconds) {
1172       my @other_cond = keys(%$othercond);
1173       my @other_refkeys = map {/^\w+\.(\w+)$/} @other_cond;
1174       my @other_keys = map {$othercond->{$_} =~ /^\w+\.(\w+)$/} @other_cond;
1175       next if (!$self->_compare_relationship_keys(\@refkeys, \@other_keys) ||
1176                !$self->_compare_relationship_keys(\@other_refkeys, \@keys));
1177       $ret->{$otherrel} =  $otherrel_info;
1178     }
1179   }
1180   return $ret;
1181 }
1182
1183 sub compare_relationship_keys {
1184   carp 'compare_relationship_keys is a private method, stop calling it';
1185   my $self = shift;
1186   $self->_compare_relationship_keys (@_);
1187 }
1188
1189 # Returns true if both sets of keynames are the same, false otherwise.
1190 sub _compare_relationship_keys {
1191   my ($self, $keys1, $keys2) = @_;
1192
1193   # Make sure every keys1 is in keys2
1194   my $found;
1195   foreach my $key (@$keys1) {
1196     $found = 0;
1197     foreach my $prim (@$keys2) {
1198       if ($prim eq $key) {
1199         $found = 1;
1200         last;
1201       }
1202     }
1203     last unless $found;
1204   }
1205
1206   # Make sure every key2 is in key1
1207   if ($found) {
1208     foreach my $prim (@$keys2) {
1209       $found = 0;
1210       foreach my $key (@$keys1) {
1211         if ($prim eq $key) {
1212           $found = 1;
1213           last;
1214         }
1215       }
1216       last unless $found;
1217     }
1218   }
1219
1220   return $found;
1221 }
1222
1223 # Returns the {from} structure used to express JOIN conditions
1224 sub _resolve_join {
1225   my ($self, $join, $alias, $seen, $jpath, $parent_force_left) = @_;
1226
1227   # we need a supplied one, because we do in-place modifications, no returns
1228   $self->throw_exception ('You must supply a seen hashref as the 3rd argument to _resolve_join')
1229     unless ref $seen eq 'HASH';
1230
1231   $self->throw_exception ('You must supply a joinpath arrayref as the 4th argument to _resolve_join')
1232     unless ref $jpath eq 'ARRAY';
1233
1234   $jpath = [@$jpath]; # copy
1235
1236   if (not defined $join) {
1237     return ();
1238   }
1239   elsif (ref $join eq 'ARRAY') {
1240     return
1241       map {
1242         $self->_resolve_join($_, $alias, $seen, $jpath, $parent_force_left);
1243       } @$join;
1244   }
1245   elsif (ref $join eq 'HASH') {
1246
1247     my @ret;
1248     for my $rel (keys %$join) {
1249
1250       my $rel_info = $self->relationship_info($rel)
1251         or $self->throw_exception("No such relationship '$rel' on " . $self->source_name);
1252
1253       my $force_left = $parent_force_left;
1254       $force_left ||= lc($rel_info->{attrs}{join_type}||'') eq 'left';
1255
1256       # the actual seen value will be incremented by the recursion
1257       my $as = $self->storage->relname_to_table_alias(
1258         $rel, ($seen->{$rel} && $seen->{$rel} + 1)
1259       );
1260
1261       push @ret, (
1262         $self->_resolve_join($rel, $alias, $seen, [@$jpath], $force_left),
1263         $self->related_source($rel)->_resolve_join(
1264           $join->{$rel}, $as, $seen, [@$jpath, { $rel => $as }], $force_left
1265         )
1266       );
1267     }
1268     return @ret;
1269
1270   }
1271   elsif (ref $join) {
1272     $self->throw_exception("No idea how to resolve join reftype ".ref $join);
1273   }
1274   else {
1275     my $count = ++$seen->{$join};
1276     my $as = $self->storage->relname_to_table_alias(
1277       $join, ($count > 1 && $count)
1278     );
1279
1280     my $rel_info = $self->relationship_info($join)
1281       or $self->throw_exception("No such relationship $join on " . $self->source_name);
1282
1283     my $rel_src = $self->related_source($join);
1284     return [ { $as => $rel_src->from,
1285                -source_handle => $rel_src->handle,
1286                -join_type => $parent_force_left
1287                   ? 'left'
1288                   : $rel_info->{attrs}{join_type}
1289                 ,
1290                -join_path => [@$jpath, { $join => $as } ],
1291                -is_single => (
1292                   $rel_info->{attrs}{accessor}
1293                     &&
1294                   List::Util::first { $rel_info->{attrs}{accessor} eq $_ } (qw/single filter/)
1295                 ),
1296                -alias => $as,
1297                -relation_chain_depth => $seen->{-relation_chain_depth} || 0,
1298              },
1299              $self->_resolve_condition($rel_info->{cond}, $as, $alias) ];
1300   }
1301 }
1302
1303 sub pk_depends_on {
1304   carp 'pk_depends_on is a private method, stop calling it';
1305   my $self = shift;
1306   $self->_pk_depends_on (@_);
1307 }
1308
1309 # Determines whether a relation is dependent on an object from this source
1310 # having already been inserted. Takes the name of the relationship and a
1311 # hashref of columns of the related object.
1312 sub _pk_depends_on {
1313   my ($self, $relname, $rel_data) = @_;
1314
1315   my $relinfo = $self->relationship_info($relname);
1316
1317   # don't assume things if the relationship direction is specified
1318   return $relinfo->{attrs}{is_foreign_key_constraint}
1319     if exists ($relinfo->{attrs}{is_foreign_key_constraint});
1320
1321   my $cond = $relinfo->{cond};
1322   return 0 unless ref($cond) eq 'HASH';
1323
1324   # map { foreign.foo => 'self.bar' } to { bar => 'foo' }
1325   my $keyhash = { map { my $x = $_; $x =~ s/.*\.//; $x; } reverse %$cond };
1326
1327   # assume anything that references our PK probably is dependent on us
1328   # rather than vice versa, unless the far side is (a) defined or (b)
1329   # auto-increment
1330   my $rel_source = $self->related_source($relname);
1331
1332   foreach my $p ($self->primary_columns) {
1333     if (exists $keyhash->{$p}) {
1334       unless (defined($rel_data->{$keyhash->{$p}})
1335               || $rel_source->column_info($keyhash->{$p})
1336                             ->{is_auto_increment}) {
1337         return 0;
1338       }
1339     }
1340   }
1341
1342   return 1;
1343 }
1344
1345 sub resolve_condition {
1346   carp 'resolve_condition is a private method, stop calling it';
1347   my $self = shift;
1348   $self->_resolve_condition (@_);
1349 }
1350
1351 # Resolves the passed condition to a concrete query fragment. If given an alias,
1352 # returns a join condition; if given an object, inverts that object to produce
1353 # a related conditional from that object.
1354 our $UNRESOLVABLE_CONDITION = \'1 = 0';
1355
1356 sub _resolve_condition {
1357   my ($self, $cond, $as, $for) = @_;
1358   if (ref $cond eq 'HASH') {
1359     my %ret;
1360     foreach my $k (keys %{$cond}) {
1361       my $v = $cond->{$k};
1362       # XXX should probably check these are valid columns
1363       $k =~ s/^foreign\.// ||
1364         $self->throw_exception("Invalid rel cond key ${k}");
1365       $v =~ s/^self\.// ||
1366         $self->throw_exception("Invalid rel cond val ${v}");
1367       if (ref $for) { # Object
1368         #warn "$self $k $for $v";
1369         unless ($for->has_column_loaded($v)) {
1370           if ($for->in_storage) {
1371             $self->throw_exception(sprintf
1372               "Unable to resolve relationship '%s' from object %s: column '%s' not "
1373             . 'loaded from storage (or not passed to new() prior to insert()). You '
1374             . 'probably need to call ->discard_changes to get the server-side defaults '
1375             . 'from the database.',
1376               $as,
1377               $for,
1378               $v,
1379             );
1380           }
1381           return $UNRESOLVABLE_CONDITION;
1382         }
1383         $ret{$k} = $for->get_column($v);
1384         #$ret{$k} = $for->get_column($v) if $for->has_column_loaded($v);
1385         #warn %ret;
1386       } elsif (!defined $for) { # undef, i.e. "no object"
1387         $ret{$k} = undef;
1388       } elsif (ref $as eq 'HASH') { # reverse hashref
1389         $ret{$v} = $as->{$k};
1390       } elsif (ref $as) { # reverse object
1391         $ret{$v} = $as->get_column($k);
1392       } elsif (!defined $as) { # undef, i.e. "no reverse object"
1393         $ret{$v} = undef;
1394       } else {
1395         $ret{"${as}.${k}"} = "${for}.${v}";
1396       }
1397     }
1398     return \%ret;
1399   } elsif (ref $cond eq 'ARRAY') {
1400     return [ map { $self->_resolve_condition($_, $as, $for) } @$cond ];
1401   } else {
1402    die("Can't handle condition $cond yet :(");
1403   }
1404 }
1405
1406
1407 # Accepts one or more relationships for the current source and returns an
1408 # array of column names for each of those relationships. Column names are
1409 # prefixed relative to the current source, in accordance with where they appear
1410 # in the supplied relationships.
1411
1412 sub _resolve_prefetch {
1413   my ($self, $pre, $alias, $alias_map, $order, $collapse, $pref_path) = @_;
1414   $pref_path ||= [];
1415
1416   if (not defined $pre) {
1417     return ();
1418   }
1419   elsif( ref $pre eq 'ARRAY' ) {
1420     return
1421       map { $self->_resolve_prefetch( $_, $alias, $alias_map, $order, $collapse, [ @$pref_path ] ) }
1422         @$pre;
1423   }
1424   elsif( ref $pre eq 'HASH' ) {
1425     my @ret =
1426     map {
1427       $self->_resolve_prefetch($_, $alias, $alias_map, $order, $collapse, [ @$pref_path ] ),
1428       $self->related_source($_)->_resolve_prefetch(
1429                $pre->{$_}, "${alias}.$_", $alias_map, $order, $collapse, [ @$pref_path, $_] )
1430     } keys %$pre;
1431     return @ret;
1432   }
1433   elsif( ref $pre ) {
1434     $self->throw_exception(
1435       "don't know how to resolve prefetch reftype ".ref($pre));
1436   }
1437   else {
1438     my $p = $alias_map;
1439     $p = $p->{$_} for (@$pref_path, $pre);
1440
1441     $self->throw_exception (
1442       "Unable to resolve prefetch '$pre' - join alias map does not contain an entry for path: "
1443       . join (' -> ', @$pref_path, $pre)
1444     ) if (ref $p->{-join_aliases} ne 'ARRAY' or not @{$p->{-join_aliases}} );
1445
1446     my $as = shift @{$p->{-join_aliases}};
1447
1448     my $rel_info = $self->relationship_info( $pre );
1449     $self->throw_exception( $self->source_name . " has no such relationship '$pre'" )
1450       unless $rel_info;
1451     my $as_prefix = ($alias =~ /^.*?\.(.+)$/ ? $1.'.' : '');
1452     my $rel_source = $self->related_source($pre);
1453
1454     if ($rel_info->{attrs}{accessor} && $rel_info->{attrs}{accessor} eq 'multi') {
1455       $self->throw_exception(
1456         "Can't prefetch has_many ${pre} (join cond too complex)")
1457         unless ref($rel_info->{cond}) eq 'HASH';
1458       my $dots = @{[$as_prefix =~ m/\./g]} + 1; # +1 to match the ".${as_prefix}"
1459       if (my ($fail) = grep { @{[$_ =~ m/\./g]} == $dots }
1460                          keys %{$collapse}) {
1461         my ($last) = ($fail =~ /([^\.]+)$/);
1462         carp (
1463           "Prefetching multiple has_many rels ${last} and ${pre} "
1464           .(length($as_prefix)
1465             ? "at the same level (${as_prefix}) "
1466             : "at top level "
1467           )
1468           . 'will explode the number of row objects retrievable via ->next or ->all. '
1469           . 'Use at your own risk.'
1470         );
1471       }
1472       #my @col = map { (/^self\.(.+)$/ ? ("${as_prefix}.$1") : ()); }
1473       #              values %{$rel_info->{cond}};
1474       $collapse->{".${as_prefix}${pre}"} = [ $rel_source->_pri_cols ];
1475         # action at a distance. prepending the '.' allows simpler code
1476         # in ResultSet->_collapse_result
1477       my @key = map { (/^foreign\.(.+)$/ ? ($1) : ()); }
1478                     keys %{$rel_info->{cond}};
1479       my @ord = (ref($rel_info->{attrs}{order_by}) eq 'ARRAY'
1480                    ? @{$rel_info->{attrs}{order_by}}
1481    
1482                 : (defined $rel_info->{attrs}{order_by}
1483                        ? ($rel_info->{attrs}{order_by})
1484                        : ()));
1485       push(@$order, map { "${as}.$_" } (@key, @ord));
1486     }
1487
1488     return map { [ "${as}.$_", "${as_prefix}${pre}.$_", ] }
1489       $rel_source->columns;
1490   }
1491 }
1492
1493 =head2 related_source
1494
1495 =over 4
1496
1497 =item Arguments: $relname
1498
1499 =item Return value: $source
1500
1501 =back
1502
1503 Returns the result source object for the given relationship.
1504
1505 =cut
1506
1507 sub related_source {
1508   my ($self, $rel) = @_;
1509   if( !$self->has_relationship( $rel ) ) {
1510     $self->throw_exception("No such relationship '$rel' on " . $self->source_name);
1511   }
1512   return $self->schema->source($self->relationship_info($rel)->{source});
1513 }
1514
1515 =head2 related_class
1516
1517 =over 4
1518
1519 =item Arguments: $relname
1520
1521 =item Return value: $classname
1522
1523 =back
1524
1525 Returns the class name for objects in the given relationship.
1526
1527 =cut
1528
1529 sub related_class {
1530   my ($self, $rel) = @_;
1531   if( !$self->has_relationship( $rel ) ) {
1532     $self->throw_exception("No such relationship '$rel' on " . $self->source_name);
1533   }
1534   return $self->schema->class($self->relationship_info($rel)->{source});
1535 }
1536
1537 =head2 handle
1538
1539 Obtain a new handle to this source. Returns an instance of a 
1540 L<DBIx::Class::ResultSourceHandle>.
1541
1542 =cut
1543
1544 sub handle {
1545     return DBIx::Class::ResultSourceHandle->new({
1546         schema         => $_[0]->schema,
1547         source_moniker => $_[0]->source_name
1548     });
1549 }
1550
1551 =head2 throw_exception
1552
1553 See L<DBIx::Class::Schema/"throw_exception">.
1554
1555 =cut
1556
1557 sub throw_exception {
1558   my $self = shift;
1559
1560   if (defined $self->schema) {
1561     $self->schema->throw_exception(@_);
1562   }
1563   else {
1564     DBIx::Class::Exception->throw(@_);
1565   }
1566 }
1567
1568 =head2 source_info
1569
1570 Stores a hashref of per-source metadata.  No specific key names
1571 have yet been standardized, the examples below are purely hypothetical
1572 and don't actually accomplish anything on their own:
1573
1574   __PACKAGE__->source_info({
1575     "_tablespace" => 'fast_disk_array_3',
1576     "_engine" => 'InnoDB',
1577   });
1578
1579 =head2 new
1580
1581   $class->new();
1582
1583   $class->new({attribute_name => value});
1584
1585 Creates a new ResultSource object.  Not normally called directly by end users.
1586
1587 =head2 column_info_from_storage
1588
1589 =over
1590
1591 =item Arguments: 1/0 (default: 0)
1592
1593 =item Return value: 1/0
1594
1595 =back
1596
1597   __PACKAGE__->column_info_from_storage(1);
1598
1599 Enables the on-demand automatic loading of the above column
1600 metadata from storage as necessary.  This is *deprecated*, and
1601 should not be used.  It will be removed before 1.0.
1602
1603
1604 =head1 AUTHORS
1605
1606 Matt S. Trout <mst@shadowcatsystems.co.uk>
1607
1608 =head1 LICENSE
1609
1610 You may distribute this code under the same terms as Perl itself.
1611
1612 =cut
1613
1614 1;