Pass relationship name to _resolve_condition explicitly
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Schema.pm
1 package DBIx::Class::Schema;
2
3 use strict;
4 use warnings;
5
6 use DBIx::Class::Exception;
7 use Carp::Clan qw/^DBIx::Class|^Try::Tiny/;
8 use Try::Tiny;
9 use Scalar::Util 'weaken';
10 use File::Spec;
11 use Sub::Name 'subname';
12 use Module::Find();
13 use Storable();
14 use B qw/svref_2object/;
15 use namespace::clean;
16
17 use base qw/DBIx::Class/;
18
19 __PACKAGE__->mk_classdata('class_mappings' => {});
20 __PACKAGE__->mk_classdata('source_registrations' => {});
21 __PACKAGE__->mk_classdata('storage_type' => '::DBI');
22 __PACKAGE__->mk_classdata('storage');
23 __PACKAGE__->mk_classdata('exception_action');
24 __PACKAGE__->mk_classdata('stacktrace' => $ENV{DBIC_TRACE} || 0);
25 __PACKAGE__->mk_classdata('default_resultset_attributes' => {});
26
27 =head1 NAME
28
29 DBIx::Class::Schema - composable schemas
30
31 =head1 SYNOPSIS
32
33   package Library::Schema;
34   use base qw/DBIx::Class::Schema/;
35
36   # load all Result classes in Library/Schema/Result/
37   __PACKAGE__->load_namespaces();
38
39   package Library::Schema::Result::CD;
40   use base qw/DBIx::Class::Core/;
41
42   __PACKAGE__->load_components(qw/InflateColumn::DateTime/); # for example
43   __PACKAGE__->table('cd');
44
45   # Elsewhere in your code:
46   my $schema1 = Library::Schema->connect(
47     $dsn,
48     $user,
49     $password,
50     { AutoCommit => 1 },
51   );
52
53   my $schema2 = Library::Schema->connect($coderef_returning_dbh);
54
55   # fetch objects using Library::Schema::Result::DVD
56   my $resultset = $schema1->resultset('DVD')->search( ... );
57   my @dvd_objects = $schema2->resultset('DVD')->search( ... );
58
59 =head1 DESCRIPTION
60
61 Creates database classes based on a schema. This is the recommended way to
62 use L<DBIx::Class> and allows you to use more than one concurrent connection
63 with your classes.
64
65 NB: If you're used to L<Class::DBI> it's worth reading the L</SYNOPSIS>
66 carefully, as DBIx::Class does things a little differently. Note in
67 particular which module inherits off which.
68
69 =head1 SETUP METHODS
70
71 =head2 load_namespaces
72
73 =over 4
74
75 =item Arguments: %options?
76
77 =back
78
79   __PACKAGE__->load_namespaces();
80
81   __PACKAGE__->load_namespaces(
82    result_namespace => 'Res',
83    resultset_namespace => 'RSet',
84    default_resultset_class => '+MyDB::Othernamespace::RSet',
85  );
86
87 With no arguments, this method uses L<Module::Find> to load all your
88 Result classes from a sub-namespace F<Result> under your Schema class'
89 namespace, i.e. with a Schema of I<MyDB::Schema> all files in
90 I<MyDB::Schema::Result> are assumed to be Result classes.
91
92 It also finds all ResultSet classes in the namespace F<ResultSet> and
93 loads them into the appropriate Result classes using for you. The
94 matching is done by assuming the package name of the ResultSet class
95 is the same as that of the Result class.
96
97 You will be warned if ResultSet classes are discovered for which there
98 are no matching Result classes like this:
99
100   load_namespaces found ResultSet class $classname with no corresponding Result class
101
102 If a Result class is found to already have a ResultSet class set using
103 L</resultset_class> to some other class, you will be warned like this:
104
105   We found ResultSet class '$rs_class' for '$result', but it seems
106   that you had already set '$result' to use '$rs_set' instead
107
108 Both of the sub-namespaces are configurable if you don't like the defaults,
109 via the options C<result_namespace> and C<resultset_namespace>.
110
111 If (and only if) you specify the option C<default_resultset_class>, any found
112 Result classes for which we do not find a corresponding
113 ResultSet class will have their C<resultset_class> set to
114 C<default_resultset_class>.
115
116 All of the namespace and classname options to this method are relative to
117 the schema classname by default.  To specify a fully-qualified name, prefix
118 it with a literal C<+>.
119
120 Examples:
121
122   # load My::Schema::Result::CD, My::Schema::Result::Artist,
123   #    My::Schema::ResultSet::CD, etc...
124   My::Schema->load_namespaces;
125
126   # Override everything to use ugly names.
127   # In this example, if there is a My::Schema::Res::Foo, but no matching
128   #   My::Schema::RSets::Foo, then Foo will have its
129   #   resultset_class set to My::Schema::RSetBase
130   My::Schema->load_namespaces(
131     result_namespace => 'Res',
132     resultset_namespace => 'RSets',
133     default_resultset_class => 'RSetBase',
134   );
135
136   # Put things in other namespaces
137   My::Schema->load_namespaces(
138     result_namespace => '+Some::Place::Results',
139     resultset_namespace => '+Another::Place::RSets',
140   );
141
142 If you'd like to use multiple namespaces of each type, simply use an arrayref
143 of namespaces for that option.  In the case that the same result
144 (or resultset) class exists in multiple namespaces, the latter entries in
145 your list of namespaces will override earlier ones.
146
147   My::Schema->load_namespaces(
148     # My::Schema::Results_C::Foo takes precedence over My::Schema::Results_B::Foo :
149     result_namespace => [ 'Results_A', 'Results_B', 'Results_C' ],
150     resultset_namespace => [ '+Some::Place::RSets', 'RSets' ],
151   );
152
153 =cut
154
155 # Pre-pends our classname to the given relative classname or
156 #   class namespace, unless there is a '+' prefix, which will
157 #   be stripped.
158 sub _expand_relative_name {
159   my ($class, $name) = @_;
160   return if !$name;
161   $name = $class . '::' . $name if ! ($name =~ s/^\+//);
162   return $name;
163 }
164
165 # Finds all modules in the supplied namespace, or if omitted in the
166 # namespace of $class. Untaints all findings as they can be assumed
167 # to be safe
168 sub _findallmod {
169   my $proto = shift;
170   my $ns = shift || ref $proto || $proto;
171
172   my @mods = Module::Find::findallmod($ns);
173
174   # try to untaint module names. mods where this fails
175   # are left alone so we don't have to change the old behavior
176   no locale; # localized \w doesn't untaint expression
177   return map { $_ =~ m/^( (?:\w+::)* \w+ )$/x ? $1 : $_ } @mods;
178 }
179
180 # returns a hash of $shortname => $fullname for every package
181 # found in the given namespaces ($shortname is with the $fullname's
182 # namespace stripped off)
183 sub _map_namespaces {
184   my ($class, @namespaces) = @_;
185
186   my @results_hash;
187   foreach my $namespace (@namespaces) {
188     push(
189       @results_hash,
190       map { (substr($_, length "${namespace}::"), $_) }
191       $class->_findallmod($namespace)
192     );
193   }
194
195   @results_hash;
196 }
197
198 # returns the result_source_instance for the passed class/object,
199 # or dies with an informative message (used by load_namespaces)
200 sub _ns_get_rsrc_instance {
201   my $class = shift;
202   my $rs = ref ($_[0]) || $_[0];
203
204   if ($rs->can ('result_source_instance') ) {
205     return $rs->result_source_instance;
206   }
207   else {
208     $class->throw_exception (
209       "Attempt to load_namespaces() class $rs failed - are you sure this is a real Result Class?"
210     );
211   }
212 }
213
214 sub load_namespaces {
215   my ($class, %args) = @_;
216
217   my $result_namespace = delete $args{result_namespace} || 'Result';
218   my $resultset_namespace = delete $args{resultset_namespace} || 'ResultSet';
219   my $default_resultset_class = delete $args{default_resultset_class};
220
221   $class->throw_exception('load_namespaces: unknown option(s): '
222     . join(q{,}, map { qq{'$_'} } keys %args))
223       if scalar keys %args;
224
225   $default_resultset_class
226     = $class->_expand_relative_name($default_resultset_class);
227
228   for my $arg ($result_namespace, $resultset_namespace) {
229     $arg = [ $arg ] if !ref($arg) && $arg;
230
231     $class->throw_exception('load_namespaces: namespace arguments must be '
232       . 'a simple string or an arrayref')
233         if ref($arg) ne 'ARRAY';
234
235     $_ = $class->_expand_relative_name($_) for (@$arg);
236   }
237
238   my %results = $class->_map_namespaces(@$result_namespace);
239   my %resultsets = $class->_map_namespaces(@$resultset_namespace);
240
241   my @to_register;
242   {
243     no warnings 'redefine';
244     local *Class::C3::reinitialize = sub { };
245     use warnings 'redefine';
246
247     # ensure classes are loaded and attached in inheritance order
248     for my $res (values %results) {
249       $class->ensure_class_loaded($res);
250     }
251     my %inh_idx;
252     my @subclass_last = sort {
253
254       ($inh_idx{$a} ||=
255         scalar @{mro::get_linear_isa( $results{$a} )}
256       )
257
258           <=>
259
260       ($inh_idx{$b} ||=
261         scalar @{mro::get_linear_isa( $results{$b} )}
262       )
263
264     } keys(%results);
265
266     foreach my $result (@subclass_last) {
267       my $result_class = $results{$result};
268
269       my $rs_class = delete $resultsets{$result};
270       my $rs_set = $class->_ns_get_rsrc_instance ($result_class)->resultset_class;
271
272       if($rs_set && $rs_set ne 'DBIx::Class::ResultSet') {
273         if($rs_class && $rs_class ne $rs_set) {
274           carp "We found ResultSet class '$rs_class' for '$result', but it seems "
275              . "that you had already set '$result' to use '$rs_set' instead";
276         }
277       }
278       elsif($rs_class ||= $default_resultset_class) {
279         $class->ensure_class_loaded($rs_class);
280         if(!$rs_class->isa("DBIx::Class::ResultSet")) {
281             carp "load_namespaces found ResultSet class $rs_class that does not subclass DBIx::Class::ResultSet";
282         }
283
284         $class->_ns_get_rsrc_instance ($result_class)->resultset_class($rs_class);
285       }
286
287       my $source_name = $class->_ns_get_rsrc_instance ($result_class)->source_name || $result;
288
289       push(@to_register, [ $source_name, $result_class ]);
290     }
291   }
292
293   foreach (sort keys %resultsets) {
294     carp "load_namespaces found ResultSet class $_ with no "
295       . 'corresponding Result class';
296   }
297
298   Class::C3->reinitialize;
299   $class->register_class(@$_) for (@to_register);
300
301   return;
302 }
303
304 =head2 load_classes
305
306 =over 4
307
308 =item Arguments: @classes?, { $namespace => [ @classes ] }+
309
310 =back
311
312 L</load_classes> is an alternative method to L</load_namespaces>, both of
313 which serve similar purposes, each with different advantages and disadvantages.
314 In the general case you should use L</load_namespaces>, unless you need to
315 be able to specify that only specific classes are loaded at runtime.
316
317 With no arguments, this method uses L<Module::Find> to find all classes under
318 the schema's namespace. Otherwise, this method loads the classes you specify
319 (using L<use>), and registers them (using L</"register_class">).
320
321 It is possible to comment out classes with a leading C<#>, but note that perl
322 will think it's a mistake (trying to use a comment in a qw list), so you'll
323 need to add C<no warnings 'qw';> before your load_classes call.
324
325 If any classes found do not appear to be Result class files, you will
326 get the following warning:
327
328    Failed to load $comp_class. Can't find source_name method. Is
329    $comp_class really a full DBIC result class? Fix it, move it elsewhere,
330    or make your load_classes call more specific.
331
332 Example:
333
334   My::Schema->load_classes(); # loads My::Schema::CD, My::Schema::Artist,
335                               # etc. (anything under the My::Schema namespace)
336
337   # loads My::Schema::CD, My::Schema::Artist, Other::Namespace::Producer but
338   # not Other::Namespace::LinerNotes nor My::Schema::Track
339   My::Schema->load_classes(qw/ CD Artist #Track /, {
340     Other::Namespace => [qw/ Producer #LinerNotes /],
341   });
342
343 =cut
344
345 sub load_classes {
346   my ($class, @params) = @_;
347
348   my %comps_for;
349
350   if (@params) {
351     foreach my $param (@params) {
352       if (ref $param eq 'ARRAY') {
353         # filter out commented entries
354         my @modules = grep { $_ !~ /^#/ } @$param;
355
356         push (@{$comps_for{$class}}, @modules);
357       }
358       elsif (ref $param eq 'HASH') {
359         # more than one namespace possible
360         for my $comp ( keys %$param ) {
361           # filter out commented entries
362           my @modules = grep { $_ !~ /^#/ } @{$param->{$comp}};
363
364           push (@{$comps_for{$comp}}, @modules);
365         }
366       }
367       else {
368         # filter out commented entries
369         push (@{$comps_for{$class}}, $param) if $param !~ /^#/;
370       }
371     }
372   } else {
373     my @comp = map { substr $_, length "${class}::"  }
374                  $class->_findallmod;
375     $comps_for{$class} = \@comp;
376   }
377
378   my @to_register;
379   {
380     no warnings qw/redefine/;
381     local *Class::C3::reinitialize = sub { };
382     foreach my $prefix (keys %comps_for) {
383       foreach my $comp (@{$comps_for{$prefix}||[]}) {
384         my $comp_class = "${prefix}::${comp}";
385         $class->ensure_class_loaded($comp_class);
386
387         my $snsub = $comp_class->can('source_name');
388         if(! $snsub ) {
389           carp "Failed to load $comp_class. Can't find source_name method. Is $comp_class really a full DBIC result class? Fix it, move it elsewhere, or make your load_classes call more specific.";
390           next;
391         }
392         $comp = $snsub->($comp_class) || $comp;
393
394         push(@to_register, [ $comp, $comp_class ]);
395       }
396     }
397   }
398   Class::C3->reinitialize;
399
400   foreach my $to (@to_register) {
401     $class->register_class(@$to);
402     #  if $class->can('result_source_instance');
403   }
404 }
405
406 =head2 storage_type
407
408 =over 4
409
410 =item Arguments: $storage_type|{$storage_type, \%args}
411
412 =item Return value: $storage_type|{$storage_type, \%args}
413
414 =item Default value: DBIx::Class::Storage::DBI
415
416 =back
417
418 Set the storage class that will be instantiated when L</connect> is called.
419 If the classname starts with C<::>, the prefix C<DBIx::Class::Storage> is
420 assumed by L</connect>.
421
422 You want to use this to set subclasses of L<DBIx::Class::Storage::DBI>
423 in cases where the appropriate subclass is not autodetected.
424
425 If your storage type requires instantiation arguments, those are
426 defined as a second argument in the form of a hashref and the entire
427 value needs to be wrapped into an arrayref or a hashref.  We support
428 both types of refs here in order to play nice with your
429 Config::[class] or your choice. See
430 L<DBIx::Class::Storage::DBI::Replicated> for an example of this.
431
432 =head2 exception_action
433
434 =over 4
435
436 =item Arguments: $code_reference
437
438 =item Return value: $code_reference
439
440 =item Default value: None
441
442 =back
443
444 When L</throw_exception> is invoked and L</exception_action> is set to a code
445 reference, this reference will be called instead of
446 L<DBIx::Class::Exception/throw>, with the exception message passed as the only
447 argument.
448
449 Your custom throw code B<must> rethrow the exception, as L</throw_exception> is
450 an integral part of DBIC's internal execution control flow.
451
452 Example:
453
454    package My::Schema;
455    use base qw/DBIx::Class::Schema/;
456    use My::ExceptionClass;
457    __PACKAGE__->exception_action(sub { My::ExceptionClass->throw(@_) });
458    __PACKAGE__->load_classes;
459
460    # or:
461    my $schema_obj = My::Schema->connect( .... );
462    $schema_obj->exception_action(sub { My::ExceptionClass->throw(@_) });
463
464 =head2 stacktrace
465
466 =over 4
467
468 =item Arguments: boolean
469
470 =back
471
472 Whether L</throw_exception> should include stack trace information.
473 Defaults to false normally, but defaults to true if C<$ENV{DBIC_TRACE}>
474 is true.
475
476 =head2 sqlt_deploy_hook
477
478 =over
479
480 =item Arguments: $sqlt_schema
481
482 =back
483
484 An optional sub which you can declare in your own Schema class that will get
485 passed the L<SQL::Translator::Schema> object when you deploy the schema via
486 L</create_ddl_dir> or L</deploy>.
487
488 For an example of what you can do with this, see
489 L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To Your SQL>.
490
491 Note that sqlt_deploy_hook is called by L</deployment_statements>, which in turn
492 is called before L</deploy>. Therefore the hook can be used only to manipulate
493 the L<SQL::Translator::Schema> object before it is turned into SQL fed to the
494 database. If you want to execute post-deploy statements which can not be generated
495 by L<SQL::Translator>, the currently suggested method is to overload L</deploy>
496 and use L<dbh_do|DBIx::Class::Storage::DBI/dbh_do>.
497
498 =head1 METHODS
499
500 =head2 connect
501
502 =over 4
503
504 =item Arguments: @connectinfo
505
506 =item Return Value: $new_schema
507
508 =back
509
510 Creates and returns a new Schema object. The connection info set on it
511 is used to create a new instance of the storage backend and set it on
512 the Schema object.
513
514 See L<DBIx::Class::Storage::DBI/"connect_info"> for DBI-specific
515 syntax on the C<@connectinfo> argument, or L<DBIx::Class::Storage> in
516 general.
517
518 Note that C<connect_info> expects an arrayref of arguments, but
519 C<connect> does not. C<connect> wraps its arguments in an arrayref
520 before passing them to C<connect_info>.
521
522 =head3 Overloading
523
524 C<connect> is a convenience method. It is equivalent to calling
525 $schema->clone->connection(@connectinfo). To write your own overloaded
526 version, overload L</connection> instead.
527
528 =cut
529
530 sub connect { shift->clone->connection(@_) }
531
532 =head2 resultset
533
534 =over 4
535
536 =item Arguments: $source_name
537
538 =item Return Value: $resultset
539
540 =back
541
542   my $rs = $schema->resultset('DVD');
543
544 Returns the L<DBIx::Class::ResultSet> object for the registered source
545 name.
546
547 =cut
548
549 sub resultset {
550   my ($self, $moniker) = @_;
551   $self->throw_exception('resultset() expects a source name')
552     unless defined $moniker;
553   return $self->source($moniker)->resultset;
554 }
555
556 =head2 sources
557
558 =over 4
559
560 =item Return Value: @source_names
561
562 =back
563
564   my @source_names = $schema->sources;
565
566 Lists names of all the sources registered on this Schema object.
567
568 =cut
569
570 sub sources { return keys %{shift->source_registrations}; }
571
572 =head2 source
573
574 =over 4
575
576 =item Arguments: $source_name
577
578 =item Return Value: $result_source
579
580 =back
581
582   my $source = $schema->source('Book');
583
584 Returns the L<DBIx::Class::ResultSource> object for the registered
585 source name.
586
587 =cut
588
589 sub source {
590   my $self = shift;
591
592   $self->throw_exception("source() expects a source name")
593     unless @_;
594
595   my $moniker = shift;
596
597   my $sreg = $self->source_registrations;
598   return $sreg->{$moniker} if exists $sreg->{$moniker};
599
600   # if we got here, they probably passed a full class name
601   my $mapped = $self->class_mappings->{$moniker};
602   $self->throw_exception("Can't find source for ${moniker}")
603     unless $mapped && exists $sreg->{$mapped};
604   return $sreg->{$mapped};
605 }
606
607 =head2 class
608
609 =over 4
610
611 =item Arguments: $source_name
612
613 =item Return Value: $classname
614
615 =back
616
617   my $class = $schema->class('CD');
618
619 Retrieves the Result class name for the given source name.
620
621 =cut
622
623 sub class {
624   my ($self, $moniker) = @_;
625   return $self->source($moniker)->result_class;
626 }
627
628 =head2 txn_do
629
630 =over 4
631
632 =item Arguments: C<$coderef>, @coderef_args?
633
634 =item Return Value: The return value of $coderef
635
636 =back
637
638 Executes C<$coderef> with (optional) arguments C<@coderef_args> atomically,
639 returning its result (if any). Equivalent to calling $schema->storage->txn_do.
640 See L<DBIx::Class::Storage/"txn_do"> for more information.
641
642 This interface is preferred over using the individual methods L</txn_begin>,
643 L</txn_commit>, and L</txn_rollback> below.
644
645 WARNING: If you are connected with C<< AutoCommit => 0 >> the transaction is
646 considered nested, and you will still need to call L</txn_commit> to write your
647 changes when appropriate. You will also want to connect with C<< auto_savepoint =>
648 1 >> to get partial rollback to work, if the storage driver for your database
649 supports it.
650
651 Connecting with C<< AutoCommit => 1 >> is recommended.
652
653 =cut
654
655 sub txn_do {
656   my $self = shift;
657
658   $self->storage or $self->throw_exception
659     ('txn_do called on $schema without storage');
660
661   $self->storage->txn_do(@_);
662 }
663
664 =head2 txn_scope_guard
665
666 Runs C<txn_scope_guard> on the schema's storage. See
667 L<DBIx::Class::Storage/txn_scope_guard>.
668
669 =cut
670
671 sub txn_scope_guard {
672   my $self = shift;
673
674   $self->storage or $self->throw_exception
675     ('txn_scope_guard called on $schema without storage');
676
677   $self->storage->txn_scope_guard(@_);
678 }
679
680 =head2 txn_begin
681
682 Begins a transaction (does nothing if AutoCommit is off). Equivalent to
683 calling $schema->storage->txn_begin. See
684 L<DBIx::Class::Storage/"txn_begin"> for more information.
685
686 =cut
687
688 sub txn_begin {
689   my $self = shift;
690
691   $self->storage or $self->throw_exception
692     ('txn_begin called on $schema without storage');
693
694   $self->storage->txn_begin;
695 }
696
697 =head2 txn_commit
698
699 Commits the current transaction. Equivalent to calling
700 $schema->storage->txn_commit. See L<DBIx::Class::Storage/"txn_commit">
701 for more information.
702
703 =cut
704
705 sub txn_commit {
706   my $self = shift;
707
708   $self->storage or $self->throw_exception
709     ('txn_commit called on $schema without storage');
710
711   $self->storage->txn_commit;
712 }
713
714 =head2 txn_rollback
715
716 Rolls back the current transaction. Equivalent to calling
717 $schema->storage->txn_rollback. See
718 L<DBIx::Class::Storage/"txn_rollback"> for more information.
719
720 =cut
721
722 sub txn_rollback {
723   my $self = shift;
724
725   $self->storage or $self->throw_exception
726     ('txn_rollback called on $schema without storage');
727
728   $self->storage->txn_rollback;
729 }
730
731 =head2 storage
732
733   my $storage = $schema->storage;
734
735 Returns the L<DBIx::Class::Storage> object for this Schema. Grab this
736 if you want to turn on SQL statement debugging at runtime, or set the
737 quote character. For the default storage, the documentation can be
738 found in L<DBIx::Class::Storage::DBI>.
739
740 =head2 populate
741
742 =over 4
743
744 =item Arguments: $source_name, \@data;
745
746 =item Return value: \@$objects | nothing
747
748 =back
749
750 Pass this method a resultsource name, and an arrayref of
751 arrayrefs. The arrayrefs should contain a list of column names,
752 followed by one or many sets of matching data for the given columns.
753
754 In void context, C<insert_bulk> in L<DBIx::Class::Storage::DBI> is used
755 to insert the data, as this is a fast method. However, insert_bulk currently
756 assumes that your datasets all contain the same type of values, using scalar
757 references in a column in one row, and not in another will probably not work.
758
759 Otherwise, each set of data is inserted into the database using
760 L<DBIx::Class::ResultSet/create>, and a arrayref of the resulting row
761 objects is returned.
762
763 e.g.
764
765   $schema->populate('Artist', [
766     [ qw/artistid name/ ],
767     [ 1, 'Popular Band' ],
768     [ 2, 'Indie Band' ],
769     ...
770   ]);
771
772 Since wantarray context is basically the same as looping over $rs->create(...)
773 you won't see any performance benefits and in this case the method is more for
774 convenience. Void context sends the column information directly to storage
775 using <DBI>s bulk insert method. So the performance will be much better for
776 storages that support this method.
777
778 Because of this difference in the way void context inserts rows into your
779 database you need to note how this will effect any loaded components that
780 override or augment insert.  For example if you are using a component such
781 as L<DBIx::Class::UUIDColumns> to populate your primary keys you MUST use
782 wantarray context if you want the PKs automatically created.
783
784 =cut
785
786 sub populate {
787   my ($self, $name, $data) = @_;
788   if(my $rs = $self->resultset($name)) {
789     if(defined wantarray) {
790         return $rs->populate($data);
791     } else {
792         $rs->populate($data);
793     }
794   } else {
795       $self->throw_exception("$name is not a resultset");
796   }
797 }
798
799 =head2 connection
800
801 =over 4
802
803 =item Arguments: @args
804
805 =item Return Value: $new_schema
806
807 =back
808
809 Similar to L</connect> except sets the storage object and connection
810 data in-place on the Schema class. You should probably be calling
811 L</connect> to get a proper Schema object instead.
812
813 =head3 Overloading
814
815 Overload C<connection> to change the behaviour of C<connect>.
816
817 =cut
818
819 sub connection {
820   my ($self, @info) = @_;
821   return $self if !@info && $self->storage;
822
823   my ($storage_class, $args) = ref $self->storage_type ?
824     ($self->_normalize_storage_type($self->storage_type),{}) : ($self->storage_type, {});
825
826   $storage_class = 'DBIx::Class::Storage'.$storage_class
827     if $storage_class =~ m/^::/;
828   try {
829     $self->ensure_class_loaded ($storage_class);
830   }
831   catch {
832     $self->throw_exception(
833       "No arguments to load_classes and couldn't load ${storage_class} ($_)"
834     );
835   };
836   my $storage = $storage_class->new($self=>$args);
837   $storage->connect_info(\@info);
838   $self->storage($storage);
839   return $self;
840 }
841
842 sub _normalize_storage_type {
843   my ($self, $storage_type) = @_;
844   if(ref $storage_type eq 'ARRAY') {
845     return @$storage_type;
846   } elsif(ref $storage_type eq 'HASH') {
847     return %$storage_type;
848   } else {
849     $self->throw_exception('Unsupported REFTYPE given: '. ref $storage_type);
850   }
851 }
852
853 =head2 compose_namespace
854
855 =over 4
856
857 =item Arguments: $target_namespace, $additional_base_class?
858
859 =item Retur Value: $new_schema
860
861 =back
862
863 For each L<DBIx::Class::ResultSource> in the schema, this method creates a
864 class in the target namespace (e.g. $target_namespace::CD,
865 $target_namespace::Artist) that inherits from the corresponding classes
866 attached to the current schema.
867
868 It also attaches a corresponding L<DBIx::Class::ResultSource> object to the
869 new $schema object. If C<$additional_base_class> is given, the new composed
870 classes will inherit from first the corresponding class from the current
871 schema then the base class.
872
873 For example, for a schema with My::Schema::CD and My::Schema::Artist classes,
874
875   $schema->compose_namespace('My::DB', 'Base::Class');
876   print join (', ', @My::DB::CD::ISA) . "\n";
877   print join (', ', @My::DB::Artist::ISA) ."\n";
878
879 will produce the output
880
881   My::Schema::CD, Base::Class
882   My::Schema::Artist, Base::Class
883
884 =cut
885
886 # this might be oversimplified
887 # sub compose_namespace {
888 #   my ($self, $target, $base) = @_;
889
890 #   my $schema = $self->clone;
891 #   foreach my $moniker ($schema->sources) {
892 #     my $source = $schema->source($moniker);
893 #     my $target_class = "${target}::${moniker}";
894 #     $self->inject_base(
895 #       $target_class => $source->result_class, ($base ? $base : ())
896 #     );
897 #     $source->result_class($target_class);
898 #     $target_class->result_source_instance($source)
899 #       if $target_class->can('result_source_instance');
900 #     $schema->register_source($moniker, $source);
901 #   }
902 #   return $schema;
903 # }
904
905 sub compose_namespace {
906   my ($self, $target, $base) = @_;
907   my $schema = $self->clone;
908   {
909     no warnings qw/redefine/;
910     no strict qw/refs/;
911 #    local *Class::C3::reinitialize = sub { };
912     foreach my $moniker ($schema->sources) {
913       my $source = $schema->source($moniker);
914       my $target_class = "${target}::${moniker}";
915       $self->inject_base(
916         $target_class => $source->result_class, ($base ? $base : ())
917       );
918       $source->result_class($target_class);
919       if ($target_class->can('result_source_instance')) {
920
921         # since the newly created classes are registered only with
922         # the instance of $schema, it should be safe to weaken
923         # the ref (it will GC when $schema is destroyed)
924         $target_class->result_source_instance($source);
925         weaken ${"${target_class}::__cag_result_source_instance"};
926       }
927      $schema->register_source($moniker, $source);
928     }
929   }
930 #  Class::C3->reinitialize();
931   {
932     no strict 'refs';
933     no warnings 'redefine';
934     foreach my $meth (qw/class source resultset/) {
935       *{"${target}::${meth}"} = subname "${target}::${meth}" =>
936         sub { shift->schema->$meth(@_) };
937     }
938   }
939   return $schema;
940 }
941
942 sub setup_connection_class {
943   my ($class, $target, @info) = @_;
944   $class->inject_base($target => 'DBIx::Class::DB');
945   #$target->load_components('DB');
946   $target->connection(@info);
947 }
948
949 =head2 svp_begin
950
951 Creates a new savepoint (does nothing outside a transaction).
952 Equivalent to calling $schema->storage->svp_begin.  See
953 L<DBIx::Class::Storage/"svp_begin"> for more information.
954
955 =cut
956
957 sub svp_begin {
958   my ($self, $name) = @_;
959
960   $self->storage or $self->throw_exception
961     ('svp_begin called on $schema without storage');
962
963   $self->storage->svp_begin($name);
964 }
965
966 =head2 svp_release
967
968 Releases a savepoint (does nothing outside a transaction).
969 Equivalent to calling $schema->storage->svp_release.  See
970 L<DBIx::Class::Storage/"svp_release"> for more information.
971
972 =cut
973
974 sub svp_release {
975   my ($self, $name) = @_;
976
977   $self->storage or $self->throw_exception
978     ('svp_release called on $schema without storage');
979
980   $self->storage->svp_release($name);
981 }
982
983 =head2 svp_rollback
984
985 Rollback to a savepoint (does nothing outside a transaction).
986 Equivalent to calling $schema->storage->svp_rollback.  See
987 L<DBIx::Class::Storage/"svp_rollback"> for more information.
988
989 =cut
990
991 sub svp_rollback {
992   my ($self, $name) = @_;
993
994   $self->storage or $self->throw_exception
995     ('svp_rollback called on $schema without storage');
996
997   $self->storage->svp_rollback($name);
998 }
999
1000 =head2 clone
1001
1002 =over 4
1003
1004 =item Return Value: $new_schema
1005
1006 =back
1007
1008 Clones the schema and its associated result_source objects and returns the
1009 copy.
1010
1011 =cut
1012
1013 sub clone {
1014   my ($self) = @_;
1015   my $clone = { (ref $self ? %$self : ()) };
1016   bless $clone, (ref $self || $self);
1017
1018   $clone->class_mappings({ %{$clone->class_mappings} });
1019   $clone->source_registrations({ %{$clone->source_registrations} });
1020   foreach my $moniker ($self->sources) {
1021     my $source = $self->source($moniker);
1022     my $new = $source->new($source);
1023     # we use extra here as we want to leave the class_mappings as they are
1024     # but overwrite the source_registrations entry with the new source
1025     $clone->register_extra_source($moniker => $new);
1026   }
1027   $clone->storage->set_schema($clone) if $clone->storage;
1028   return $clone;
1029 }
1030
1031 =head2 throw_exception
1032
1033 =over 4
1034
1035 =item Arguments: $message
1036
1037 =back
1038
1039 Throws an exception. Defaults to using L<Carp::Clan> to report errors from
1040 user's perspective.  See L</exception_action> for details on overriding
1041 this method's behavior.  If L</stacktrace> is turned on, C<throw_exception>'s
1042 default behavior will provide a detailed stack trace.
1043
1044 =cut
1045
1046 my $false_exception_action_warned;
1047 sub throw_exception {
1048   my $self = shift;
1049
1050   if (my $act = $self->exception_action) {
1051     if ($act->(@_)) {
1052       DBIx::Class::Exception->throw(
1053           "Invocation of the exception_action handler installed on $self did *not*"
1054         .' result in an exception. DBIx::Class is unable to function without a reliable'
1055         .' exception mechanism, ensure that exception_action does not hide exceptions'
1056         ." (original error: $_[0])"
1057       );
1058     }
1059     elsif(! $false_exception_action_warned++) {
1060       carp (
1061           "The exception_action handler installed on $self returned false instead"
1062         .' of throwing an exception. This behavior has been deprecated, adjust your'
1063         .' handler to always rethrow the supplied error.'
1064       );
1065     }
1066   }
1067
1068   DBIx::Class::Exception->throw($_[0], $self->stacktrace);
1069 }
1070
1071 =head2 deploy
1072
1073 =over 4
1074
1075 =item Arguments: \%sqlt_args, $dir
1076
1077 =back
1078
1079 Attempts to deploy the schema to the current storage using L<SQL::Translator>.
1080
1081 See L<SQL::Translator/METHODS> for a list of values for C<\%sqlt_args>.
1082 The most common value for this would be C<< { add_drop_table => 1 } >>
1083 to have the SQL produced include a C<DROP TABLE> statement for each table
1084 created. For quoting purposes supply C<quote_table_names> and
1085 C<quote_field_names>.
1086
1087 Additionally, the DBIx::Class parser accepts a C<sources> parameter as a hash
1088 ref or an array ref, containing a list of source to deploy. If present, then
1089 only the sources listed will get deployed. Furthermore, you can use the
1090 C<add_fk_index> parser parameter to prevent the parser from creating an index for each
1091 FK.
1092
1093 =cut
1094
1095 sub deploy {
1096   my ($self, $sqltargs, $dir) = @_;
1097   $self->throw_exception("Can't deploy without storage") unless $self->storage;
1098   $self->storage->deploy($self, undef, $sqltargs, $dir);
1099 }
1100
1101 =head2 deployment_statements
1102
1103 =over 4
1104
1105 =item Arguments: See L<DBIx::Class::Storage::DBI/deployment_statements>
1106
1107 =item Return value: $listofstatements
1108
1109 =back
1110
1111 A convenient shortcut to
1112 C<< $self->storage->deployment_statements($self, @args) >>.
1113 Returns the SQL statements used by L</deploy> and
1114 L<DBIx::Class::Schema::Storage/deploy>.
1115
1116 =cut
1117
1118 sub deployment_statements {
1119   my $self = shift;
1120
1121   $self->throw_exception("Can't generate deployment statements without a storage")
1122     if not $self->storage;
1123
1124   $self->storage->deployment_statements($self, @_);
1125 }
1126
1127 =head2 create_ddl_dir
1128
1129 =over 4
1130
1131 =item Arguments: See L<DBIx::Class::Storage::DBI/create_ddl_dir>
1132
1133 =back
1134
1135 A convenient shortcut to
1136 C<< $self->storage->create_ddl_dir($self, @args) >>.
1137
1138 Creates an SQL file based on the Schema, for each of the specified
1139 database types, in the given directory.
1140
1141 =cut
1142
1143 sub create_ddl_dir {
1144   my $self = shift;
1145
1146   $self->throw_exception("Can't create_ddl_dir without storage") unless $self->storage;
1147   $self->storage->create_ddl_dir($self, @_);
1148 }
1149
1150 =head2 ddl_filename
1151
1152 =over 4
1153
1154 =item Arguments: $database-type, $version, $directory, $preversion
1155
1156 =item Return value: $normalised_filename
1157
1158 =back
1159
1160   my $filename = $table->ddl_filename($type, $version, $dir, $preversion)
1161
1162 This method is called by C<create_ddl_dir> to compose a file name out of
1163 the supplied directory, database type and version number. The default file
1164 name format is: C<$dir$schema-$version-$type.sql>.
1165
1166 You may override this method in your schema if you wish to use a different
1167 format.
1168
1169  WARNING
1170
1171  Prior to DBIx::Class version 0.08100 this method had a different signature:
1172
1173     my $filename = $table->ddl_filename($type, $dir, $version, $preversion)
1174
1175  In recent versions variables $dir and $version were reversed in order to
1176  bring the signature in line with other Schema/Storage methods. If you
1177  really need to maintain backward compatibility, you can do the following
1178  in any overriding methods:
1179
1180     ($dir, $version) = ($version, $dir) if ($DBIx::Class::VERSION < 0.08100);
1181
1182 =cut
1183
1184 sub ddl_filename {
1185   my ($self, $type, $version, $dir, $preversion) = @_;
1186
1187   my $filename = ref($self);
1188   $filename =~ s/::/-/g;
1189   $filename = File::Spec->catfile($dir, "$filename-$version-$type.sql");
1190   $filename =~ s/$version/$preversion-$version/ if($preversion);
1191
1192   return $filename;
1193 }
1194
1195 =head2 thaw
1196
1197 Provided as the recommended way of thawing schema objects. You can call
1198 C<Storable::thaw> directly if you wish, but the thawed objects will not have a
1199 reference to any schema, so are rather useless.
1200
1201 =cut
1202
1203 sub thaw {
1204   my ($self, $obj) = @_;
1205   local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1206   return Storable::thaw($obj);
1207 }
1208
1209 =head2 freeze
1210
1211 This doesn't actually do anything more than call L<Storable/nfreeze>, it is just
1212 provided here for symmetry.
1213
1214 =cut
1215
1216 sub freeze {
1217   return Storable::nfreeze($_[1]);
1218 }
1219
1220 =head2 dclone
1221
1222 =over 4
1223
1224 =item Arguments: $object
1225
1226 =item Return Value: dcloned $object
1227
1228 =back
1229
1230 Recommended way of dcloning L<DBIx::Class::Row> and L<DBIx::Class::ResultSet>
1231 objects so their references to the schema object
1232 (which itself is B<not> cloned) are properly maintained.
1233
1234 =cut
1235
1236 sub dclone {
1237   my ($self, $obj) = @_;
1238   local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1239   return Storable::dclone($obj);
1240 }
1241
1242 =head2 schema_version
1243
1244 Returns the current schema class' $VERSION in a normalised way.
1245
1246 =cut
1247
1248 sub schema_version {
1249   my ($self) = @_;
1250   my $class = ref($self)||$self;
1251
1252   # does -not- use $schema->VERSION
1253   # since that varies in results depending on if version.pm is installed, and if
1254   # so the perl or XS versions. If you want this to change, bug the version.pm
1255   # author to make vpp and vxs behave the same.
1256
1257   my $version;
1258   {
1259     no strict 'refs';
1260     $version = ${"${class}::VERSION"};
1261   }
1262   return $version;
1263 }
1264
1265
1266 =head2 register_class
1267
1268 =over 4
1269
1270 =item Arguments: $moniker, $component_class
1271
1272 =back
1273
1274 This method is called by L</load_namespaces> and L</load_classes> to install the found classes into your Schema. You should be using those instead of this one.
1275
1276 You will only need this method if you have your Result classes in
1277 files which are not named after the packages (or all in the same
1278 file). You may also need it to register classes at runtime.
1279
1280 Registers a class which isa DBIx::Class::ResultSourceProxy. Equivalent to
1281 calling:
1282
1283   $schema->register_source($moniker, $component_class->result_source_instance);
1284
1285 =cut
1286
1287 sub register_class {
1288   my ($self, $moniker, $to_register) = @_;
1289   $self->register_source($moniker => $to_register->result_source_instance);
1290 }
1291
1292 =head2 register_source
1293
1294 =over 4
1295
1296 =item Arguments: $moniker, $result_source
1297
1298 =back
1299
1300 This method is called by L</register_class>.
1301
1302 Registers the L<DBIx::Class::ResultSource> in the schema with the given
1303 moniker.
1304
1305 =cut
1306
1307 sub register_source {
1308   my $self = shift;
1309
1310   $self->_register_source(@_);
1311 }
1312
1313 =head2 unregister_source
1314
1315 =over 4
1316
1317 =item Arguments: $moniker
1318
1319 =back
1320
1321 Removes the L<DBIx::Class::ResultSource> from the schema for the given moniker.
1322
1323 =cut
1324
1325 sub unregister_source {
1326   my $self = shift;
1327
1328   $self->_unregister_source(@_);
1329 }
1330
1331 =head2 register_extra_source
1332
1333 =over 4
1334
1335 =item Arguments: $moniker, $result_source
1336
1337 =back
1338
1339 As L</register_source> but should be used if the result class already
1340 has a source and you want to register an extra one.
1341
1342 =cut
1343
1344 sub register_extra_source {
1345   my $self = shift;
1346
1347   $self->_register_source(@_, { extra => 1 });
1348 }
1349
1350 sub _register_source {
1351   my ($self, $moniker, $source, $params) = @_;
1352
1353   my $orig_source = $source;
1354
1355   $source = $source->new({ %$source, source_name => $moniker });
1356   $source->schema($self);
1357   weaken $source->{schema} if ref($self);
1358
1359   my $rs_class = $source->result_class;
1360
1361   my %reg = %{$self->source_registrations};
1362   $reg{$moniker} = $source;
1363   $self->source_registrations(\%reg);
1364
1365   return if ($params->{extra});
1366   return unless defined($rs_class) && $rs_class->can('result_source_instance');
1367
1368   my %map = %{$self->class_mappings};
1369   if (
1370     exists $map{$rs_class}
1371       and
1372     $map{$rs_class} ne $moniker
1373       and
1374     $rs_class->result_source_instance ne $orig_source
1375   ) {
1376     carp "$rs_class already has a source, use register_extra_source for additional sources";
1377   }
1378   $map{$rs_class} = $moniker;
1379   $self->class_mappings(\%map);
1380 }
1381
1382 {
1383   my $global_phase_destroy;
1384
1385   END { $global_phase_destroy++ }
1386
1387   sub DESTROY {
1388     return if $global_phase_destroy;
1389
1390     my $self = shift;
1391     my $srcs = $self->source_registrations;
1392
1393     for my $moniker (keys %$srcs) {
1394       # find first source that is not about to be GCed (someone other than $self
1395       # holds a reference to it) and reattach to it, weakening our own link
1396       if (ref $srcs->{$moniker} and svref_2object($srcs->{$moniker})->REFCNT > 1) {
1397         $srcs->{$moniker}->schema($self);
1398         weaken $srcs->{$moniker};
1399         last;
1400       }
1401     }
1402   }
1403 }
1404
1405 sub _unregister_source {
1406     my ($self, $moniker) = @_;
1407     my %reg = %{$self->source_registrations};
1408
1409     my $source = delete $reg{$moniker};
1410     $self->source_registrations(\%reg);
1411     if ($source->result_class) {
1412         my %map = %{$self->class_mappings};
1413         delete $map{$source->result_class};
1414         $self->class_mappings(\%map);
1415     }
1416 }
1417
1418
1419 =head2 compose_connection (DEPRECATED)
1420
1421 =over 4
1422
1423 =item Arguments: $target_namespace, @db_info
1424
1425 =item Return Value: $new_schema
1426
1427 =back
1428
1429 DEPRECATED. You probably wanted compose_namespace.
1430
1431 Actually, you probably just wanted to call connect.
1432
1433 =begin hidden
1434
1435 (hidden due to deprecation)
1436
1437 Calls L<DBIx::Class::Schema/"compose_namespace"> to the target namespace,
1438 calls L<DBIx::Class::Schema/connection> with @db_info on the new schema,
1439 then injects the L<DBix::Class::ResultSetProxy> component and a
1440 resultset_instance classdata entry on all the new classes, in order to support
1441 $target_namespaces::$class->search(...) method calls.
1442
1443 This is primarily useful when you have a specific need for class method access
1444 to a connection. In normal usage it is preferred to call
1445 L<DBIx::Class::Schema/connect> and use the resulting schema object to operate
1446 on L<DBIx::Class::ResultSet> objects with L<DBIx::Class::Schema/resultset> for
1447 more information.
1448
1449 =end hidden
1450
1451 =cut
1452
1453 {
1454   my $warn;
1455
1456   sub compose_connection {
1457     my ($self, $target, @info) = @_;
1458
1459     carp "compose_connection deprecated as of 0.08000"
1460       unless ($INC{"DBIx/Class/CDBICompat.pm"} || $warn++);
1461
1462     my $base = 'DBIx::Class::ResultSetProxy';
1463     try {
1464       eval "require ${base};"
1465     }
1466     catch {
1467       $self->throw_exception
1468         ("No arguments to load_classes and couldn't load ${base} ($_)")
1469     };
1470
1471     if ($self eq $target) {
1472       # Pathological case, largely caused by the docs on early C::M::DBIC::Plain
1473       foreach my $moniker ($self->sources) {
1474         my $source = $self->source($moniker);
1475         my $class = $source->result_class;
1476         $self->inject_base($class, $base);
1477         $class->mk_classdata(resultset_instance => $source->resultset);
1478         $class->mk_classdata(class_resolver => $self);
1479       }
1480       $self->connection(@info);
1481       return $self;
1482     }
1483
1484     my $schema = $self->compose_namespace($target, $base);
1485     {
1486       no strict 'refs';
1487       my $name = join '::', $target, 'schema';
1488       *$name = subname $name, sub { $schema };
1489     }
1490
1491     $schema->connection(@info);
1492     foreach my $moniker ($schema->sources) {
1493       my $source = $schema->source($moniker);
1494       my $class = $source->result_class;
1495       #warn "$moniker $class $source ".$source->storage;
1496       $class->mk_classdata(result_source_instance => $source);
1497       $class->mk_classdata(resultset_instance => $source->resultset);
1498       $class->mk_classdata(class_resolver => $schema);
1499     }
1500     return $schema;
1501   }
1502 }
1503
1504 1;
1505
1506 =head1 AUTHORS
1507
1508 Matt S. Trout <mst@shadowcatsystems.co.uk>
1509
1510 =head1 LICENSE
1511
1512 You may distribute this code under the same terms as Perl itself.
1513
1514 =cut