Fix some pessimizations spotted here and there (no functional changes)
[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: L<$source_name|DBIx::Class::ResultSource/source_name>
534
535 =item Return Value: L<$resultset|DBIx::Class::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, $source_name) = @_;
548   $self->throw_exception('resultset() expects a source name')
549     unless defined $source_name;
550   return $self->source($source_name)->resultset;
551 }
552
553 =head2 sources
554
555 =over 4
556
557 =item Return Value: L<@source_names|DBIx::Class::ResultSource/source_name>
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: L<$source_name|DBIx::Class::ResultSource/source_name>
574
575 =item Return Value: L<$result_source|DBIx::Class::ResultSource>
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 $source_name = shift;
593
594   my $sreg = $self->source_registrations;
595   return $sreg->{$source_name} if exists $sreg->{$source_name};
596
597   # if we got here, they probably passed a full class name
598   my $mapped = $self->class_mappings->{$source_name};
599   $self->throw_exception("Can't find source for ${source_name}")
600     unless $mapped && exists $sreg->{$mapped};
601   return $sreg->{$mapped};
602 }
603
604 =head2 class
605
606 =over 4
607
608 =item Arguments: L<$source_name|DBIx::Class::ResultSource/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   return shift->source(shift)->result_class;
622 }
623
624 =head2 txn_do
625
626 =over 4
627
628 =item Arguments: C<$coderef>, @coderef_args?
629
630 =item Return Value: The return value of $coderef
631
632 =back
633
634 Executes C<$coderef> with (optional) arguments C<@coderef_args> atomically,
635 returning its result (if any). Equivalent to calling $schema->storage->txn_do.
636 See L<DBIx::Class::Storage/"txn_do"> for more information.
637
638 This interface is preferred over using the individual methods L</txn_begin>,
639 L</txn_commit>, and L</txn_rollback> below.
640
641 WARNING: If you are connected with C<< AutoCommit => 0 >> the transaction is
642 considered nested, and you will still need to call L</txn_commit> to write your
643 changes when appropriate. You will also want to connect with C<< auto_savepoint =>
644 1 >> to get partial rollback to work, if the storage driver for your database
645 supports it.
646
647 Connecting with C<< AutoCommit => 1 >> is recommended.
648
649 =cut
650
651 sub txn_do {
652   my $self = shift;
653
654   $self->storage or $self->throw_exception
655     ('txn_do called on $schema without storage');
656
657   $self->storage->txn_do(@_);
658 }
659
660 =head2 txn_scope_guard
661
662 Runs C<txn_scope_guard> on the schema's storage. See
663 L<DBIx::Class::Storage/txn_scope_guard>.
664
665 =cut
666
667 sub txn_scope_guard {
668   my $self = shift;
669
670   $self->storage or $self->throw_exception
671     ('txn_scope_guard called on $schema without storage');
672
673   $self->storage->txn_scope_guard(@_);
674 }
675
676 =head2 txn_begin
677
678 Begins a transaction (does nothing if AutoCommit is off). Equivalent to
679 calling $schema->storage->txn_begin. See
680 L<DBIx::Class::Storage/"txn_begin"> for more information.
681
682 =cut
683
684 sub txn_begin {
685   my $self = shift;
686
687   $self->storage or $self->throw_exception
688     ('txn_begin called on $schema without storage');
689
690   $self->storage->txn_begin;
691 }
692
693 =head2 txn_commit
694
695 Commits the current transaction. Equivalent to calling
696 $schema->storage->txn_commit. See L<DBIx::Class::Storage/"txn_commit">
697 for more information.
698
699 =cut
700
701 sub txn_commit {
702   my $self = shift;
703
704   $self->storage or $self->throw_exception
705     ('txn_commit called on $schema without storage');
706
707   $self->storage->txn_commit;
708 }
709
710 =head2 txn_rollback
711
712 Rolls back the current transaction. Equivalent to calling
713 $schema->storage->txn_rollback. See
714 L<DBIx::Class::Storage/"txn_rollback"> for more information.
715
716 =cut
717
718 sub txn_rollback {
719   my $self = shift;
720
721   $self->storage or $self->throw_exception
722     ('txn_rollback called on $schema without storage');
723
724   $self->storage->txn_rollback;
725 }
726
727 =head2 storage
728
729   my $storage = $schema->storage;
730
731 Returns the L<DBIx::Class::Storage> object for this Schema. Grab this
732 if you want to turn on SQL statement debugging at runtime, or set the
733 quote character. For the default storage, the documentation can be
734 found in L<DBIx::Class::Storage::DBI>.
735
736 =head2 populate
737
738 =over 4
739
740 =item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name>, [ \@column_list, \@row_values+ ] | [ \%col_data+ ]
741
742 =item Return Value: L<\@result_objects|DBIx::Class::Manual::ResultClass> (scalar context) | L<@result_objects|DBIx::Class::Manual::ResultClass> (list context)
743
744 =back
745
746 A convenience shortcut to L<DBIx::Class::ResultSet/populate>. Equivalent to:
747
748  $schema->resultset($source_name)->populate([...]);
749
750 =over 4
751
752 =item NOTE
753
754 The context of this method call has an important effect on what is
755 submitted to storage. In void context data is fed directly to fastpath
756 insertion routines provided by the underlying storage (most often
757 L<DBI/execute_for_fetch>), bypassing the L<new|DBIx::Class::Row/new> and
758 L<insert|DBIx::Class::Row/insert> calls on the
759 L<Result|DBIx::Class::Manual::ResultClass> class, including any
760 augmentation of these methods provided by components. For example if you
761 are using something like L<DBIx::Class::UUIDColumns> to create primary
762 keys for you, you will find that your PKs are empty.  In this case you
763 will have to explicitly force scalar or list context in order to create
764 those values.
765
766 =back
767
768 =cut
769
770 sub populate {
771   my ($self, $name, $data) = @_;
772   my $rs = $self->resultset($name)
773     or $self->throw_exception("'$name' is not a resultset");
774
775   return $rs->populate($data);
776 }
777
778 =head2 connection
779
780 =over 4
781
782 =item Arguments: @args
783
784 =item Return Value: $new_schema
785
786 =back
787
788 Similar to L</connect> except sets the storage object and connection
789 data in-place on the Schema class. You should probably be calling
790 L</connect> to get a proper Schema object instead.
791
792 =head3 Overloading
793
794 Overload C<connection> to change the behaviour of C<connect>.
795
796 =cut
797
798 sub connection {
799   my ($self, @info) = @_;
800   return $self if !@info && $self->storage;
801
802   my ($storage_class, $args) = ref $self->storage_type ?
803     ($self->_normalize_storage_type($self->storage_type),{}) : ($self->storage_type, {});
804
805   $storage_class = 'DBIx::Class::Storage'.$storage_class
806     if $storage_class =~ m/^::/;
807   try {
808     $self->ensure_class_loaded ($storage_class);
809   }
810   catch {
811     $self->throw_exception(
812       "Unable to load storage class ${storage_class}: $_"
813     );
814   };
815   my $storage = $storage_class->new($self=>$args);
816   $storage->connect_info(\@info);
817   $self->storage($storage);
818   return $self;
819 }
820
821 sub _normalize_storage_type {
822   my ($self, $storage_type) = @_;
823   if(ref $storage_type eq 'ARRAY') {
824     return @$storage_type;
825   } elsif(ref $storage_type eq 'HASH') {
826     return %$storage_type;
827   } else {
828     $self->throw_exception('Unsupported REFTYPE given: '. ref $storage_type);
829   }
830 }
831
832 =head2 compose_namespace
833
834 =over 4
835
836 =item Arguments: $target_namespace, $additional_base_class?
837
838 =item Retur Value: $new_schema
839
840 =back
841
842 For each L<DBIx::Class::ResultSource> in the schema, this method creates a
843 class in the target namespace (e.g. $target_namespace::CD,
844 $target_namespace::Artist) that inherits from the corresponding classes
845 attached to the current schema.
846
847 It also attaches a corresponding L<DBIx::Class::ResultSource> object to the
848 new $schema object. If C<$additional_base_class> is given, the new composed
849 classes will inherit from first the corresponding class from the current
850 schema then the base class.
851
852 For example, for a schema with My::Schema::CD and My::Schema::Artist classes,
853
854   $schema->compose_namespace('My::DB', 'Base::Class');
855   print join (', ', @My::DB::CD::ISA) . "\n";
856   print join (', ', @My::DB::Artist::ISA) ."\n";
857
858 will produce the output
859
860   My::Schema::CD, Base::Class
861   My::Schema::Artist, Base::Class
862
863 =cut
864
865 # this might be oversimplified
866 # sub compose_namespace {
867 #   my ($self, $target, $base) = @_;
868
869 #   my $schema = $self->clone;
870 #   foreach my $source_name ($schema->sources) {
871 #     my $source = $schema->source($source_name);
872 #     my $target_class = "${target}::${source_name}";
873 #     $self->inject_base(
874 #       $target_class => $source->result_class, ($base ? $base : ())
875 #     );
876 #     $source->result_class($target_class);
877 #     $target_class->result_source_instance($source)
878 #       if $target_class->can('result_source_instance');
879 #     $schema->register_source($source_name, $source);
880 #   }
881 #   return $schema;
882 # }
883
884 sub compose_namespace {
885   my ($self, $target, $base) = @_;
886
887   my $schema = $self->clone;
888
889   $schema->source_registrations({});
890
891   # the original class-mappings must remain - otherwise
892   # reverse_relationship_info will not work
893   #$schema->class_mappings({});
894
895   {
896     no warnings qw/redefine/;
897     local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
898     use warnings qw/redefine/;
899
900     no strict qw/refs/;
901     foreach my $source_name ($self->sources) {
902       my $orig_source = $self->source($source_name);
903
904       my $target_class = "${target}::${source_name}";
905       $self->inject_base($target_class, $orig_source->result_class, ($base || ()) );
906
907       # register_source examines result_class, and then returns us a clone
908       my $new_source = $schema->register_source($source_name, bless
909         { %$orig_source, result_class => $target_class },
910         ref $orig_source,
911       );
912
913       if ($target_class->can('result_source_instance')) {
914         # give the class a schema-less source copy
915         $target_class->result_source_instance( bless
916           { %$new_source, schema => ref $new_source->{schema} || $new_source->{schema} },
917           ref $new_source,
918         );
919       }
920     }
921
922     foreach my $meth (qw/class source resultset/) {
923       no warnings 'redefine';
924       *{"${target}::${meth}"} = subname "${target}::${meth}" =>
925         sub { shift->schema->$meth(@_) };
926     }
927   }
928
929   Class::C3->reinitialize() if DBIx::Class::_ENV_::OLD_MRO;
930
931   return $schema;
932 }
933
934 sub setup_connection_class {
935   my ($class, $target, @info) = @_;
936   $class->inject_base($target => 'DBIx::Class::DB');
937   #$target->load_components('DB');
938   $target->connection(@info);
939 }
940
941 =head2 svp_begin
942
943 Creates a new savepoint (does nothing outside a transaction).
944 Equivalent to calling $schema->storage->svp_begin.  See
945 L<DBIx::Class::Storage/"svp_begin"> for more information.
946
947 =cut
948
949 sub svp_begin {
950   my ($self, $name) = @_;
951
952   $self->storage or $self->throw_exception
953     ('svp_begin called on $schema without storage');
954
955   $self->storage->svp_begin($name);
956 }
957
958 =head2 svp_release
959
960 Releases a savepoint (does nothing outside a transaction).
961 Equivalent to calling $schema->storage->svp_release.  See
962 L<DBIx::Class::Storage/"svp_release"> for more information.
963
964 =cut
965
966 sub svp_release {
967   my ($self, $name) = @_;
968
969   $self->storage or $self->throw_exception
970     ('svp_release called on $schema without storage');
971
972   $self->storage->svp_release($name);
973 }
974
975 =head2 svp_rollback
976
977 Rollback to a savepoint (does nothing outside a transaction).
978 Equivalent to calling $schema->storage->svp_rollback.  See
979 L<DBIx::Class::Storage/"svp_rollback"> for more information.
980
981 =cut
982
983 sub svp_rollback {
984   my ($self, $name) = @_;
985
986   $self->storage or $self->throw_exception
987     ('svp_rollback called on $schema without storage');
988
989   $self->storage->svp_rollback($name);
990 }
991
992 =head2 clone
993
994 =over 4
995
996 =item Arguments: %attrs?
997
998 =item Return Value: $new_schema
999
1000 =back
1001
1002 Clones the schema and its associated result_source objects and returns the
1003 copy. The resulting copy will have the same attributes as the source schema,
1004 except for those attributes explicitly overriden by the provided C<%attrs>.
1005
1006 =cut
1007
1008 sub clone {
1009   my $self = shift;
1010
1011   my $clone = {
1012       (ref $self ? %$self : ()),
1013       (@_ == 1 && ref $_[0] eq 'HASH' ? %{ $_[0] } : @_),
1014   };
1015   bless $clone, (ref $self || $self);
1016
1017   $clone->$_(undef) for qw/class_mappings source_registrations storage/;
1018
1019   $clone->_copy_state_from($self);
1020
1021   return $clone;
1022 }
1023
1024 # Needed in Schema::Loader - if you refactor, please make a compatibility shim
1025 # -- Caelum
1026 sub _copy_state_from {
1027   my ($self, $from) = @_;
1028
1029   $self->class_mappings({ %{$from->class_mappings} });
1030   $self->source_registrations({ %{$from->source_registrations} });
1031
1032   foreach my $source_name ($from->sources) {
1033     my $source = $from->source($source_name);
1034     my $new = $source->new($source);
1035     # we use extra here as we want to leave the class_mappings as they are
1036     # but overwrite the source_registrations entry with the new source
1037     $self->register_extra_source($source_name => $new);
1038   }
1039
1040   if ($from->storage) {
1041     $self->storage($from->storage);
1042     $self->storage->set_schema($self);
1043   }
1044 }
1045
1046 =head2 throw_exception
1047
1048 =over 4
1049
1050 =item Arguments: $message
1051
1052 =back
1053
1054 Throws an exception. Obeys the exemption rules of L<DBIx::Class::Carp> to report
1055 errors from outer-user's perspective. See L</exception_action> for details on overriding
1056 this method's behavior.  If L</stacktrace> is turned on, C<throw_exception>'s
1057 default behavior will provide a detailed stack trace.
1058
1059 =cut
1060
1061 my $false_exception_action_warned;
1062 sub throw_exception {
1063   my $self = shift;
1064
1065   if (my $act = $self->exception_action) {
1066     if ($act->(@_)) {
1067       DBIx::Class::Exception->throw(
1068           "Invocation of the exception_action handler installed on $self did *not*"
1069         .' result in an exception. DBIx::Class is unable to function without a reliable'
1070         .' exception mechanism, ensure that exception_action does not hide exceptions'
1071         ." (original error: $_[0])"
1072       );
1073     }
1074     elsif(! $false_exception_action_warned++) {
1075       carp (
1076           "The exception_action handler installed on $self returned false instead"
1077         .' of throwing an exception. This behavior has been deprecated, adjust your'
1078         .' handler to always rethrow the supplied error.'
1079       );
1080     }
1081   }
1082
1083   DBIx::Class::Exception->throw($_[0], $self->stacktrace);
1084 }
1085
1086 =head2 deploy
1087
1088 =over 4
1089
1090 =item Arguments: \%sqlt_args, $dir
1091
1092 =back
1093
1094 Attempts to deploy the schema to the current storage using L<SQL::Translator>.
1095
1096 See L<SQL::Translator/METHODS> for a list of values for C<\%sqlt_args>.
1097 The most common value for this would be C<< { add_drop_table => 1 } >>
1098 to have the SQL produced include a C<DROP TABLE> statement for each table
1099 created. For quoting purposes supply C<quote_table_names> and
1100 C<quote_field_names>.
1101
1102 Additionally, the DBIx::Class parser accepts a C<sources> parameter as a hash
1103 ref or an array ref, containing a list of source to deploy. If present, then
1104 only the sources listed will get deployed. Furthermore, you can use the
1105 C<add_fk_index> parser parameter to prevent the parser from creating an index for each
1106 FK.
1107
1108 =cut
1109
1110 sub deploy {
1111   my ($self, $sqltargs, $dir) = @_;
1112   $self->throw_exception("Can't deploy without storage") unless $self->storage;
1113   $self->storage->deploy($self, undef, $sqltargs, $dir);
1114 }
1115
1116 =head2 deployment_statements
1117
1118 =over 4
1119
1120 =item Arguments: See L<DBIx::Class::Storage::DBI/deployment_statements>
1121
1122 =item Return Value: $listofstatements
1123
1124 =back
1125
1126 A convenient shortcut to
1127 C<< $self->storage->deployment_statements($self, @args) >>.
1128 Returns the SQL statements used by L</deploy> and
1129 L<DBIx::Class::Schema::Storage/deploy>.
1130
1131 =cut
1132
1133 sub deployment_statements {
1134   my $self = shift;
1135
1136   $self->throw_exception("Can't generate deployment statements without a storage")
1137     if not $self->storage;
1138
1139   $self->storage->deployment_statements($self, @_);
1140 }
1141
1142 =head2 create_ddl_dir
1143
1144 =over 4
1145
1146 =item Arguments: See L<DBIx::Class::Storage::DBI/create_ddl_dir>
1147
1148 =back
1149
1150 A convenient shortcut to
1151 C<< $self->storage->create_ddl_dir($self, @args) >>.
1152
1153 Creates an SQL file based on the Schema, for each of the specified
1154 database types, in the given directory.
1155
1156 =cut
1157
1158 sub create_ddl_dir {
1159   my $self = shift;
1160
1161   $self->throw_exception("Can't create_ddl_dir without storage") unless $self->storage;
1162   $self->storage->create_ddl_dir($self, @_);
1163 }
1164
1165 =head2 ddl_filename
1166
1167 =over 4
1168
1169 =item Arguments: $database-type, $version, $directory, $preversion
1170
1171 =item Return Value: $normalised_filename
1172
1173 =back
1174
1175   my $filename = $table->ddl_filename($type, $version, $dir, $preversion)
1176
1177 This method is called by C<create_ddl_dir> to compose a file name out of
1178 the supplied directory, database type and version number. The default file
1179 name format is: C<$dir$schema-$version-$type.sql>.
1180
1181 You may override this method in your schema if you wish to use a different
1182 format.
1183
1184  WARNING
1185
1186  Prior to DBIx::Class version 0.08100 this method had a different signature:
1187
1188     my $filename = $table->ddl_filename($type, $dir, $version, $preversion)
1189
1190  In recent versions variables $dir and $version were reversed in order to
1191  bring the signature in line with other Schema/Storage methods. If you
1192  really need to maintain backward compatibility, you can do the following
1193  in any overriding methods:
1194
1195     ($dir, $version) = ($version, $dir) if ($DBIx::Class::VERSION < 0.08100);
1196
1197 =cut
1198
1199 sub ddl_filename {
1200   my ($self, $type, $version, $dir, $preversion) = @_;
1201
1202   require File::Spec;
1203
1204   $version = "$preversion-$version" if $preversion;
1205
1206   my $class = blessed($self) || $self;
1207   $class =~ s/::/-/g;
1208
1209   return File::Spec->catfile($dir, "$class-$version-$type.sql");
1210 }
1211
1212 =head2 thaw
1213
1214 Provided as the recommended way of thawing schema objects. You can call
1215 C<Storable::thaw> directly if you wish, but the thawed objects will not have a
1216 reference to any schema, so are rather useless.
1217
1218 =cut
1219
1220 sub thaw {
1221   my ($self, $obj) = @_;
1222   local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1223   require Storable;
1224   return Storable::thaw($obj);
1225 }
1226
1227 =head2 freeze
1228
1229 This doesn't actually do anything more than call L<Storable/nfreeze>, it is just
1230 provided here for symmetry.
1231
1232 =cut
1233
1234 sub freeze {
1235   require Storable;
1236   return Storable::nfreeze($_[1]);
1237 }
1238
1239 =head2 dclone
1240
1241 =over 4
1242
1243 =item Arguments: $object
1244
1245 =item Return Value: dcloned $object
1246
1247 =back
1248
1249 Recommended way of dcloning L<DBIx::Class::Row> and L<DBIx::Class::ResultSet>
1250 objects so their references to the schema object
1251 (which itself is B<not> cloned) are properly maintained.
1252
1253 =cut
1254
1255 sub dclone {
1256   my ($self, $obj) = @_;
1257   local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1258   require Storable;
1259   return Storable::dclone($obj);
1260 }
1261
1262 =head2 schema_version
1263
1264 Returns the current schema class' $VERSION in a normalised way.
1265
1266 =cut
1267
1268 sub schema_version {
1269   my ($self) = @_;
1270   my $class = ref($self)||$self;
1271
1272   # does -not- use $schema->VERSION
1273   # since that varies in results depending on if version.pm is installed, and if
1274   # so the perl or XS versions. If you want this to change, bug the version.pm
1275   # author to make vpp and vxs behave the same.
1276
1277   my $version;
1278   {
1279     no strict 'refs';
1280     $version = ${"${class}::VERSION"};
1281   }
1282   return $version;
1283 }
1284
1285
1286 =head2 register_class
1287
1288 =over 4
1289
1290 =item Arguments: $source_name, $component_class
1291
1292 =back
1293
1294 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.
1295
1296 You will only need this method if you have your Result classes in
1297 files which are not named after the packages (or all in the same
1298 file). You may also need it to register classes at runtime.
1299
1300 Registers a class which isa DBIx::Class::ResultSourceProxy. Equivalent to
1301 calling:
1302
1303   $schema->register_source($source_name, $component_class->result_source_instance);
1304
1305 =cut
1306
1307 sub register_class {
1308   my ($self, $source_name, $to_register) = @_;
1309   $self->register_source($source_name => $to_register->result_source_instance);
1310 }
1311
1312 =head2 register_source
1313
1314 =over 4
1315
1316 =item Arguments: $source_name, L<$result_source|DBIx::Class::ResultSource>
1317
1318 =back
1319
1320 This method is called by L</register_class>.
1321
1322 Registers the L<DBIx::Class::ResultSource> in the schema with the given
1323 source name.
1324
1325 =cut
1326
1327 sub register_source { shift->_register_source(@_) }
1328
1329 =head2 unregister_source
1330
1331 =over 4
1332
1333 =item Arguments: $source_name
1334
1335 =back
1336
1337 Removes the L<DBIx::Class::ResultSource> from the schema for the given source name.
1338
1339 =cut
1340
1341 sub unregister_source { shift->_unregister_source(@_) }
1342
1343 =head2 register_extra_source
1344
1345 =over 4
1346
1347 =item Arguments: $source_name, L<$result_source|DBIx::Class::ResultSource>
1348
1349 =back
1350
1351 As L</register_source> but should be used if the result class already
1352 has a source and you want to register an extra one.
1353
1354 =cut
1355
1356 sub register_extra_source { shift->_register_source(@_, { extra => 1 }) }
1357
1358 sub _register_source {
1359   my ($self, $source_name, $source, $params) = @_;
1360
1361   $source = $source->new({ %$source, source_name => $source_name });
1362
1363   $source->schema($self);
1364   weaken $source->{schema} if ref($self);
1365
1366   my %reg = %{$self->source_registrations};
1367   $reg{$source_name} = $source;
1368   $self->source_registrations(\%reg);
1369
1370   return $source if $params->{extra};
1371
1372   my $rs_class = $source->result_class;
1373   if ($rs_class and my $rsrc = try { $rs_class->result_source_instance } ) {
1374     my %map = %{$self->class_mappings};
1375     if (
1376       exists $map{$rs_class}
1377         and
1378       $map{$rs_class} ne $source_name
1379         and
1380       $rsrc ne $_[2]  # orig_source
1381     ) {
1382       carp
1383         "$rs_class already had a registered source which was replaced by this call. "
1384       . 'Perhaps you wanted register_extra_source(), though it is more likely you did '
1385       . 'something wrong.'
1386       ;
1387     }
1388
1389     $map{$rs_class} = $source_name;
1390     $self->class_mappings(\%map);
1391   }
1392
1393   return $source;
1394 }
1395
1396 my $global_phase_destroy;
1397 sub DESTROY {
1398   return if $global_phase_destroy ||= in_global_destruction;
1399
1400   my $self = shift;
1401   my $srcs = $self->source_registrations;
1402
1403   for my $source_name (keys %$srcs) {
1404     # find first source that is not about to be GCed (someone other than $self
1405     # holds a reference to it) and reattach to it, weakening our own link
1406     #
1407     # during global destruction (if we have not yet bailed out) this should throw
1408     # which will serve as a signal to not try doing anything else
1409     # however beware - on older perls the exception seems randomly untrappable
1410     # due to some weird race condition during thread joining :(((
1411     if (ref $srcs->{$source_name} and svref_2object($srcs->{$source_name})->REFCNT > 1) {
1412       local $@;
1413       eval {
1414         $srcs->{$source_name}->schema($self);
1415         weaken $srcs->{$source_name};
1416         1;
1417       } or do {
1418         $global_phase_destroy = 1;
1419       };
1420
1421       last;
1422     }
1423   }
1424 }
1425
1426 sub _unregister_source {
1427     my ($self, $source_name) = @_;
1428     my %reg = %{$self->source_registrations};
1429
1430     my $source = delete $reg{$source_name};
1431     $self->source_registrations(\%reg);
1432     if ($source->result_class) {
1433         my %map = %{$self->class_mappings};
1434         delete $map{$source->result_class};
1435         $self->class_mappings(\%map);
1436     }
1437 }
1438
1439
1440 =head2 compose_connection (DEPRECATED)
1441
1442 =over 4
1443
1444 =item Arguments: $target_namespace, @db_info
1445
1446 =item Return Value: $new_schema
1447
1448 =back
1449
1450 DEPRECATED. You probably wanted compose_namespace.
1451
1452 Actually, you probably just wanted to call connect.
1453
1454 =begin hidden
1455
1456 (hidden due to deprecation)
1457
1458 Calls L<DBIx::Class::Schema/"compose_namespace"> to the target namespace,
1459 calls L<DBIx::Class::Schema/connection> with @db_info on the new schema,
1460 then injects the L<DBix::Class::ResultSetProxy> component and a
1461 resultset_instance classdata entry on all the new classes, in order to support
1462 $target_namespaces::$class->search(...) method calls.
1463
1464 This is primarily useful when you have a specific need for class method access
1465 to a connection. In normal usage it is preferred to call
1466 L<DBIx::Class::Schema/connect> and use the resulting schema object to operate
1467 on L<DBIx::Class::ResultSet> objects with L<DBIx::Class::Schema/resultset> for
1468 more information.
1469
1470 =end hidden
1471
1472 =cut
1473
1474 sub compose_connection {
1475   my ($self, $target, @info) = @_;
1476
1477   carp_once "compose_connection deprecated as of 0.08000"
1478     unless $INC{"DBIx/Class/CDBICompat.pm"};
1479
1480   my $base = 'DBIx::Class::ResultSetProxy';
1481   try {
1482     eval "require ${base};"
1483   }
1484   catch {
1485     $self->throw_exception
1486       ("No arguments to load_classes and couldn't load ${base} ($_)")
1487   };
1488
1489   if ($self eq $target) {
1490     # Pathological case, largely caused by the docs on early C::M::DBIC::Plain
1491     foreach my $source_name ($self->sources) {
1492       my $source = $self->source($source_name);
1493       my $class = $source->result_class;
1494       $self->inject_base($class, $base);
1495       $class->mk_classdata(resultset_instance => $source->resultset);
1496       $class->mk_classdata(class_resolver => $self);
1497     }
1498     $self->connection(@info);
1499     return $self;
1500   }
1501
1502   my $schema = $self->compose_namespace($target, $base);
1503   {
1504     no strict 'refs';
1505     my $name = join '::', $target, 'schema';
1506     *$name = subname $name, sub { $schema };
1507   }
1508
1509   $schema->connection(@info);
1510   foreach my $source_name ($schema->sources) {
1511     my $source = $schema->source($source_name);
1512     my $class = $source->result_class;
1513     #warn "$source_name $class $source ".$source->storage;
1514     $class->mk_classdata(result_source_instance => $source);
1515     $class->mk_classdata(resultset_instance => $source->resultset);
1516     $class->mk_classdata(class_resolver => $schema);
1517   }
1518   return $schema;
1519 }
1520
1521 1;
1522
1523 =head1 AUTHOR AND CONTRIBUTORS
1524
1525 See L<AUTHOR|DBIx::Class/AUTHOR> and L<CONTRIBUTORS|DBIx::Class/CONTRIBUTORS> in DBIx::Class
1526
1527 =head1 LICENSE
1528
1529 You may distribute this code under the same terms as Perl itself.
1530
1531 =cut