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   1966764 use strict;
  22         171  
  22         666  
4 22     22   151 use warnings;
  22         57  
  22         699  
5 22     22   142 use base qw/DBIx::Class::Schema Class::Accessor::Grouped/;
  22         45  
  22         13981  
6 22     22   1071198 use MRO::Compat;
  22         62  
  22         503  
7 22     22   125 use mro 'c3';
  22         50  
  22         145  
8 22     22   8182 use Carp::Clan qw/^DBIx::Class/;
  22         26062  
  22         176  
9 22     22   2626 use Scalar::Util 'weaken';
  22         110  
  22         1260  
10 22     22   623 use Sub::Util 'set_subname';
  22         461  
  22         1436  
11 22     22   7573 use DBIx::Class::Schema::Loader::Utils qw/array_eq sigwarn_silencer/;
  22         62  
  22         1427  
12 22     22   162 use Try::Tiny;
  22         47  
  22         1157  
13 22     22   12818 use curry;
  22         6974  
  22         732  
14 22     22   141 use namespace::clean;
  22         56  
  22         153  
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.07050';
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 1142223 my $self = shift;
122 510         12458 $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 24336189 my $self = shift;
164              
165 110 100       1170 my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
  35         206  
166 110         4643 $self->_loader_args(\%args);
167              
168 110         6006 $self;
169             }
170              
171             sub _invoke_loader {
172 117     117   475 my $self = shift;
173 117   66     739 my $class = ref $self || $self;
174              
175 117         2729 my $args = $self->_loader_args;
176              
177             # temporarily copy $self's storage to class
178 117         5019 my $class_storage = $class->storage;
179 117 100       5814 if (ref $self) {
180 82         1902 $class->storage($self->storage);
181 82         4943 $class->storage->set_schema($class);
182             }
183              
184 117         2833 $args->{schema} = $class;
185 117         520 $args->{schema_class} = $class;
186 117   66     1986 $args->{dump_directory} ||= $self->dump_to_dir;
187 117 100       6567 $args->{naming} = $self->naming if $self->naming;
188 117 100       11758 $args->{use_namespaces} = $self->use_namespaces if defined $self->use_namespaces;
189              
190 117         11849 my $loader_class = $self->loader_class;
191 117 100       7770 if ($loader_class) {
192 9 100       53 $loader_class = "DBIx::Class::Schema::Loader${loader_class}" if $loader_class =~ /^::/;
193 9         26 $args->{loader_class} = $loader_class;
194             };
195              
196             # XXX this only works for relative storage_type, like ::DBI ...
197 117   66     3445 my $impl = $loader_class || "DBIx::Class::Schema::Loader" . $self->storage_type;
198             try {
199 117     117   9213 $self->ensure_class_loaded($impl)
200             }
201             catch {
202 1     1   839 croak qq/Could not load loader_class "$impl": "$_"/;
203 117         6488 };
204              
205 116         6425 $class->loader($impl->new(%$args));
206 116         3239 $class->loader->load;
207 110         3646 $class->_loader_invoked(1);
208              
209             # copy to $self
210 110 100       2546 if (ref $self) {
211 75         451 $self->loader($class->loader);
212 75         2908 $self->_loader_invoked(1);
213              
214 75         1605 $self->_merge_state_from($class);
215             }
216              
217             # restore $class's storage
218 110         9027 $class->storage($class_storage);
219              
220 110         2953 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   372 my ($self, $from) = @_;
229              
230 75         1575 my $orig_class_mappings = $self->class_mappings;
231 75         2456 my $orig_source_registrations = $self->source_registrations;
232              
233 75         1392 $self->_copy_state_from($from);
234              
235 75 50       82644 $self->class_mappings(__merge($orig_class_mappings, $self->class_mappings))
236             if $orig_class_mappings;
237              
238 75 50       12398 $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   3067 local $SIG{__WARN__} = sigwarn_silencer(qr/Arguments for _merge_hashes must be hash references/);
246              
247 150   66     1529 ( $merger ||= do {
248 14         109 require Hash::Merge;
249 14         175 my $m = Hash::Merge->new('LEFT_PRECEDENT');
250 14         2691 $m->set_clone_behavior(0);
251 14         344 $m;
252             } )->merge(
253             $_[0], $_[1]
254             );
255             }
256              
257             sub _copy_state_from {
258 242     242   31486 my $self = shift;
259 242         828 my ($from) = @_;
260              
261             # older DBIC's do not have this method
262 242 50   242   2802 if (try { DBIx::Class->VERSION('0.08197'); 1 }) {
  242         18259  
  242         1556  
263 242         4756 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 926 my $self = shift;
309 119   66     782 my $class = ref $self || $self;
310              
311 119 100 66     1315 if($_[-1] && ref $_[-1] eq 'HASH') {
312 12         83 for my $option (qw/loader_class loader_options/) {
313 24 100       216 if(my $value = delete $_[-1]->{$option}) {
314 9         170 $self->$option($value);
315             }
316             }
317 12 100       53 pop @_ if !keys %{$_[-1]};
  12         132  
318             }
319              
320             # Make sure we inherit from schema_base_class and load schema_components
321             # before connecting.
322 119         15583 require DBIx::Class::Schema::Loader::Base;
323             my $temp_loader = DBIx::Class::Schema::Loader::Base->new(
324 119         558 %{ $self->_loader_args },
  119         2859  
325             schema => $self,
326             naming => 'current',
327             use_namespaces => 1,
328             );
329              
330 118         411 my $modify_isa = 0;
331 118         435 my @components;
332              
333 118 50 66     1255 if ($temp_loader->schema_base_class || $temp_loader->schema_components) {
334 118 50       807 @components = @{ $temp_loader->schema_components }
  118         432  
335             if $temp_loader->schema_components;
336              
337 118 100       581 push @components, ('+'.$temp_loader->schema_base_class)
338             if $temp_loader->schema_base_class;
339              
340 118         261 my $class_isa = do {
341 22     22   34055 no strict 'refs';
  22         60  
  22         3897  
342 118         226 \@{"${class}::ISA"};
  118         835  
343             };
344              
345             my @component_classes = map {
346 118 100       464 /^\+/ ? substr($_, 1, length($_) - 1) : "DBIx::Class::$_"
  10         95  
347             } @components;
348              
349 118 100       1326 $modify_isa++ if not array_eq([ @$class_isa[0..(@components-1)] ], \@component_classes)
350             }
351              
352 118 100       990 if ($modify_isa) {
353 4         88 $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   173 no warnings 'redefine';
  22         57  
  22         2997  
358              
359             local *connection = set_subname __PACKAGE__.'::connection' => sub {
360 4     4   134 my $self = shift;
361 4         50 $self->next::method(@_);
362 4         6306 };
363              
364 4         26 my @linear_isa = @{ mro::get_linear_isa($class) };
  4         45  
365              
366 4         21 my $next_method;
367              
368 4         39 foreach my $i (1..$#linear_isa) {
369 22     22   197 no strict 'refs';
  22         47  
  22         7196  
370 5         16 $next_method = *{$linear_isa[$i].'::connection'}{CODE};
  5         52  
371 5 100       38 last if $next_method;
372             }
373              
374 4         32 $self = $self->$next_method(@_);
375             }
376             else {
377 114         790 $self = $self->next::method(@_);
378             }
379              
380 118 100       1243203 if(!$class->_loader_invoked) {
381 117         8210 $self->_invoke_loader
382             }
383              
384 111         909 return $self;
385             }
386              
387             =head2 clone
388              
389             See L.
390              
391             =cut
392              
393             sub clone {
394 167     167 1 687072 my $self = shift;
395              
396 167         1580 my $clone = $self->next::method(@_);
397              
398 167 50       206613 if($clone->_loader_args) {
399 167         9144 $clone->_loader_args->{schema} = $clone;
400 167         7446 weaken($clone->_loader_args->{schema});
401             }
402              
403 167         5472 $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   49981 my $self = shift;
463              
464 21 100       8623 return if !@_;
465              
466 6         25 my $cpkg = (caller)[0];
467              
468 6         98 foreach my $opt (@_) {
469 6 50       43 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   183 no strict 'refs';
  22         69  
  22         1764  
474 6         13 *{"${cpkg}::make_schema_at"} = \&make_schema_at;
  6         2303  
475             }
476             elsif($opt eq 'naming') {
477 22     22   176 no strict 'refs';
  22         59  
  22         1386  
478 0         0 *{"${cpkg}::naming"} = $self->curry::naming;
  0         0  
479             }
480             elsif($opt eq 'use_namespaces') {
481 22     22   155 no strict 'refs';
  22         50  
  22         2992  
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 39761 my ($target, $opts, $connect_info) = @_;
540              
541             {
542 22     22   160 no strict 'refs';
  22         49  
  22         4083  
  31         82  
543 31         85 @{$target . '::ISA'} = qw/DBIx::Class::Schema::Loader/;
  31         1301  
544             }
545              
546 31         1201 $target->_loader_invoked(0);
547              
548 31         998 $target->loader_options($opts);
549              
550 31         275 my $temp_schema = $target->connect(@$connect_info);
551              
552 26         1869 $target->storage($temp_schema->storage);
553 26         3746 $target->storage->set_schema($target);
554              
555 26         825 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 132 sub rescan { my $self = shift; $self->loader->rescan($self) }
  5         43  
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: