remember all the digits
[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;
8a6b44ef 5use base qw/DBIx::Class::Schema/;
6use base qw/Class::Data::Accessor/;
457eb8a6 7use Carp;
8use UNIVERSAL::require;
996be9ee 9use Class::C3;
10use Data::Dump qw/ dump /;
c9f1d7b0 11use Scalar::Util qw/ weaken /;
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
074e81cd 16our $VERSION = '0.03000';
457eb8a6 17
996be9ee 18__PACKAGE__->mk_classaccessor('dump_to_dir');
457eb8a6 19__PACKAGE__->mk_classaccessor('loader');
996be9ee 20__PACKAGE__->mk_classaccessor('_loader_args');
a78e3fed 21
22=head1 NAME
23
18fca96a 24DBIx::Class::Schema::Loader - Dynamic definition of a DBIx::Class::Schema
a78e3fed 25
26=head1 SYNOPSIS
27
a4a19f3c 28 package My::Schema;
29 use base qw/DBIx::Class::Schema::Loader/;
a78e3fed 30
996be9ee 31 __PACKAGE__->loader_options(
32 relationships => 1,
33 constraint => '^foo.*',
34 # debug => 1,
a78e3fed 35 );
af6c2665 36
a4a19f3c 37 # in seperate application code ...
a78e3fed 38
a4a19f3c 39 use My::Schema;
a78e3fed 40
a4a19f3c 41 my $schema1 = My::Schema->connect( $dsn, $user, $password, $attrs);
42 # -or-
996be9ee 43 my $schema1 = "My::Schema"; $schema1->connection(as above);
074e81cd 44
996be9ee 45=head1 DESCRIPTION
074e81cd 46
fbd83464 47DBIx::Class::Schema::Loader automates the definition of a
996be9ee 48L<DBIx::Class::Schema> by scanning database table definitions and
49setting up the columns and primary keys.
a78e3fed 50
996be9ee 51DBIx::Class::Schema::Loader currently supports DBI for MySQL,
52Postgres, SQLite and DB2.
a78e3fed 53
996be9ee 54See L<DBIx::Class::Schema::Loader::DBI::Writing> for notes on writing
55your own vendor-specific subclass for an unsupported DBD driver.
a78e3fed 56
996be9ee 57This module requires L<DBIx::Class> 0.06 or later, and obsoletes
58the older L<DBIx::Class::Loader>.
89ecd854 59
996be9ee 60This module is designed more to get you up and running quickly against
61an existing database, or to be effective for simple situations, rather
62than to be what you use in the long term for a complex database/project.
89ecd854 63
64That being said, transitioning your code from a Schema generated by this
65module to one that doesn't use this module should be straightforward and
996be9ee 66painless (as long as you're not using any methods that are now deprecated
67in this document), so don't shy away from it just for fears of the
68transition down the road.
89ecd854 69
a78e3fed 70=head1 METHODS
71
996be9ee 72=head2 loader_options
a78e3fed 73
996be9ee 74Example in Synopsis above demonstrates a few common arguments. For
75detailed information on all of the arguments, most of which are
76only useful in fairly complex scenarios, see the
77L<DBIx::Class::Schema::Loader::Base> documentation.
a78e3fed 78
996be9ee 79This method is *required*, for backwards compatibility reasons. If
80you do not wish to change any options, just call it with an empty
81argument list during schema class initialization.
a78e3fed 82
996be9ee 83=cut
1031d4f6 84
996be9ee 85sub loader_options {
86 my $self = shift;
87
88 my %args;
89 if(ref $_[0] eq 'HASH') {
90 %args = %{$_[0]};
1031d4f6 91 }
92 else {
996be9ee 93 %args = @_;
1031d4f6 94 }
95
996be9ee 96 my $class = ref $self || $self;
97 $args{schema} = $self;
98 $args{schema_class} = $class;
c9f1d7b0 99 weaken($args{schema}) if ref $self;
100
996be9ee 101 $self->_loader_args(\%args);
102 $self->_invoke_loader if $self->storage && !$class->loader;
103
104 $self;
105}
106
107sub _invoke_loader {
108 my $self = shift;
109 my $class = ref $self || $self;
110
111 $self->_loader_args->{dump_directory} ||= $self->dump_to_dir;
af6c2665 112
996be9ee 113 # XXX this only works for relative storage_type, like ::DBI ...
114 my $impl = "DBIx::Class::Schema::Loader" . $self->storage_type;
a78e3fed 115 $impl->require or
996be9ee 116 croak qq/Could not load storage_type loader "$impl": / .
3385ac62 117 qq/"$UNIVERSAL::require::ERROR"/;
af6c2665 118
996be9ee 119 # XXX in the future when we get rid of ->loader, the next two
120 # lines can be replaced by "$impl->new(%{$self->_loader_args})->load;"
121 $class->loader($impl->new(%{$self->_loader_args}));
2a4b8262 122 $class->loader->load;
996be9ee 123
124
125 $self;
126}
127
128=head2 connection
129
074e81cd 130See L<DBIx::Class::Schema>.
996be9ee 131
132=cut
133
134sub connection {
135 my $self = shift->next::method(@_);
136
137 my $class = ref $self || $self;
138 $self->_invoke_loader if $self->_loader_args && !$class->loader;
139
140 return $self;
141}
142
143=head2 clone
144
074e81cd 145See L<DBIx::Class::Schema>.
996be9ee 146
147=cut
148
149sub clone {
150 my $self = shift;
151
152 my $clone = $self->next::method(@_);
153
154 $clone->_loader_args($self->_loader_args);
155 $clone->_loader_args->{schema} = $clone;
c9f1d7b0 156 weaken($clone->_loader_args->{schema});
996be9ee 157
158 $clone;
159}
160
161=head2 dump_to_dir
162
163Argument: directory name.
164
165Calling this as a class method on either L<DBIx::Class::Schema::Loader>
166or any derived schema class will cause all affected schemas to dump
167manual versions of themselves to the named directory when they are
168loaded. In order to be effective, this must be set before defining a
169connection on this schema class or any derived object (as the loading
074e81cd 170happens as soon as both a connection and loader_options are set, and
171only once per class).
996be9ee 172
173See L<DBIx::Class::Schema::Loader::Base/dump_directory> for more
174details on the dumping mechanism.
175
176This can also be set at module import time via the import option
177C<dump_to_dir:/foo/bar> to L<DBIx::Class::Schema::Loader>, where
178C</foo/bar> is the target directory.
179
180Examples:
181
182 # My::Schema isa DBIx::Class::Schema::Loader, and has connection info
183 # hardcoded in the class itself:
184 perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e1
185
186 # Same, but no hard-coded connection, so we must provide one:
187 perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e 'My::Schema->connection("dbi:Pg:dbname=foo", ...)'
188
189 # Or as a class method, as long as you get it done *before* defining a
190 # connection on this schema class or any derived object:
191 use My::Schema;
192 My::Schema->dump_to_dir('/foo/bar');
193 My::Schema->connection(........);
194
195 # Or as a class method on the DBIx::Class::Schema::Loader itself, which affects all
196 # derived schemas
197 use My::Schema;
198 use My::OtherSchema;
199 DBIx::Class::Schema::Loader->dump_to_dir('/foo/bar');
200 My::Schema->connection(.......);
201 My::OtherSchema->connection(.......);
202
203 # Another alternative to the above:
204 use DBIx::Class::Schema::Loader qw| dump_to_dir:/foo/bar |;
205 use My::Schema;
206 use My::OtherSchema;
207 My::Schema->connection(.......);
208 My::OtherSchema->connection(.......);
209
210=cut
211
212sub import {
213 my $self = shift;
214 return if !@_;
215 foreach my $opt (@_) {
216 if($opt =~ m{^dump_to_dir:(.*)$}) {
217 $self->dump_to_dir($1)
218 }
219 elsif($opt eq 'make_schema_at') {
220 no strict 'refs';
221 my $cpkg = (caller)[0];
222 *{"${cpkg}::make_schema_at"} = \&make_schema_at;
223 }
224 }
225}
226
227=head2 make_schema_at
228
229This simple function allows one to create a Loader-based schema
230in-memory on the fly without any on-disk class files of any
231kind. When used with the C<dump_directory> option, you can
232use this to generate a rought draft manual schema from a dsn
233without the intermediate step of creating a physical Loader-based
234schema class.
235
236This function can be exported/imported by the normal means, as
237illustrated in these Examples:
238
239 # Simple example...
240 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
241 make_schema_at(
242 'New::Schema::Name',
243 { relationships => 1, debug => 1 },
244 [ 'dbi:Pg:dbname="foo"','postgres' ],
245 );
246
247 # Complex: dump loaded schema to disk, all from the commandline:
248 perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at("New::Schema::Name", { relationships => 1 }, [ 'dbi:Pg:dbname="foo"','postgres' ])'
249
250 # Same, but inside a script, and using a different way to specify the
251 # dump directory:
252 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
253 make_schema_at(
254 'New::Schema::Name',
255 { relationships => 1, debug => 1, dump_directory => './lib' },
256 [ 'dbi:Pg:dbname="foo"','postgres' ],
257 );
258
259=cut
260
261sub make_schema_at {
262 my ($target, $opts, $connect_info) = @_;
263
264 my $opts_dumped = dump($opts);
265 my $cinfo_dumped = dump(@$connect_info);
266 eval qq|
267 package $target;
268 use base qw/DBIx::Class::Schema::Loader/;
269 __PACKAGE__->loader_options($opts_dumped);
270 __PACKAGE__->connection($cinfo_dumped);
271 |;
272}
273
274=head1 EXAMPLE
275
276Using the example in L<DBIx::Class::Manual::ExampleSchema> as a basis
277replace the DB::Main with the following code:
278
279 package DB::Main;
280
281 use base qw/DBIx::Class::Schema::Loader/;
282
283 __PACKAGE__->loader_options(
284 relationships => 1,
285 debug => 1,
286 );
287 __PACKAGE__->connection('dbi:SQLite:example.db');
288
289 1;
290
291and remove the Main directory tree (optional). Every thing else
292should work the same
293
294=head1 DEPRECATED METHODS
295
296You don't need to read anything in this section unless you're upgrading
297code that was written against pre-0.03 versions of this module. This
298version is intended to be backwards-compatible with pre-0.03 code, but
299will issue warnings about your usage of deprecated features/methods.
300
301=head2 load_from_connection
302
303This deprecated method is now roughly an alias for L</loader_options>.
304
996be9ee 305This method *will* dissappear in a future version.
306
307For now, using this method will invoke the legacy behavior for
308backwards compatibility, and merely emit a warning about upgrading
309your code.
310
311It also reverts the default inflection scheme to
312use L<Lingua::EN::Inflect> just like pre-0.03 versions of this
313module did.
314
315You can force these legacy inflections with the
316option C<legacy_default_inflections>, even after switch over
317to the preferred L</loader_options> way of doing things.
318
319See the source of this method for more details.
320
321=cut
322
323sub load_from_connection {
324 my ($self, %args) = @_;
325 warn 'load_from_connection deprecated, please [re-]read the'
326 . ' [new] DBIx::Class::Schema::Loader documentation';
327
328 # Support the old connect_info / dsn / etc args...
329 $args{connect_info} = [
330 delete $args{dsn},
331 delete $args{user},
332 delete $args{password},
333 delete $args{options},
334 ] if $args{dsn};
335
336 $self->connection(@{delete $args{connect_info}})
337 if $args{connect_info};
338
339 $self->loader_options('legacy_default_inflections' => 1, %args);
a78e3fed 340}
341
457eb8a6 342=head2 loader
343
344This is an accessor in the generated Schema class for accessing
996be9ee 345the L<DBIx::Class::Schema::Loader::Base> -based loader object
457eb8a6 346that was used during construction. See the
996be9ee 347L<DBIx::Class::Schema::Loader::Base> docs for more information
457eb8a6 348on the available loader methods there.
349
996be9ee 350This accessor is deprecated. Do not use it. Anything you can
351get from C<loader>, you can get via the normal L<DBIx::Class::Schema>
352methods, and your code will be more robust and forward-thinking
353for doing so.
354
355If you're already using C<loader> in your code, make an effort
356to get rid of it. If you think you've found a situation where it
357is neccesary, let me know and we'll see what we can do to remedy
358that situation.
359
360In some future version, this accessor *will* disappear. It was
361apparently quite a design/API mistake to ever have exposed it to
362user-land in the first place, all things considered.
363
364=head1 KNOWN ISSUES
365
366=head2 Multiple Database Schemas
367
368Currently the loader is limited to working within a single schema
369(using the database vendors' definition of "schema"). If you
370have a multi-schema database with inter-schema relationships (which
371is easy to do in Postgres or DB2 for instance), you only get to
372automatically load the tables of one schema, and any relationships
373to tables in other schemas will be silently ignored.
374
375At some point in the future, an intelligent way around this might be
376devised, probably by allowing the C<db_schema> option to be an
377arrayref of schemas to load, or perhaps even offering schema
378constraint/exclusion options just like the table ones.
89ecd854 379
996be9ee 380In "normal" L<DBIx::Class::Schema> usage, manually-defined
381source classes and relationships have no problems crossing vendor schemas.
89ecd854 382
a78e3fed 383=head1 AUTHOR
384
f654c972 385Brandon Black, C<blblack@gmail.com>
fbd83464 386
8a6b44ef 387Based on L<DBIx::Class::Loader> by Sebastian Riedel
a78e3fed 388
389Based upon the work of IKEBE Tomohiro
390
391=head1 THANK YOU
392
393Adam Anderson, Andy Grundman, Autrijus Tang, Dan Kubb, David Naughton,
996be9ee 394Randal Schwartz, Simon Flack, Matt S Trout, everyone on #dbix-class, and
395all the others who've helped.
a78e3fed 396
397=head1 LICENSE
398
399This library is free software; you can redistribute it and/or modify it under
400the same terms as Perl itself.
401
402=head1 SEE ALSO
403
996be9ee 404L<DBIx::Class>, L<DBIx::Class::Manual::ExampleSchema>
a78e3fed 405
406=cut
407
4081;