croak if make_schema_at eval fails
[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
5223f24a 16our $VERSION = '0.03001';
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,
8f9d7ce5 52PostgreSQL, 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
8f9d7ce5 232use this to generate a rough draft manual schema from a dsn
996be9ee 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
5223f24a 239 # Simple example, creates as a new class 'New::Schema::Name' in
240 # memory in the running perl interpreter.
996be9ee 241 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
242 make_schema_at(
243 'New::Schema::Name',
244 { relationships => 1, debug => 1 },
245 [ 'dbi:Pg:dbname="foo"','postgres' ],
246 );
247
248 # Complex: dump loaded schema to disk, all from the commandline:
5223f24a 249 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" ])'
996be9ee 250
251 # Same, but inside a script, and using a different way to specify the
252 # dump directory:
253 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
254 make_schema_at(
255 'New::Schema::Name',
256 { relationships => 1, debug => 1, dump_directory => './lib' },
257 [ 'dbi:Pg:dbname="foo"','postgres' ],
258 );
259
260=cut
261
262sub make_schema_at {
263 my ($target, $opts, $connect_info) = @_;
264
265 my $opts_dumped = dump($opts);
266 my $cinfo_dumped = dump(@$connect_info);
267 eval qq|
268 package $target;
269 use base qw/DBIx::Class::Schema::Loader/;
270 __PACKAGE__->loader_options($opts_dumped);
271 __PACKAGE__->connection($cinfo_dumped);
272 |;
6b707971 273 croak "make_schema_at failed: $@" if $@;
996be9ee 274}
275
276=head1 EXAMPLE
277
278Using the example in L<DBIx::Class::Manual::ExampleSchema> as a basis
279replace the DB::Main with the following code:
280
281 package DB::Main;
282
283 use base qw/DBIx::Class::Schema::Loader/;
284
285 __PACKAGE__->loader_options(
286 relationships => 1,
287 debug => 1,
288 );
289 __PACKAGE__->connection('dbi:SQLite:example.db');
290
291 1;
292
293and remove the Main directory tree (optional). Every thing else
294should work the same
295
296=head1 DEPRECATED METHODS
297
298You don't need to read anything in this section unless you're upgrading
299code that was written against pre-0.03 versions of this module. This
300version is intended to be backwards-compatible with pre-0.03 code, but
301will issue warnings about your usage of deprecated features/methods.
302
303=head2 load_from_connection
304
305This deprecated method is now roughly an alias for L</loader_options>.
306
8f9d7ce5 307This method *will* disappear in a future version.
996be9ee 308
309For now, using this method will invoke the legacy behavior for
310backwards compatibility, and merely emit a warning about upgrading
311your code.
312
313It also reverts the default inflection scheme to
314use L<Lingua::EN::Inflect> just like pre-0.03 versions of this
315module did.
316
317You can force these legacy inflections with the
318option C<legacy_default_inflections>, even after switch over
319to the preferred L</loader_options> way of doing things.
320
321See the source of this method for more details.
322
323=cut
324
325sub load_from_connection {
326 my ($self, %args) = @_;
8f9d7ce5 327
328 my $cmds_ver = $Catalyst::Model::DBIC::Schema::VERSION;
329 if($cmds_ver) {
330 if($cmds_ver < 0.14) {
331 warn 'You should upgrade your installation of'
332 . ' Catalyst::Model::DBIC::Schema to 0.14 or higher, then:';
333 }
334 warn 'You should regenerate your Model files, which may eliminate'
335 . ' the following deprecation warning:';
336 }
996be9ee 337 warn 'load_from_connection deprecated, please [re-]read the'
8f9d7ce5 338 . ' [new] DBIx::Class::Schema::Loader documentation';
996be9ee 339
340 # Support the old connect_info / dsn / etc args...
341 $args{connect_info} = [
342 delete $args{dsn},
343 delete $args{user},
344 delete $args{password},
345 delete $args{options},
346 ] if $args{dsn};
347
348 $self->connection(@{delete $args{connect_info}})
349 if $args{connect_info};
350
351 $self->loader_options('legacy_default_inflections' => 1, %args);
a78e3fed 352}
353
457eb8a6 354=head2 loader
355
356This is an accessor in the generated Schema class for accessing
996be9ee 357the L<DBIx::Class::Schema::Loader::Base> -based loader object
457eb8a6 358that was used during construction. See the
996be9ee 359L<DBIx::Class::Schema::Loader::Base> docs for more information
457eb8a6 360on the available loader methods there.
361
996be9ee 362This accessor is deprecated. Do not use it. Anything you can
363get from C<loader>, you can get via the normal L<DBIx::Class::Schema>
364methods, and your code will be more robust and forward-thinking
365for doing so.
366
367If you're already using C<loader> in your code, make an effort
368to get rid of it. If you think you've found a situation where it
8f9d7ce5 369is necessary, let me know and we'll see what we can do to remedy
996be9ee 370that situation.
371
372In some future version, this accessor *will* disappear. It was
373apparently quite a design/API mistake to ever have exposed it to
374user-land in the first place, all things considered.
375
376=head1 KNOWN ISSUES
377
378=head2 Multiple Database Schemas
379
380Currently the loader is limited to working within a single schema
381(using the database vendors' definition of "schema"). If you
382have a multi-schema database with inter-schema relationships (which
8f9d7ce5 383is easy to do in PostgreSQL or DB2 for instance), you only get to
996be9ee 384automatically load the tables of one schema, and any relationships
385to tables in other schemas will be silently ignored.
386
387At some point in the future, an intelligent way around this might be
388devised, probably by allowing the C<db_schema> option to be an
389arrayref of schemas to load, or perhaps even offering schema
390constraint/exclusion options just like the table ones.
89ecd854 391
996be9ee 392In "normal" L<DBIx::Class::Schema> usage, manually-defined
393source classes and relationships have no problems crossing vendor schemas.
89ecd854 394
a78e3fed 395=head1 AUTHOR
396
f654c972 397Brandon Black, C<blblack@gmail.com>
fbd83464 398
8a6b44ef 399Based on L<DBIx::Class::Loader> by Sebastian Riedel
a78e3fed 400
401Based upon the work of IKEBE Tomohiro
402
403=head1 THANK YOU
404
405Adam Anderson, Andy Grundman, Autrijus Tang, Dan Kubb, David Naughton,
996be9ee 406Randal Schwartz, Simon Flack, Matt S Trout, everyone on #dbix-class, and
407all the others who've helped.
a78e3fed 408
409=head1 LICENSE
410
411This library is free software; you can redistribute it and/or modify it under
412the same terms as Perl itself.
413
414=head1 SEE ALSO
415
996be9ee 416L<DBIx::Class>, L<DBIx::Class::Manual::ExampleSchema>
a78e3fed 417
418=cut
419
4201;