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