File Coverage

blib/lib/DBIx/Class/Schema/Loader.pm
Criterion Covered Total %
statement 176 192 91.6
branch 42 56 75.0
condition 15 21 71.4
subroutine 34 34 100.0
pod 6 6 100.0
total 273 309 88.3


line stmt bran cond sub pod time code
1             package DBIx::Class::Schema::Loader;
2              
3 56     56   2851320 use strict;
  56         165  
  56         2315  
4 56     56   349 use warnings;
  56         111  
  56         3939  
5 56     56   336 use base qw/DBIx::Class::Schema Class::Accessor::Grouped/;
  56         105  
  56         39783  
6 56     56   3697038 use MRO::Compat;
  56         157  
  56         1651  
7 56     56   345 use mro 'c3';
  56         103  
  56         435  
8 56     56   31455 use Carp::Clan qw/^DBIx::Class/;
  56         112661  
  56         473  
9 56     56   6271 use Scalar::Util 'weaken';
  56         404  
  56         3725  
10 56     56   957 use Sub::Util 'set_subname';
  56         393  
  56         3688  
11 56     56   29263 use DBIx::Class::Schema::Loader::Utils qw/array_eq sigwarn_silencer/;
  56         237  
  56         5278  
12 56     56   482 use Try::Tiny;
  56         137  
  56         3518  
13 56     56   39955 use curry;
  56         22169  
  56         2423  
14 56     56   555 use namespace::clean;
  56         179  
  56         522  
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.07053';
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 640     640 1 1430075 my $self = shift;
122 640         22004 $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 144     144 1 168428118 my $self = shift;
164              
165 144 100       1316 my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
  69         451  
166 144         6821 $self->_loader_args(\%args);
167              
168 144         6538 $self;
169             }
170              
171             sub _invoke_loader {
172 150     150   501 my $self = shift;
173 150   66     911 my $class = ref $self || $self;
174              
175 150         4730 my $args = $self->_loader_args;
176              
177             # temporarily copy $self's storage to class
178 150         8363 my $class_storage = $class->storage;
179 150 100       9212 if (ref $self) {
180 115         3309 $class->storage($self->storage);
181 115         8670 $class->storage->set_schema($class);
182             }
183              
184 150         4932 $args->{schema} = $class;
185 150         696 $args->{schema_class} = $class;
186 150   66     5343 $args->{dump_directory} ||= $self->dump_to_dir;
187 150 100       9253 $args->{naming} = $self->naming if $self->naming;
188 150 100       17577 $args->{use_namespaces} = $self->use_namespaces if defined $self->use_namespaces;
189              
190 150         16605 my $loader_class = $self->loader_class;
191 150 100       10728 if ($loader_class) {
192 9 100       49 $loader_class = "DBIx::Class::Schema::Loader${loader_class}" if $loader_class =~ /^::/;
193 9         29 $args->{loader_class} = $loader_class;
194             };
195              
196             # XXX this only works for relative storage_type, like ::DBI ...
197 150   66     4859 my $impl = $loader_class || "DBIx::Class::Schema::Loader" . $self->storage_type;
198             try {
199 150     150   12299 $self->ensure_class_loaded($impl)
200             }
201             catch {
202 1     1   1188 croak qq/Could not load loader_class "$impl": "$_"/;
203 150         9940 };
204              
205 149         8838 $class->loader($impl->new(%$args));
206 149         4041 $class->loader->load;
207 142         5918 $class->_loader_invoked(1);
208              
209             # copy to $self
210 142 100       3625 if (ref $self) {
211 107         961 $self->loader($class->loader);
212 107         4625 $self->_loader_invoked(1);
213              
214 107         2488 $self->_merge_state_from($class);
215             }
216              
217             # restore $class's storage
218 142         15792 $class->storage($class_storage);
219              
220 142         5033 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 107     107   488 my ($self, $from) = @_;
229              
230 107         3087 my $orig_class_mappings = $self->class_mappings;
231 107         4065 my $orig_source_registrations = $self->source_registrations;
232              
233 107         2183 $self->_copy_state_from($from);
234              
235 107 50       145489 $self->class_mappings(__merge($orig_class_mappings, $self->class_mappings))
236             if $orig_class_mappings;
237              
238 107 50       19667 $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 214     214   4778 local $SIG{__WARN__} = sigwarn_silencer(qr/Arguments for _merge_hashes must be hash references/);
246              
247 214   66     2408 ( $merger ||= do {
248 46         432 require Hash::Merge;
249 46         659 my $m = Hash::Merge->new('LEFT_PRECEDENT');
250 46         9981 $m->set_clone_behavior(0);
251 46         1366 $m;
252             } )->merge(
253             $_[0], $_[1]
254             );
255             }
256              
257             sub _copy_state_from {
258 308     308   45400 my $self = shift;
259 308         1250 my ($from) = @_;
260              
261             # older DBIC's do not have this method
262 308 50   308   3843 if (try { DBIx::Class->VERSION('0.08197'); 1 }) {
  308         28162  
  308         2162  
263 308         6155 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 153     153 1 969 my $self = shift;
309 153   66     1037 my $class = ref $self || $self;
310              
311 153 100 100     1499 if($_[-1] && ref $_[-1] eq 'HASH') {
312 13         69 for my $option (qw/loader_class loader_options/) {
313 26 100       243 if(my $value = delete $_[-1]->{$option}) {
314 9         245 $self->$option($value);
315             }
316             }
317 13 100       54 pop @_ if !keys %{$_[-1]};
  13         108  
318             }
319              
320             # Make sure we inherit from schema_base_class and load schema_components
321             # before connecting.
322 153         20499 require DBIx::Class::Schema::Loader::Base;
323             my $temp_loader = DBIx::Class::Schema::Loader::Base->new(
324 153         655 %{ $self->_loader_args },
  153         4472  
325             schema => $self,
326             naming => 'current',
327             use_namespaces => 1,
328             );
329              
330 151         565 my $modify_isa = 0;
331 151         428 my @components;
332              
333 151 50 66     1647 if ($temp_loader->schema_base_class || $temp_loader->schema_components) {
334 151 50       788 @components = @{ $temp_loader->schema_components }
  151         758  
335             if $temp_loader->schema_components;
336              
337 151 100       742 push @components, ('+'.$temp_loader->schema_base_class)
338             if $temp_loader->schema_base_class;
339              
340 151         321 my $class_isa = do {
341 56     56   93362 no strict 'refs';
  56         122  
  56         11450  
342 151         311 \@{"${class}::ISA"};
  151         1305  
343             };
344              
345             my @component_classes = map {
346 151 100       505 /^\+/ ? substr($_, 1, length($_) - 1) : "DBIx::Class::$_"
  14         115  
347             } @components;
348              
349 151 100       1952 $modify_isa++ if not array_eq([ @$class_isa[0..(@components-1)] ], \@component_classes)
350             }
351              
352 151 100       1258 if ($modify_isa) {
353 8         213 $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 56     56   483 no warnings 'redefine';
  56         126  
  56         9189  
358              
359             local *connection = set_subname __PACKAGE__.'::connection' => sub {
360 8     8   185 my $self = shift;
361 8         55 $self->next::method(@_);
362 8         13282 };
363              
364 8         30 my @linear_isa = @{ mro::get_linear_isa($class) };
  8         65  
365              
366 8         22 my $next_method;
367              
368 8         44 foreach my $i (1..$#linear_isa) {
369 56     56   498 no strict 'refs';
  56         178  
  56         22840  
370 10         40 $next_method = *{$linear_isa[$i].'::connection'}{CODE};
  10         57  
371 10 100       70 last if $next_method;
372             }
373              
374 8         54 $self = $self->$next_method(@_);
375             }
376             else {
377 143         1380 $self = $self->next::method(@_);
378             }
379              
380 151 100       4683151 if(!$class->_loader_invoked) {
381 150         10337 $self->_invoke_loader
382             }
383              
384 143         1730 return $self;
385             }
386              
387             =head2 clone
388              
389             See L.
390              
391             =cut
392              
393             sub clone {
394 201     201 1 1048901 my $self = shift;
395              
396 201         2237 my $clone = $self->next::method(@_);
397              
398 201 50       262264 if($clone->_loader_args) {
399 201         11458 $clone->_loader_args->{schema} = $clone;
400 201         9734 weaken($clone->_loader_args->{schema});
401             }
402              
403 201         6028 $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 55     55   70765 my $self = shift;
463              
464 55 100       378257 return if !@_;
465              
466 40         151 my $cpkg = (caller)[0];
467              
468 40         197 foreach my $opt (@_) {
469 40 50       251 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 56     56   678 no strict 'refs';
  56         126  
  56         4984  
474 40         93 *{"${cpkg}::make_schema_at"} = \&make_schema_at;
  40         126139  
475             }
476             elsif($opt eq 'naming') {
477 56     56   400 no strict 'refs';
  56         112  
  56         3545  
478 0         0 *{"${cpkg}::naming"} = $self->curry::naming;
  0         0  
479             }
480             elsif($opt eq 'use_namespaces') {
481 56     56   375 no strict 'refs';
  56         121  
  56         8992  
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 65     65 1 918822 my ($target, $opts, $connect_info) = @_;
540              
541             {
542 56     56   399 no strict 'refs';
  56         120  
  56         11578  
  65         172  
543 65         164 @{$target . '::ISA'} = qw/DBIx::Class::Schema::Loader/;
  65         3829  
544             }
545              
546 65         3234 $target->_loader_invoked(0);
547              
548 65         2790 $target->loader_options($opts);
549              
550 65         659 my $temp_schema = $target->connect(@$connect_info);
551              
552 58         3579 $target->storage($temp_schema->storage);
553 58         6940 $target->storage->set_schema($target);
554              
555 58         2011 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 138 sub rescan { my $self = shift; $self->loader->rescan($self) }
  5         48  
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: