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