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