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