update Changes with schema_base_class fix
[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(
237 %{ $self->_loader_args }
238 );
239
240 if ($temp_loader->schema_base_class || $temp_loader->schema_components) {
241 my @components = @{ $temp_loader->schema_components }
242 if $temp_loader->schema_components;
243
244 push @components, ('+'.$temp_loader->schema_base_class)
245 if $temp_loader->schema_base_class;
246
de89deba 247 $class->load_components(@components);
cc15b78f 248
a1781f7f 249 # This hack is necessary because we changed @ISA of $self through
de89deba 250 # ->load_components and we are now in a different place in the mro.
cc15b78f 251 no warnings 'redefine';
252
253 local *connection = subname __PACKAGE__.'::connection' => sub {
254 my $self = shift;
255 $self->next::method(@_);
256 };
257
de89deba 258 my @linear_isa = @{ mro::get_linear_isa($class) };
259
260 my $next_method;
261
262 foreach my $i (1..$#linear_isa) {
263 no strict 'refs';
264 $next_method = *{$linear_isa[$i].'::connection'}{CODE};
265 last if $next_method;
266 }
267
268 $self = $self->$next_method(@_);
cc15b78f 269 }
a1781f7f 270 else {
271 $self = $self->next::method(@_);
272 }
996be9ee 273
59cfa251 274 if(!$class->_loader_invoked) {
fa994d3c 275 $self->_invoke_loader
276 }
996be9ee 277
278 return $self;
279}
280
281=head2 clone
282
530e0bf6 283See L<DBIx::Class::Schema/clone>.
996be9ee 284
285=cut
286
287sub clone {
288 my $self = shift;
289
290 my $clone = $self->next::method(@_);
291
fa994d3c 292 if($clone->_loader_args) {
293 $clone->_loader_args->{schema} = $clone;
294 weaken($clone->_loader_args->{schema});
295 }
996be9ee 296
297 $clone;
298}
299
300=head2 dump_to_dir
301
530e0bf6 302=over 4
303
304=item Argument: $directory
305
306=back
996be9ee 307
308Calling this as a class method on either L<DBIx::Class::Schema::Loader>
707fb247 309or any derived schema class will cause all schemas to dump
996be9ee 310manual versions of themselves to the named directory when they are
311loaded. In order to be effective, this must be set before defining a
312connection on this schema class or any derived object (as the loading
074e81cd 313happens as soon as both a connection and loader_options are set, and
314only once per class).
996be9ee 315
316See L<DBIx::Class::Schema::Loader::Base/dump_directory> for more
317details on the dumping mechanism.
318
319This can also be set at module import time via the import option
320C<dump_to_dir:/foo/bar> to L<DBIx::Class::Schema::Loader>, where
321C</foo/bar> is the target directory.
322
323Examples:
324
325 # My::Schema isa DBIx::Class::Schema::Loader, and has connection info
326 # hardcoded in the class itself:
327 perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e1
328
329 # Same, but no hard-coded connection, so we must provide one:
330 perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e 'My::Schema->connection("dbi:Pg:dbname=foo", ...)'
331
332 # Or as a class method, as long as you get it done *before* defining a
333 # connection on this schema class or any derived object:
334 use My::Schema;
335 My::Schema->dump_to_dir('/foo/bar');
336 My::Schema->connection(........);
337
338 # Or as a class method on the DBIx::Class::Schema::Loader itself, which affects all
339 # derived schemas
340 use My::Schema;
341 use My::OtherSchema;
342 DBIx::Class::Schema::Loader->dump_to_dir('/foo/bar');
343 My::Schema->connection(.......);
344 My::OtherSchema->connection(.......);
345
346 # Another alternative to the above:
347 use DBIx::Class::Schema::Loader qw| dump_to_dir:/foo/bar |;
348 use My::Schema;
349 use My::OtherSchema;
350 My::Schema->connection(.......);
351 My::OtherSchema->connection(.......);
352
353=cut
354
355sub import {
356 my $self = shift;
a8d229ff 357
996be9ee 358 return if !@_;
a8d229ff 359
360 my $cpkg = (caller)[0];
361
996be9ee 362 foreach my $opt (@_) {
363 if($opt =~ m{^dump_to_dir:(.*)$}) {
364 $self->dump_to_dir($1)
365 }
366 elsif($opt eq 'make_schema_at') {
367 no strict 'refs';
996be9ee 368 *{"${cpkg}::make_schema_at"} = \&make_schema_at;
369 }
a8d229ff 370 elsif($opt eq 'naming') {
371 no strict 'refs';
372 *{"${cpkg}::naming"} = sub { $self->naming(@_) };
373 }
f22644d7 374 elsif($opt eq 'use_namespaces') {
375 no strict 'refs';
376 *{"${cpkg}::use_namespaces"} = sub { $self->use_namespaces(@_) };
377 }
996be9ee 378 }
379}
380
381=head2 make_schema_at
382
530e0bf6 383=over 4
384
707fb247 385=item Arguments: $schema_class_name, \%loader_options, \@connect_info
530e0bf6 386
707fb247 387=item Return Value: $schema_class_name
530e0bf6 388
389=back
390
707fb247 391This function creates a DBIx::Class schema from an existing RDBMS
392schema. With the C<dump_directory> option, generates a set of
393DBIx::Class classes from an existing database schema read from the
394given dsn. Without a C<dump_directory>, creates schema classes in
395memory at runtime without generating on-disk class files.
996be9ee 396
707fb247 397For a complete list of supported loader_options, see
398L<DBIx::Class::Schema::Loader::Base>
483987b9 399
35a87f06 400The last hashref in the C<\@connect_info> can specify the L</loader_class>.
401
707fb247 402This function can be imported in the usual way, as illustrated in
403these Examples:
996be9ee 404
5223f24a 405 # Simple example, creates as a new class 'New::Schema::Name' in
406 # memory in the running perl interpreter.
996be9ee 407 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
408 make_schema_at(
409 'New::Schema::Name',
59cfa251 410 { debug => 1 },
35a87f06 411 [ 'dbi:Pg:dbname="foo"','postgres','',
412 { loader_class => 'MyLoader' } # optionally
413 ],
996be9ee 414 );
415
707fb247 416 # Inside a script, specifying a dump directory in which to write
417 # class files
996be9ee 418 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
419 make_schema_at(
420 'New::Schema::Name',
59cfa251 421 { debug => 1, dump_directory => './lib' },
35a87f06 422 [ 'dbi:Pg:dbname="foo"','postgres','',
423 { loader_class => 'MyLoader' } # optionally
424 ],
996be9ee 425 );
426
b486b265 427The last hashref in the C<\@connect_info> is checked for loader arguments such
428as C<loader_options> and C<loader_class>, see L</connection> for more details.
429
996be9ee 430=cut
431
432sub make_schema_at {
433 my ($target, $opts, $connect_info) = @_;
434
483987b9 435 {
436 no strict 'refs';
437 @{$target . '::ISA'} = qw/DBIx::Class::Schema::Loader/;
438 }
439
71a6e88a 440 eval { $target->_loader_invoked(0) };
441
483987b9 442 $target->loader_options($opts);
443 $target->connection(@$connect_info);
996be9ee 444}
445
b97c2c1e 446=head2 rescan
447
530e0bf6 448=over 4
449
450=item Return Value: @new_monikers
451
452=back
453
b97c2c1e 454Re-scans the database for newly added tables since the initial
455load, and adds them to the schema at runtime, including relationships,
456etc. Does not process drops or changes.
457
a60b5b8d 458Returns a list of the new monikers added.
459
b97c2c1e 460=cut
461
39d5612f 462sub rescan { my $self = shift; $self->loader->rescan($self) }
b97c2c1e 463
a8d229ff 464=head2 naming
465
466=over 4
467
468=item Arguments: \%opts | $ver
469
470=back
471
472Controls the naming options for backward compatibility, see
473L<DBIx::Class::Schema::Loader::Base/naming> for details.
474
475To upgrade a dynamic schema, use:
476
477 __PACKAGE__->naming('current');
478
479Can be imported into your dump script and called as a function as well:
480
481 naming('v4');
996be9ee 482
f22644d7 483=head2 use_namespaces
484
485=over 4
486
487=item Arguments: 1|0
488
489=back
490
491Controls the use_namespaces options for backward compatibility, see
492L<DBIx::Class::Schema::Loader::Base/use_namespaces> for details.
493
494To upgrade a dynamic schema, use:
495
496 __PACKAGE__->use_namespaces(1);
497
498Can be imported into your dump script and called as a function as well:
499
500 use_namespaces(1);
501
996be9ee 502=head1 KNOWN ISSUES
503
504=head2 Multiple Database Schemas
505
c4a69b87 506See L<DBIx::Class::Schema::Loader::Base/db_schema>.
89ecd854 507
be80bba7 508=head1 ACKNOWLEDGEMENTS
a78e3fed 509
be80bba7 510Matt S Trout, all of the #dbix-class folks, and everyone who's ever sent
511in a bug report or suggestion.
fbd83464 512
8a6b44ef 513Based on L<DBIx::Class::Loader> by Sebastian Riedel
a78e3fed 514
515Based upon the work of IKEBE Tomohiro
516
be80bba7 517=head1 AUTHOR
a78e3fed 518
be80bba7 519blblack: Brandon Black <blblack@gmail.com>
520
521=head1 CONTRIBUTORS
522
a41f1fd4 523ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
be80bba7 524
525arcanez: Justin Hunter <justin.d.hunter@gmail.com>
526
527ash: Ash Berlin <ash@cpan.org>
528
412638fa 529btilly: Ben Tilly <btilly@gmail.com>
59388920 530
be80bba7 531Caelum: Rafael Kitover <rkitover@cpan.org>
532
533TSUNODA Kazuya <drk@drk7.jp>
534
f84a7413 535rbo: Robert Bohne <rbo@cpan.org>
be80bba7 536
69fca474 537ribasushi: Peter Rabbitson <ribasushi@cpan.org>
1f625792 538
fdd8ff16 539gugu: Andrey Kostenko <a.kostenko@rambler-co.ru>
540
65e705c3 541jhannah: Jay Hannah <jay@jays.net>
542
7b505bbd 543rbuels: Robert Buels <rmb32@cornell.edu>
544
accc9e96 545timbunce: Tim Bunce <timb@cpan.org>
da21e0cf 546
c21bfb92 547mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
548
d36c8734 549mstratman: Mark A. Stratman <stratman@gmail.com>
550
827dff19 551kane: Jos Boumans <kane@cpan.org>
552
43b982ea 553waawaamilk: Nigel McNie <nigel@mcnie.name>
554
96f68869 555acmoore: Andrew Moore <amoore@cpan.org>
556
2a5dcfb3 557bphillips: Brian Phillips <bphillips@cpan.org>
558
8763ffda 559schwern: Michael G. Schwern <mschwern@cpan.org>
560
9fd0726a 561hobbs: Andrew Rodland <arodland@cpan.org>
562
c9cf9b4d 563domm: Thomas Klausner <domm@plix.at>
564
12333562 565spb: Stephen Bennett <spb@exherbo.org>
566
71687093 567Matias E. Fernandez <mfernandez@pisco.ch>
568
07f39b47 569Al Newkirk <awncorp@cpan.org>
570
be80bba7 571... and lots of other folks. If we forgot you, please write the current
572maintainer or RT.
a78e3fed 573
9cc8e7e1 574=head1 COPYRIGHT & LICENSE
575
576Copyright (c) 2006 - 2009 by the aforementioned
577L<DBIx::Class::Schema::Loader/AUTHOR> and
578L<DBIx::Class::Schema::Loader/CONTRIBUTORS>.
a78e3fed 579
580This library is free software; you can redistribute it and/or modify it under
581the same terms as Perl itself.
582
583=head1 SEE ALSO
584
996be9ee 585L<DBIx::Class>, L<DBIx::Class::Manual::ExampleSchema>
a78e3fed 586
587=cut
588
5891;
71a6e88a 590# vim:et sts=4 sw=4 tw=0: