fix uninitialized warning
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader.pm
CommitLineData
18fca96a 1package DBIx::Class::Schema::Loader;
a78e3fed 2
3use strict;
a4a19f3c 4use warnings;
65e705c3 5use base qw/DBIx::Class::Schema Class::Accessor::Grouped/;
cc15b78f 6use MRO::Compat;
942bd5e0 7use mro 'c3';
39d5612f 8use Carp::Clan qw/^DBIx::Class/;
9use Scalar::Util 'weaken';
cc15b78f 10use Sub::Name 'subname';
39d5612f 11use namespace::clean;
3980d69c 12
a4a19f3c 13# Always remember to do all digits for the version even if they're 0
14# i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
15# brain damage and presumably various other packaging systems too
4295c4b4 16our $VERSION = '0.07010';
457eb8a6 17
65e705c3 18__PACKAGE__->mk_group_accessors('inherited', qw/
19 _loader_args
20 dump_to_dir
21 _loader_invoked
22 _loader
23 loader_class
24 naming
f22644d7 25 use_namespaces
a8d229ff 26/);
65e705c3 27__PACKAGE__->_loader_args({});
a78e3fed 28
29=head1 NAME
30
227cea92 31DBIx::Class::Schema::Loader - Create a DBIx::Class::Schema based on a database
a78e3fed 32
33=head1 SYNOPSIS
34
707fb247 35 ### use this module to generate a set of class files
36
37 # in a script
38 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
39 make_schema_at(
40 'My::Schema',
41 { debug => 1,
42 dump_directory => './lib',
43 },
35a87f06 44 [ 'dbi:Pg:dbname="foo"', 'myuser', 'mypassword',
45 { loader_class => 'MyLoader' } # optionally
46 ],
707fb247 47 );
48
49 # from the command line or a shell script with dbicdump (distributed
50 # with this module). Do `perldoc dbicdump` for usage.
51 dbicdump -o dump_directory=./lib \
227cea92 52 -o components='["InflateColumn::DateTime"]' \
707fb247 53 -o debug=1 \
54 My::Schema \
55 'dbi:Pg:dbname=foo' \
56 myuser \
57 mypassword
58
59 ### or generate and load classes at runtime
60 # note: this technique is not recommended
61 # for use in production code
62
a4a19f3c 63 package My::Schema;
64 use base qw/DBIx::Class::Schema::Loader/;
a78e3fed 65
996be9ee 66 __PACKAGE__->loader_options(
996be9ee 67 constraint => '^foo.*',
68 # debug => 1,
a78e3fed 69 );
af6c2665 70
707fb247 71 #### in application code elsewhere:
a78e3fed 72
a4a19f3c 73 use My::Schema;
a78e3fed 74
a4a19f3c 75 my $schema1 = My::Schema->connect( $dsn, $user, $password, $attrs);
76 # -or-
996be9ee 77 my $schema1 = "My::Schema"; $schema1->connection(as above);
074e81cd 78
996be9ee 79=head1 DESCRIPTION
074e81cd 80
fbd83464 81DBIx::Class::Schema::Loader automates the definition of a
227cea92 82L<DBIx::Class::Schema> by scanning database table definitions and setting up
83the columns, primary keys, unique constraints and relationships.
a78e3fed 84
700658a5 85See L<dbicdump> for the C<dbicdump> utility.
86
227cea92 87DBIx::Class::Schema::Loader currently supports only the DBI storage type. It
1065db64 88has explicit support for L<DBD::Pg>, L<DBD::mysql>, L<DBD::DB2>,
227cea92 89L<DBD::Firebird>, L<DBD::InterBase>, L<DBD::Informix>, L<DBD::SQLAnywhere>,
6b0e47fc 90L<DBD::SQLite>, L<DBD::Sybase> (for Sybase ASE and MSSSQL), L<DBD::ODBC> (for
227cea92 91MSSQL, MSAccess, Firebird and SQL Anywhere) L<DBD::ADO> (for MSSQL and
92MSAccess) and L<DBD::Oracle>. Other DBI drivers may function to a greater or
6b0e47fc 93lesser degree with this loader, depending on how much of the DBI spec they
94implement, and how standard their implementation is.
3fe9c5d9 95
96Patches to make other DBDs work correctly welcome.
a78e3fed 97
996be9ee 98See L<DBIx::Class::Schema::Loader::DBI::Writing> for notes on writing
99your own vendor-specific subclass for an unsupported DBD driver.
a78e3fed 100
227cea92 101This module requires L<DBIx::Class> 0.08127 or later, and obsoletes the older
102L<DBIx::Class::Loader>.
89ecd854 103
227cea92 104See L<DBIx::Class::Schema::Loader::Base> for available options.
89ecd854 105
a78e3fed 106=head1 METHODS
107
39d5612f 108=head2 loader
109
227cea92 110The loader object, as class data on your Schema. For methods available see
111L<DBIx::Class::Schema::Loader::Base> and L<DBIx::Class::Schema::Loader::DBI>.
39d5612f 112
113=cut
114
115sub loader {
116 my $self = shift;
117 $self->_loader(@_);
118}
119
29ddb54c 120=head2 loader_class
121
530e0bf6 122=over 4
123
124=item Argument: $loader_class
125
126=back
127
29ddb54c 128Set the loader class to be instantiated when L</connection> is called.
129If the classname starts with "::", "DBIx::Class::Schema::Loader" is
130prepended. Defaults to L<DBIx::Class::Schema/storage_type> (which must
131start with "::" when using L<DBIx::Class::Schema::Loader>).
132
133This is mostly useful for subclassing existing loaders or in conjunction
134with L</dump_to_dir>.
135
996be9ee 136=head2 loader_options
a78e3fed 137
530e0bf6 138=over 4
139
140=item Argument: \%loader_options
141
142=back
143
996be9ee 144Example in Synopsis above demonstrates a few common arguments. For
145detailed information on all of the arguments, most of which are
146only useful in fairly complex scenarios, see the
147L<DBIx::Class::Schema::Loader::Base> documentation.
a78e3fed 148
3fe9c5d9 149If you intend to use C<loader_options>, you must call
150C<loader_options> before any connection is made, or embed the
151C<loader_options> in the connection information itself as shown
152below. Setting C<loader_options> after the connection has
59cfa251 153already been made is useless.
a78e3fed 154
996be9ee 155=cut
1031d4f6 156
996be9ee 157sub loader_options {
158 my $self = shift;
65e705c3 159
d65cda9e 160 my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
996be9ee 161 $self->_loader_args(\%args);
996be9ee 162
163 $self;
164}
165
166sub _invoke_loader {
167 my $self = shift;
168 my $class = ref $self || $self;
169
59cfa251 170 my $args = $self->_loader_args;
171
172 # set up the schema/schema_class arguments
173 $args->{schema} = $self;
174 $args->{schema_class} = $class;
175 weaken($args->{schema}) if ref $self;
176 $args->{dump_directory} ||= $self->dump_to_dir;
a0e0a56a 177 $args->{naming} = $self->naming if $self->naming;
42ea7b88 178 $args->{use_namespaces} = $self->use_namespaces if defined $self->use_namespaces;
af6c2665 179
996be9ee 180 # XXX this only works for relative storage_type, like ::DBI ...
71a6e88a 181 my $loader_class = $self->loader_class;
182 if ($loader_class) {
183 $loader_class = "DBIx::Class::Schema::Loader${loader_class}" if $loader_class =~ /^::/;
184 $args->{loader_class} = $loader_class;
185 };
186
187 my $impl = $loader_class || "DBIx::Class::Schema::Loader" . $self->storage_type;
6ae3f335 188 eval { $self->ensure_class_loaded($impl) };
517a30e2 189 croak qq/Could not load loader_class "$impl": "$@"/ if $@;
af6c2665 190
39d5612f 191 $self->loader($impl->new(%$args));
192 $self->loader->load;
59cfa251 193 $self->_loader_invoked(1);
996be9ee 194
996be9ee 195 $self;
196}
197
198=head2 connection
199
530e0bf6 200=over 4
201
202=item Arguments: @args
203
204=item Return Value: $new_schema
205
206=back
207
208See L<DBIx::Class::Schema/connection> for basic usage.
d65cda9e 209
29ddb54c 210If the final argument is a hashref, and it contains the keys C<loader_options>
211or C<loader_class>, those keys will be deleted, and their values value will be
212used for the loader options or class, respectively, just as if set via the
213L</loader_options> or L</loader_class> methods above.
d65cda9e 214
215The actual auto-loading operation (the heart of this module) will be invoked
216as soon as the connection information is defined.
996be9ee 217
218=cut
219
220sub connection {
de89deba 221 my $self = shift;
222 my $class = ref $self || $self;
d65cda9e 223
224 if($_[-1] && ref $_[-1] eq 'HASH') {
cc15b78f 225 for my $option (qw/loader_class loader_options/) {
29ddb54c 226 if(my $value = delete $_[-1]->{$option}) {
227 $self->$option($value);
228 }
d65cda9e 229 }
29ddb54c 230 pop @_ if !keys %{$_[-1]};
d65cda9e 231 }
232
cc15b78f 233 # Make sure we inherit from schema_base_class and load schema_components
234 # before connecting.
235 require DBIx::Class::Schema::Loader::Base;
236 my $temp_loader = DBIx::Class::Schema::Loader::Base->new(
a2c2cf69 237 %{ $self->_loader_args },
238 schema => $self,
cc15b78f 239 );
240
241 if ($temp_loader->schema_base_class || $temp_loader->schema_components) {
242 my @components = @{ $temp_loader->schema_components }
243 if $temp_loader->schema_components;
244
245 push @components, ('+'.$temp_loader->schema_base_class)
246 if $temp_loader->schema_base_class;
247
de89deba 248 $class->load_components(@components);
cc15b78f 249
a1781f7f 250 # This hack is necessary because we changed @ISA of $self through
de89deba 251 # ->load_components and we are now in a different place in the mro.
cc15b78f 252 no warnings 'redefine';
253
254 local *connection = subname __PACKAGE__.'::connection' => sub {
255 my $self = shift;
256 $self->next::method(@_);
257 };
258
de89deba 259 my @linear_isa = @{ mro::get_linear_isa($class) };
260
261 my $next_method;
262
263 foreach my $i (1..$#linear_isa) {
264 no strict 'refs';
265 $next_method = *{$linear_isa[$i].'::connection'}{CODE};
266 last if $next_method;
267 }
268
269 $self = $self->$next_method(@_);
cc15b78f 270 }
a1781f7f 271 else {
272 $self = $self->next::method(@_);
273 }
996be9ee 274
59cfa251 275 if(!$class->_loader_invoked) {
fa994d3c 276 $self->_invoke_loader
277 }
996be9ee 278
279 return $self;
280}
281
282=head2 clone
283
530e0bf6 284See L<DBIx::Class::Schema/clone>.
996be9ee 285
286=cut
287
288sub clone {
289 my $self = shift;
290
291 my $clone = $self->next::method(@_);
292
fa994d3c 293 if($clone->_loader_args) {
294 $clone->_loader_args->{schema} = $clone;
295 weaken($clone->_loader_args->{schema});
296 }
996be9ee 297
298 $clone;
299}
300
301=head2 dump_to_dir
302
530e0bf6 303=over 4
304
305=item Argument: $directory
306
307=back
996be9ee 308
309Calling this as a class method on either L<DBIx::Class::Schema::Loader>
707fb247 310or any derived schema class will cause all schemas to dump
996be9ee 311manual versions of themselves to the named directory when they are
312loaded. In order to be effective, this must be set before defining a
313connection on this schema class or any derived object (as the loading
074e81cd 314happens as soon as both a connection and loader_options are set, and
315only once per class).
996be9ee 316
317See L<DBIx::Class::Schema::Loader::Base/dump_directory> for more
318details on the dumping mechanism.
319
320This can also be set at module import time via the import option
321C<dump_to_dir:/foo/bar> to L<DBIx::Class::Schema::Loader>, where
322C</foo/bar> is the target directory.
323
324Examples:
325
326 # My::Schema isa DBIx::Class::Schema::Loader, and has connection info
327 # hardcoded in the class itself:
328 perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e1
329
330 # Same, but no hard-coded connection, so we must provide one:
331 perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e 'My::Schema->connection("dbi:Pg:dbname=foo", ...)'
332
333 # Or as a class method, as long as you get it done *before* defining a
334 # connection on this schema class or any derived object:
335 use My::Schema;
336 My::Schema->dump_to_dir('/foo/bar');
337 My::Schema->connection(........);
338
339 # Or as a class method on the DBIx::Class::Schema::Loader itself, which affects all
340 # derived schemas
341 use My::Schema;
342 use My::OtherSchema;
343 DBIx::Class::Schema::Loader->dump_to_dir('/foo/bar');
344 My::Schema->connection(.......);
345 My::OtherSchema->connection(.......);
346
347 # Another alternative to the above:
348 use DBIx::Class::Schema::Loader qw| dump_to_dir:/foo/bar |;
349 use My::Schema;
350 use My::OtherSchema;
351 My::Schema->connection(.......);
352 My::OtherSchema->connection(.......);
353
354=cut
355
356sub import {
357 my $self = shift;
a8d229ff 358
996be9ee 359 return if !@_;
a8d229ff 360
361 my $cpkg = (caller)[0];
362
996be9ee 363 foreach my $opt (@_) {
364 if($opt =~ m{^dump_to_dir:(.*)$}) {
365 $self->dump_to_dir($1)
366 }
367 elsif($opt eq 'make_schema_at') {
368 no strict 'refs';
996be9ee 369 *{"${cpkg}::make_schema_at"} = \&make_schema_at;
370 }
a8d229ff 371 elsif($opt eq 'naming') {
372 no strict 'refs';
373 *{"${cpkg}::naming"} = sub { $self->naming(@_) };
374 }
f22644d7 375 elsif($opt eq 'use_namespaces') {
376 no strict 'refs';
377 *{"${cpkg}::use_namespaces"} = sub { $self->use_namespaces(@_) };
378 }
996be9ee 379 }
380}
381
382=head2 make_schema_at
383
530e0bf6 384=over 4
385
707fb247 386=item Arguments: $schema_class_name, \%loader_options, \@connect_info
530e0bf6 387
707fb247 388=item Return Value: $schema_class_name
530e0bf6 389
390=back
391
707fb247 392This function creates a DBIx::Class schema from an existing RDBMS
393schema. With the C<dump_directory> option, generates a set of
394DBIx::Class classes from an existing database schema read from the
395given dsn. Without a C<dump_directory>, creates schema classes in
396memory at runtime without generating on-disk class files.
996be9ee 397
707fb247 398For a complete list of supported loader_options, see
399L<DBIx::Class::Schema::Loader::Base>
483987b9 400
35a87f06 401The last hashref in the C<\@connect_info> can specify the L</loader_class>.
402
707fb247 403This function can be imported in the usual way, as illustrated in
404these Examples:
996be9ee 405
5223f24a 406 # Simple example, creates as a new class 'New::Schema::Name' in
407 # memory in the running perl interpreter.
996be9ee 408 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
409 make_schema_at(
410 'New::Schema::Name',
59cfa251 411 { debug => 1 },
35a87f06 412 [ 'dbi:Pg:dbname="foo"','postgres','',
413 { loader_class => 'MyLoader' } # optionally
414 ],
996be9ee 415 );
416
707fb247 417 # Inside a script, specifying a dump directory in which to write
418 # class files
996be9ee 419 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
420 make_schema_at(
421 'New::Schema::Name',
59cfa251 422 { debug => 1, dump_directory => './lib' },
35a87f06 423 [ 'dbi:Pg:dbname="foo"','postgres','',
424 { loader_class => 'MyLoader' } # optionally
425 ],
996be9ee 426 );
427
b486b265 428The last hashref in the C<\@connect_info> is checked for loader arguments such
429as C<loader_options> and C<loader_class>, see L</connection> for more details.
430
996be9ee 431=cut
432
433sub make_schema_at {
434 my ($target, $opts, $connect_info) = @_;
435
483987b9 436 {
437 no strict 'refs';
438 @{$target . '::ISA'} = qw/DBIx::Class::Schema::Loader/;
439 }
440
71a6e88a 441 eval { $target->_loader_invoked(0) };
442
483987b9 443 $target->loader_options($opts);
444 $target->connection(@$connect_info);
996be9ee 445}
446
b97c2c1e 447=head2 rescan
448
530e0bf6 449=over 4
450
451=item Return Value: @new_monikers
452
453=back
454
b97c2c1e 455Re-scans the database for newly added tables since the initial
456load, and adds them to the schema at runtime, including relationships,
457etc. Does not process drops or changes.
458
a60b5b8d 459Returns a list of the new monikers added.
460
b97c2c1e 461=cut
462
39d5612f 463sub rescan { my $self = shift; $self->loader->rescan($self) }
b97c2c1e 464
a8d229ff 465=head2 naming
466
467=over 4
468
469=item Arguments: \%opts | $ver
470
471=back
472
473Controls the naming options for backward compatibility, see
474L<DBIx::Class::Schema::Loader::Base/naming> for details.
475
476To upgrade a dynamic schema, use:
477
478 __PACKAGE__->naming('current');
479
480Can be imported into your dump script and called as a function as well:
481
482 naming('v4');
996be9ee 483
f22644d7 484=head2 use_namespaces
485
486=over 4
487
488=item Arguments: 1|0
489
490=back
491
492Controls the use_namespaces options for backward compatibility, see
493L<DBIx::Class::Schema::Loader::Base/use_namespaces> for details.
494
495To upgrade a dynamic schema, use:
496
497 __PACKAGE__->use_namespaces(1);
498
499Can be imported into your dump script and called as a function as well:
500
501 use_namespaces(1);
502
996be9ee 503=head1 KNOWN ISSUES
504
505=head2 Multiple Database Schemas
506
c4a69b87 507See L<DBIx::Class::Schema::Loader::Base/db_schema>.
89ecd854 508
be80bba7 509=head1 ACKNOWLEDGEMENTS
a78e3fed 510
be80bba7 511Matt S Trout, all of the #dbix-class folks, and everyone who's ever sent
512in a bug report or suggestion.
fbd83464 513
8a6b44ef 514Based on L<DBIx::Class::Loader> by Sebastian Riedel
a78e3fed 515
516Based upon the work of IKEBE Tomohiro
517
be80bba7 518=head1 AUTHOR
a78e3fed 519
be80bba7 520blblack: Brandon Black <blblack@gmail.com>
521
522=head1 CONTRIBUTORS
523
a41f1fd4 524ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
be80bba7 525
526arcanez: Justin Hunter <justin.d.hunter@gmail.com>
527
528ash: Ash Berlin <ash@cpan.org>
529
412638fa 530btilly: Ben Tilly <btilly@gmail.com>
59388920 531
be80bba7 532Caelum: Rafael Kitover <rkitover@cpan.org>
533
534TSUNODA Kazuya <drk@drk7.jp>
535
f84a7413 536rbo: Robert Bohne <rbo@cpan.org>
be80bba7 537
69fca474 538ribasushi: Peter Rabbitson <ribasushi@cpan.org>
1f625792 539
fdd8ff16 540gugu: Andrey Kostenko <a.kostenko@rambler-co.ru>
541
65e705c3 542jhannah: Jay Hannah <jay@jays.net>
543
7b505bbd 544rbuels: Robert Buels <rmb32@cornell.edu>
545
accc9e96 546timbunce: Tim Bunce <timb@cpan.org>
da21e0cf 547
c21bfb92 548mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
549
d36c8734 550mstratman: Mark A. Stratman <stratman@gmail.com>
551
827dff19 552kane: Jos Boumans <kane@cpan.org>
553
43b982ea 554waawaamilk: Nigel McNie <nigel@mcnie.name>
555
96f68869 556acmoore: Andrew Moore <amoore@cpan.org>
557
2a5dcfb3 558bphillips: Brian Phillips <bphillips@cpan.org>
559
8763ffda 560schwern: Michael G. Schwern <mschwern@cpan.org>
561
9fd0726a 562hobbs: Andrew Rodland <arodland@cpan.org>
563
c9cf9b4d 564domm: Thomas Klausner <domm@plix.at>
565
12333562 566spb: Stephen Bennett <spb@exherbo.org>
567
71687093 568Matias E. Fernandez <mfernandez@pisco.ch>
569
07f39b47 570Al Newkirk <awncorp@cpan.org>
571
be80bba7 572... and lots of other folks. If we forgot you, please write the current
573maintainer or RT.
a78e3fed 574
9cc8e7e1 575=head1 COPYRIGHT & LICENSE
576
577Copyright (c) 2006 - 2009 by the aforementioned
578L<DBIx::Class::Schema::Loader/AUTHOR> and
579L<DBIx::Class::Schema::Loader/CONTRIBUTORS>.
a78e3fed 580
581This library is free software; you can redistribute it and/or modify it under
582the same terms as Perl itself.
583
584=head1 SEE ALSO
585
996be9ee 586L<DBIx::Class>, L<DBIx::Class::Manual::ExampleSchema>
a78e3fed 587
588=cut
589
5901;
71a6e88a 591# vim:et sts=4 sw=4 tw=0: