File Coverage

blib/lib/DBIx/Class/Schema/Loader.pm
Criterion Covered Total %
statement 176 192 91.6
branch 42 56 75.0
condition 14 21 66.6
subroutine 34 34 100.0
pod 6 6 100.0
total 272 309 88.0


line stmt bran cond sub pod time code
1             package DBIx::Class::Schema::Loader;
2              
3 22     22   1961018 use strict;
  22         157  
  22         737  
4 22     22   125 use warnings;
  22         54  
  22         724  
5 22     22   121 use base qw/DBIx::Class::Schema Class::Accessor::Grouped/;
  22         48  
  22         13778  
6 22     22   1063183 use MRO::Compat;
  22         60  
  22         552  
7 22     22   127 use mro 'c3';
  22         55  
  22         152  
8 22     22   7887 use Carp::Clan qw/^DBIx::Class/;
  22         25902  
  22         183  
9 22     22   2583 use Scalar::Util 'weaken';
  22         143  
  22         1206  
10 22     22   699 use Sub::Util 'set_subname';
  22         493  
  22         1425  
11 22     22   7395 use DBIx::Class::Schema::Loader::Utils qw/array_eq sigwarn_silencer/;
  22         59  
  22         1390  
12 22     22   169 use Try::Tiny;
  22         49  
  22         1242  
13 22     22   13155 use curry;
  22         7073  
  22         721  
14 22     22   137 use namespace::clean;
  22         58  
  22         143  
15              
16             # Always remember to do all digits for the version even if they're 0
17             # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
18             # brain damage and presumably various other packaging systems too
19             our $VERSION = '0.07051';
20              
21             __PACKAGE__->mk_group_accessors('inherited', qw/
22             _loader_args
23             dump_to_dir
24             _loader_invoked
25             _loader
26             loader_class
27             naming
28             use_namespaces
29             /);
30             __PACKAGE__->_loader_args({});
31              
32             =encoding UTF-8
33              
34             =head1 NAME
35              
36             DBIx::Class::Schema::Loader - Create a DBIx::Class::Schema based on a database
37              
38             =head1 SYNOPSIS
39              
40             ### use this module to generate a set of class files
41              
42             # in a script
43             use DBIx::Class::Schema::Loader qw/ make_schema_at /;
44             make_schema_at(
45             'My::Schema',
46             { debug => 1,
47             dump_directory => './lib',
48             },
49             [ 'dbi:Pg:dbname="foo"', 'myuser', 'mypassword',
50             { loader_class => 'MyLoader' } # optionally
51             ],
52             );
53              
54             # from the command line or a shell script with dbicdump (distributed
55             # with this module). Do `perldoc dbicdump` for usage.
56             dbicdump -o dump_directory=./lib \
57             -o components='["InflateColumn::DateTime"]' \
58             -o debug=1 \
59             My::Schema \
60             'dbi:Pg:dbname=foo' \
61             myuser \
62             mypassword
63              
64             ### or generate and load classes at runtime
65             # note: this technique is not recommended
66             # for use in production code
67              
68             package My::Schema;
69             use base qw/DBIx::Class::Schema::Loader/;
70              
71             __PACKAGE__->loader_options(
72             constraint => '^foo.*',
73             # debug => 1,
74             );
75              
76             #### in application code elsewhere:
77              
78             use My::Schema;
79              
80             my $schema1 = My::Schema->connect( $dsn, $user, $password, $attrs);
81             # -or-
82             my $schema1 = "My::Schema"; $schema1->connection(as above);
83              
84             =head1 DESCRIPTION
85              
86             DBIx::Class::Schema::Loader automates the definition of a
87             L by scanning database table definitions and setting up
88             the columns, primary keys, unique constraints and relationships.
89              
90             See L for the C utility.
91              
92             DBIx::Class::Schema::Loader currently supports only the DBI storage type. It
93             has explicit support for L, L, L,
94             L, L, L, L,
95             L, L (for Sybase ASE and MSSSQL), L (for
96             MSSQL, MSAccess, Firebird and SQL Anywhere) L (for MSSQL and
97             MSAccess) and L. Other DBI drivers may function to a greater or
98             lesser degree with this loader, depending on how much of the DBI spec they
99             implement, and how standard their implementation is.
100              
101             Patches to make other DBDs work correctly welcome.
102              
103             See L for notes on writing
104             your own vendor-specific subclass for an unsupported DBD driver.
105              
106             This module requires L 0.08127 or later, and obsoletes the older
107             L.
108              
109             See L for available options.
110              
111             =head1 METHODS
112              
113             =head2 loader
114              
115             The loader object, as class data on your Schema. For methods available see
116             L and L.
117              
118             =cut
119              
120             sub loader {
121 510     510 1 1166863 my $self = shift;
122 510         12272 $self->_loader(@_);
123             }
124              
125             =head2 loader_class
126              
127             =over 4
128              
129             =item Argument: $loader_class
130              
131             =back
132              
133             Set the loader class to be instantiated when L is called.
134             If the classname starts with "::", "DBIx::Class::Schema::Loader" is
135             prepended. Defaults to L (which must
136             start with "::" when using L).
137              
138             This is mostly useful for subclassing existing loaders or in conjunction
139             with L.
140              
141             =head2 loader_options
142              
143             =over 4
144              
145             =item Argument: \%loader_options
146              
147             =back
148              
149             Example in Synopsis above demonstrates a few common arguments. For
150             detailed information on all of the arguments, most of which are
151             only useful in fairly complex scenarios, see the
152             L documentation.
153              
154             If you intend to use C, you must call
155             C before any connection is made, or embed the
156             C in the connection information itself as shown
157             below. Setting C after the connection has
158             already been made is useless.
159              
160             =cut
161              
162             sub loader_options {
163 110     110 1 23352903 my $self = shift;
164              
165 110 100       1071 my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
  35         207  
166 110         4649 $self->_loader_args(\%args);
167              
168 110         5794 $self;
169             }
170              
171             sub _invoke_loader {
172 117     117   591 my $self = shift;
173 117   66     865 my $class = ref $self || $self;
174              
175 117         2760 my $args = $self->_loader_args;
176              
177             # temporarily copy $self's storage to class
178 117         5165 my $class_storage = $class->storage;
179 117 100       5686 if (ref $self) {
180 82         1757 $class->storage($self->storage);
181 82         4706 $class->storage->set_schema($class);
182             }
183              
184 117         2765 $args->{schema} = $class;
185 117         531 $args->{schema_class} = $class;
186 117   66     1655 $args->{dump_directory} ||= $self->dump_to_dir;
187 117 100       6498 $args->{naming} = $self->naming if $self->naming;
188 117 100       11717 $args->{use_namespaces} = $self->use_namespaces if defined $self->use_namespaces;
189              
190 117         11301 my $loader_class = $self->loader_class;
191 117 100       7758 if ($loader_class) {
192 9 100       49 $loader_class = "DBIx::Class::Schema::Loader${loader_class}" if $loader_class =~ /^::/;
193 9         27 $args->{loader_class} = $loader_class;
194             };
195              
196             # XXX this only works for relative storage_type, like ::DBI ...
197 117   66     2887 my $impl = $loader_class || "DBIx::Class::Schema::Loader" . $self->storage_type;
198             try {
199 117     117   9005 $self->ensure_class_loaded($impl)
200             }
201             catch {
202 1     1   834 croak qq/Could not load loader_class "$impl": "$_"/;
203 117         5883 };
204              
205 116         5290 $class->loader($impl->new(%$args));
206 116         2822 $class->loader->load;
207 110         3540 $class->_loader_invoked(1);
208              
209             # copy to $self
210 110 100       2573 if (ref $self) {
211 75         464 $self->loader($class->loader);
212 75         2844 $self->_loader_invoked(1);
213              
214 75         1636 $self->_merge_state_from($class);
215             }
216              
217             # restore $class's storage
218 110         8771 $class->storage($class_storage);
219              
220 110         3330 return $self;
221             }
222              
223             # FIXME This needs to be moved into DBIC at some point, otherwise we are
224             # maintaining things to do with DBIC guts, which we have no business of
225             # maintaining. But at the moment it would be just dead code in DBIC, so we'll
226             # maintain it here.
227             sub _merge_state_from {
228 75     75   477 my ($self, $from) = @_;
229              
230 75         1756 my $orig_class_mappings = $self->class_mappings;
231 75         2483 my $orig_source_registrations = $self->source_registrations;
232              
233 75         1314 $self->_copy_state_from($from);
234              
235 75 50       82863 $self->class_mappings(__merge($orig_class_mappings, $self->class_mappings))
236             if $orig_class_mappings;
237              
238 75 50       11673 $self->source_registrations(__merge($orig_source_registrations, $self->source_registrations))
239             if $orig_source_registrations;
240             }
241              
242             my $merger;
243             sub __merge {
244              
245 150     150   2946 local $SIG{__WARN__} = sigwarn_silencer(qr/Arguments for _merge_hashes must be hash references/);
246              
247 150   66     1538 ( $merger ||= do {
248 14         106 require Hash::Merge;
249 14         179 my $m = Hash::Merge->new('LEFT_PRECEDENT');
250 14         2728 $m->set_clone_behavior(0);
251 14         363 $m;
252             } )->merge(
253             $_[0], $_[1]
254             );
255             }
256              
257             sub _copy_state_from {
258 242     242   31582 my $self = shift;
259 242         838 my ($from) = @_;
260              
261             # older DBIC's do not have this method
262 242 50   242   2753 if (try { DBIx::Class->VERSION('0.08197'); 1 }) {
  242         17429  
  242         1477  
263 242         4617 return $self->next::method(@_);
264             }
265             else {
266             # this is a copy from DBIC git master pre 0.08197
267 0         0 $self->class_mappings({ %{$from->class_mappings} });
  0         0  
268 0         0 $self->source_registrations({ %{$from->source_registrations} });
  0         0  
269              
270 0         0 foreach my $moniker ($from->sources) {
271 0         0 my $source = $from->source($moniker);
272 0         0 my $new = $source->new($source);
273             # we use extra here as we want to leave the class_mappings as they are
274             # but overwrite the source_registrations entry with the new source
275 0         0 $self->register_extra_source($moniker => $new);
276             }
277              
278 0 0       0 if ($from->storage) {
279 0         0 $self->storage($from->storage);
280 0         0 $self->storage->set_schema($self);
281             }
282             }
283             }
284              
285             =head2 connection
286              
287             =over 4
288              
289             =item Arguments: @args
290              
291             =item Return Value: $new_schema
292              
293             =back
294              
295             See L for basic usage.
296              
297             If the final argument is a hashref, and it contains the keys C
298             or C, those keys will be deleted, and their values value will be
299             used for the loader options or class, respectively, just as if set via the
300             L or L methods above.
301              
302             The actual auto-loading operation (the heart of this module) will be invoked
303             as soon as the connection information is defined.
304              
305             =cut
306              
307             sub connection {
308 119     119 1 856 my $self = shift;
309 119   66     776 my $class = ref $self || $self;
310              
311 119 100 66     1224 if($_[-1] && ref $_[-1] eq 'HASH') {
312 12         72 for my $option (qw/loader_class loader_options/) {
313 24 100       227 if(my $value = delete $_[-1]->{$option}) {
314 9         165 $self->$option($value);
315             }
316             }
317 12 100       48 pop @_ if !keys %{$_[-1]};
  12         117  
318             }
319              
320             # Make sure we inherit from schema_base_class and load schema_components
321             # before connecting.
322 119         15332 require DBIx::Class::Schema::Loader::Base;
323             my $temp_loader = DBIx::Class::Schema::Loader::Base->new(
324 119         574 %{ $self->_loader_args },
  119         3032  
325             schema => $self,
326             naming => 'current',
327             use_namespaces => 1,
328             );
329              
330 118         432 my $modify_isa = 0;
331 118         374 my @components;
332              
333 118 50 66     1251 if ($temp_loader->schema_base_class || $temp_loader->schema_components) {
334 118 50       793 @components = @{ $temp_loader->schema_components }
  118         445  
335             if $temp_loader->schema_components;
336              
337 118 100       533 push @components, ('+'.$temp_loader->schema_base_class)
338             if $temp_loader->schema_base_class;
339              
340 118         269 my $class_isa = do {
341 22     22   33441 no strict 'refs';
  22         59  
  22         3919  
342 118         257 \@{"${class}::ISA"};
  118         744  
343             };
344              
345             my @component_classes = map {
346 118 100       502 /^\+/ ? substr($_, 1, length($_) - 1) : "DBIx::Class::$_"
  10         85  
347             } @components;
348              
349 118 100       1300 $modify_isa++ if not array_eq([ @$class_isa[0..(@components-1)] ], \@component_classes)
350             }
351              
352 118 100       925 if ($modify_isa) {
353 4         92 $class->load_components(@components);
354              
355             # This hack is necessary because we changed @ISA of $self through
356             # ->load_components and we are now in a different place in the mro.
357 22     22   170 no warnings 'redefine';
  22         62  
  22         3029  
358              
359             local *connection = set_subname __PACKAGE__.'::connection' => sub {
360 4     4   124 my $self = shift;
361 4         34 $self->next::method(@_);
362 4         5677 };
363              
364 4         16 my @linear_isa = @{ mro::get_linear_isa($class) };
  4         42  
365              
366 4         17 my $next_method;
367              
368 4         34 foreach my $i (1..$#linear_isa) {
369 22     22   174 no strict 'refs';
  22         60  
  22         6983  
370 5         14 $next_method = *{$linear_isa[$i].'::connection'}{CODE};
  5         36  
371 5 100       44 last if $next_method;
372             }
373              
374 4         31 $self = $self->$next_method(@_);
375             }
376             else {
377 114         782 $self = $self->next::method(@_);
378             }
379              
380 118 100       1212282 if(!$class->_loader_invoked) {
381 117         8231 $self->_invoke_loader
382             }
383              
384 111         1080 return $self;
385             }
386              
387             =head2 clone
388              
389             See L.
390              
391             =cut
392              
393             sub clone {
394 167     167 1 710603 my $self = shift;
395              
396 167         1635 my $clone = $self->next::method(@_);
397              
398 167 50       203104 if($clone->_loader_args) {
399 167         9371 $clone->_loader_args->{schema} = $clone;
400 167         7161 weaken($clone->_loader_args->{schema});
401             }
402              
403 167         5080 $clone;
404             }
405              
406             =head2 dump_to_dir
407              
408             =over 4
409              
410             =item Argument: $directory
411              
412             =back
413              
414             Calling this as a class method on either L
415             or any derived schema class will cause all schemas to dump
416             manual versions of themselves to the named directory when they are
417             loaded. In order to be effective, this must be set before defining a
418             connection on this schema class or any derived object (as the loading
419             happens as soon as both a connection and loader_options are set, and
420             only once per class).
421              
422             See L for more
423             details on the dumping mechanism.
424              
425             This can also be set at module import time via the import option
426             C to L, where
427             C is the target directory.
428              
429             Examples:
430              
431             # My::Schema isa DBIx::Class::Schema::Loader, and has connection info
432             # hardcoded in the class itself:
433             perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e1
434              
435             # Same, but no hard-coded connection, so we must provide one:
436             perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e 'My::Schema->connection("dbi:Pg:dbname=foo", ...)'
437              
438             # Or as a class method, as long as you get it done *before* defining a
439             # connection on this schema class or any derived object:
440             use My::Schema;
441             My::Schema->dump_to_dir('/foo/bar');
442             My::Schema->connection(........);
443              
444             # Or as a class method on the DBIx::Class::Schema::Loader itself, which affects all
445             # derived schemas
446             use My::Schema;
447             use My::OtherSchema;
448             DBIx::Class::Schema::Loader->dump_to_dir('/foo/bar');
449             My::Schema->connection(.......);
450             My::OtherSchema->connection(.......);
451              
452             # Another alternative to the above:
453             use DBIx::Class::Schema::Loader qw| dump_to_dir:/foo/bar |;
454             use My::Schema;
455             use My::OtherSchema;
456             My::Schema->connection(.......);
457             My::OtherSchema->connection(.......);
458              
459             =cut
460              
461             sub import {
462 21     21   51644 my $self = shift;
463              
464 21 100       8714 return if !@_;
465              
466 6         25 my $cpkg = (caller)[0];
467              
468 6         98 foreach my $opt (@_) {
469 6 50       41 if($opt =~ m{^dump_to_dir:(.*)$}) {
    50          
    0          
    0          
470 0         0 $self->dump_to_dir($1)
471             }
472             elsif($opt eq 'make_schema_at') {
473 22     22   191 no strict 'refs';
  22         96  
  22         1772  
474 6         16 *{"${cpkg}::make_schema_at"} = \&make_schema_at;
  6         2155  
475             }
476             elsif($opt eq 'naming') {
477 22     22   202 no strict 'refs';
  22         58  
  22         1450  
478 0         0 *{"${cpkg}::naming"} = $self->curry::naming;
  0         0  
479             }
480             elsif($opt eq 'use_namespaces') {
481 22     22   146 no strict 'refs';
  22         59  
  22         2999  
482 0         0 *{"${cpkg}::use_namespaces"} = $self->curry::use_namespaces,
  0         0  
483             }
484             }
485             }
486              
487             =head2 make_schema_at
488              
489             =over 4
490              
491             =item Arguments: $schema_class_name, \%loader_options, \@connect_info
492              
493             =item Return Value: $schema_class_name
494              
495             =back
496              
497             This function creates a DBIx::Class schema from an existing RDBMS
498             schema. With the C option, generates a set of
499             DBIx::Class classes from an existing database schema read from the
500             given dsn. Without a C, creates schema classes in
501             memory at runtime without generating on-disk class files.
502              
503             For a complete list of supported loader_options, see
504             L
505              
506             The last hashref in the C<\@connect_info> can specify the L.
507              
508             This function can be imported in the usual way, as illustrated in
509             these Examples:
510              
511             # Simple example, creates as a new class 'New::Schema::Name' in
512             # memory in the running perl interpreter.
513             use DBIx::Class::Schema::Loader qw/ make_schema_at /;
514             make_schema_at(
515             'New::Schema::Name',
516             { debug => 1 },
517             [ 'dbi:Pg:dbname="foo"','postgres','',
518             { loader_class => 'MyLoader' } # optionally
519             ],
520             );
521              
522             # Inside a script, specifying a dump directory in which to write
523             # class files
524             use DBIx::Class::Schema::Loader qw/ make_schema_at /;
525             make_schema_at(
526             'New::Schema::Name',
527             { debug => 1, dump_directory => './lib' },
528             [ 'dbi:Pg:dbname="foo"','postgres','',
529             { loader_class => 'MyLoader' } # optionally
530             ],
531             );
532              
533             The last hashref in the C<\@connect_info> is checked for loader arguments such
534             as C and C, see L for more details.
535              
536             =cut
537              
538             sub make_schema_at {
539 31     31 1 37181 my ($target, $opts, $connect_info) = @_;
540              
541             {
542 22     22   191 no strict 'refs';
  22         62  
  22         3955  
  31         86  
543 31         89 @{$target . '::ISA'} = qw/DBIx::Class::Schema::Loader/;
  31         1227  
544             }
545              
546 31         1147 $target->_loader_invoked(0);
547              
548 31         1004 $target->loader_options($opts);
549              
550 31         282 my $temp_schema = $target->connect(@$connect_info);
551              
552 26         1800 $target->storage($temp_schema->storage);
553 26         3575 $target->storage->set_schema($target);
554              
555 26         842 return $target;
556             }
557              
558             =head2 rescan
559              
560             =over 4
561              
562             =item Return Value: @new_monikers
563              
564             =back
565              
566             Re-scans the database for newly added tables since the initial
567             load, and adds them to the schema at runtime, including relationships,
568             etc. Does not process drops or changes.
569              
570             Returns a list of the new monikers added.
571              
572             =cut
573              
574 5     5 1 94 sub rescan { my $self = shift; $self->loader->rescan($self) }
  5         36  
575              
576             =head2 naming
577              
578             =over 4
579              
580             =item Arguments: \%opts | $ver
581              
582             =back
583              
584             Controls the naming options for backward compatibility, see
585             L for details.
586              
587             To upgrade a dynamic schema, use:
588              
589             __PACKAGE__->naming('current');
590              
591             Can be imported into your dump script and called as a function as well:
592              
593             naming('v4');
594              
595             =head2 use_namespaces
596              
597             =over 4
598              
599             =item Arguments: 1|0
600              
601             =back
602              
603             Controls the use_namespaces options for backward compatibility, see
604             L for details.
605              
606             To upgrade a dynamic schema, use:
607              
608             __PACKAGE__->use_namespaces(1);
609              
610             Can be imported into your dump script and called as a function as well:
611              
612             use_namespaces(1);
613              
614             =head1 KNOWN ISSUES
615              
616             =head2 Multiple Database Schemas
617              
618             See L.
619              
620             =head1 ACKNOWLEDGEMENTS
621              
622             Matt S Trout, all of the #dbix-class folks, and everyone who's ever sent
623             in a bug report or suggestion.
624              
625             Based on L by Sebastian Riedel
626              
627             Based upon the work of IKEBE Tomohiro
628              
629             =head1 AUTHORS
630              
631             Caelum: Rafael Kitover
632              
633             Dag-Erling Smørgrav
634              
635             Matias E. Fernandez
636              
637             SineSwiper: Brendan Byrd
638              
639             TSUNODA Kazuya
640              
641             acmoore: Andrew Moore
642              
643             alnewkirk: Al Newkirk
644              
645             andrewalker: André Walker
646              
647             angelixd: Paul C. Mantz
648              
649             arc: Aaron Crane
650              
651             arcanez: Justin Hunter
652              
653             ash: Ash Berlin
654              
655             blblack: Brandon Black
656              
657             bphillips: Brian Phillips
658              
659             btilly: Ben Tilly
660              
661             domm: Thomas Klausner
662              
663             ether: Karen Etheridge
664              
665             gugu: Andrey Kostenko
666              
667             hobbs: Andrew Rodland
668              
669             ilmari: Dagfinn Ilmari MannsEker
670              
671             jhannah: Jay Hannah
672              
673             jnap: John Napiorkowski
674              
675             kane: Jos Boumans
676              
677             mattp: Matt Phillips
678              
679             mephinet: Philipp Gortan
680              
681             moritz: Moritz Lenz
682              
683             mst: Matt S. Trout
684              
685             mstratman: Mark A. Stratman
686              
687             oalders: Olaf Alders
688              
689             rbo: Robert Bohne
690              
691             rbuels: Robert Buels
692              
693             ribasushi: Peter Rabbitson
694              
695             schwern: Michael G. Schwern
696              
697             spb: Stephen Bennett
698              
699             timbunce: Tim Bunce
700              
701             waawaamilk: Nigel McNie
702              
703             ... and lots of other folks. If we forgot you, please write the current
704             maintainer or RT.
705              
706             =head1 COPYRIGHT & LICENSE
707              
708             Copyright (c) 2006 - 2015 by the aforementioned
709             L.
710              
711             This library is free software; you can redistribute it and/or modify it under
712             the same terms as Perl itself.
713              
714             =head1 SEE ALSO
715              
716             L, L, L,
717             L
718              
719             =cut
720              
721             1;
722             # vim:et sts=4 sw=4 tw=0: