refactor relationship building code for runtime table adds as well
[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/;
fa994d3c 7use Carp::Clan qw/^DBIx::Class/;
457eb8a6 8use UNIVERSAL::require;
996be9ee 9use Class::C3;
c9f1d7b0 10use Scalar::Util qw/ weaken /;
3980d69c 11
a4a19f3c 12# Always remember to do all digits for the version even if they're 0
13# i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
14# brain damage and presumably various other packaging systems too
32f784fc 15our $VERSION = '0.03999_01';
457eb8a6 16
996be9ee 17__PACKAGE__->mk_classaccessor('dump_to_dir');
59cfa251 18__PACKAGE__->mk_classaccessor('_loader_args' => {});
19__PACKAGE__->mk_classaccessor('_loader_invoked');
a78e3fed 20
21=head1 NAME
22
18fca96a 23DBIx::Class::Schema::Loader - Dynamic definition of a DBIx::Class::Schema
a78e3fed 24
25=head1 SYNOPSIS
26
a4a19f3c 27 package My::Schema;
28 use base qw/DBIx::Class::Schema::Loader/;
a78e3fed 29
996be9ee 30 __PACKAGE__->loader_options(
996be9ee 31 constraint => '^foo.*',
32 # debug => 1,
a78e3fed 33 );
af6c2665 34
a4a19f3c 35 # in seperate application code ...
a78e3fed 36
a4a19f3c 37 use My::Schema;
a78e3fed 38
a4a19f3c 39 my $schema1 = My::Schema->connect( $dsn, $user, $password, $attrs);
40 # -or-
996be9ee 41 my $schema1 = "My::Schema"; $schema1->connection(as above);
074e81cd 42
996be9ee 43=head1 DESCRIPTION
074e81cd 44
fbd83464 45DBIx::Class::Schema::Loader automates the definition of a
996be9ee 46L<DBIx::Class::Schema> by scanning database table definitions and
d65cda9e 47setting up the columns, primary keys, and relationships.
a78e3fed 48
d65cda9e 49DBIx::Class::Schema::Loader currently supports only the DBI storage type.
50It has explicit support for L<DBD::Pg>, L<DBD::mysql>, L<DBD::DB2>, and
51L<DBD::SQLite>. Other DBI drivers may function to a greater or lesser
52degree with this loader, depending on how much of the DBI spec they
53implement, and how standard their implementation is. Patches to make
54other DBDs work correctly welcome.
a78e3fed 55
996be9ee 56See L<DBIx::Class::Schema::Loader::DBI::Writing> for notes on writing
57your own vendor-specific subclass for an unsupported DBD driver.
a78e3fed 58
996be9ee 59This module requires L<DBIx::Class> 0.06 or later, and obsoletes
60the older L<DBIx::Class::Loader>.
89ecd854 61
996be9ee 62This module is designed more to get you up and running quickly against
63an existing database, or to be effective for simple situations, rather
64than to be what you use in the long term for a complex database/project.
89ecd854 65
66That being said, transitioning your code from a Schema generated by this
67module to one that doesn't use this module should be straightforward and
59cfa251 68painless, so don't shy away from it just for fears of the transition down
69the road.
89ecd854 70
a78e3fed 71=head1 METHODS
72
996be9ee 73=head2 loader_options
a78e3fed 74
996be9ee 75Example in Synopsis above demonstrates a few common arguments. For
76detailed information on all of the arguments, most of which are
77only useful in fairly complex scenarios, see the
78L<DBIx::Class::Schema::Loader::Base> documentation.
a78e3fed 79
59cfa251 80One must call C<loader_options> before any connection is made,
81or embed the C<loader_options> in the connection information itself
82as shown below. Setting C<loader_options> after the connection has
83already been made is useless.
a78e3fed 84
996be9ee 85=cut
1031d4f6 86
996be9ee 87sub loader_options {
88 my $self = shift;
89
d65cda9e 90 my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
996be9ee 91 $self->_loader_args(\%args);
996be9ee 92
93 $self;
94}
95
96sub _invoke_loader {
97 my $self = shift;
98 my $class = ref $self || $self;
99
59cfa251 100 my $args = $self->_loader_args;
101
102 # set up the schema/schema_class arguments
103 $args->{schema} = $self;
104 $args->{schema_class} = $class;
105 weaken($args->{schema}) if ref $self;
106 $args->{dump_directory} ||= $self->dump_to_dir;
af6c2665 107
996be9ee 108 # XXX this only works for relative storage_type, like ::DBI ...
109 my $impl = "DBIx::Class::Schema::Loader" . $self->storage_type;
a78e3fed 110 $impl->require or
996be9ee 111 croak qq/Could not load storage_type loader "$impl": / .
3385ac62 112 qq/"$UNIVERSAL::require::ERROR"/;
af6c2665 113
59cfa251 114 $impl->new(%$args)->load;
115 $self->_loader_invoked(1);
996be9ee 116
996be9ee 117 $self;
118}
119
120=head2 connection
121
d65cda9e 122See L<DBIx::Class::Schema> for basic usage.
123
124If the final argument is a hashref, and it contains a key C<loader_options>,
125that key will be deleted, and its value will be used for the loader options,
126just as if set via the L</loader_options> method above.
127
128The actual auto-loading operation (the heart of this module) will be invoked
129as soon as the connection information is defined.
996be9ee 130
131=cut
132
133sub connection {
d65cda9e 134 my $self = shift;
135
136 if($_[-1] && ref $_[-1] eq 'HASH') {
137 if(my $loader_opts = delete $_[-1]->{loader_options}) {
138 $self->loader_options($loader_opts);
fd64d90d 139 pop @_ if !keys %{$_[-1]};
d65cda9e 140 }
141 }
142
143 $self = $self->next::method(@_);
996be9ee 144
145 my $class = ref $self || $self;
59cfa251 146 if(!$class->_loader_invoked) {
fa994d3c 147 $self->_invoke_loader
148 }
996be9ee 149
150 return $self;
151}
152
153=head2 clone
154
074e81cd 155See L<DBIx::Class::Schema>.
996be9ee 156
157=cut
158
159sub clone {
160 my $self = shift;
161
162 my $clone = $self->next::method(@_);
163
fa994d3c 164 if($clone->_loader_args) {
165 $clone->_loader_args->{schema} = $clone;
166 weaken($clone->_loader_args->{schema});
167 }
996be9ee 168
169 $clone;
170}
171
172=head2 dump_to_dir
173
174Argument: directory name.
175
176Calling this as a class method on either L<DBIx::Class::Schema::Loader>
177or any derived schema class will cause all affected schemas to dump
178manual versions of themselves to the named directory when they are
179loaded. In order to be effective, this must be set before defining a
180connection on this schema class or any derived object (as the loading
074e81cd 181happens as soon as both a connection and loader_options are set, and
182only once per class).
996be9ee 183
184See L<DBIx::Class::Schema::Loader::Base/dump_directory> for more
185details on the dumping mechanism.
186
187This can also be set at module import time via the import option
188C<dump_to_dir:/foo/bar> to L<DBIx::Class::Schema::Loader>, where
189C</foo/bar> is the target directory.
190
191Examples:
192
193 # My::Schema isa DBIx::Class::Schema::Loader, and has connection info
194 # hardcoded in the class itself:
195 perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e1
196
197 # Same, but no hard-coded connection, so we must provide one:
198 perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e 'My::Schema->connection("dbi:Pg:dbname=foo", ...)'
199
200 # Or as a class method, as long as you get it done *before* defining a
201 # connection on this schema class or any derived object:
202 use My::Schema;
203 My::Schema->dump_to_dir('/foo/bar');
204 My::Schema->connection(........);
205
206 # Or as a class method on the DBIx::Class::Schema::Loader itself, which affects all
207 # derived schemas
208 use My::Schema;
209 use My::OtherSchema;
210 DBIx::Class::Schema::Loader->dump_to_dir('/foo/bar');
211 My::Schema->connection(.......);
212 My::OtherSchema->connection(.......);
213
214 # Another alternative to the above:
215 use DBIx::Class::Schema::Loader qw| dump_to_dir:/foo/bar |;
216 use My::Schema;
217 use My::OtherSchema;
218 My::Schema->connection(.......);
219 My::OtherSchema->connection(.......);
220
221=cut
222
223sub import {
224 my $self = shift;
225 return if !@_;
226 foreach my $opt (@_) {
227 if($opt =~ m{^dump_to_dir:(.*)$}) {
228 $self->dump_to_dir($1)
229 }
230 elsif($opt eq 'make_schema_at') {
231 no strict 'refs';
232 my $cpkg = (caller)[0];
233 *{"${cpkg}::make_schema_at"} = \&make_schema_at;
234 }
235 }
236}
237
238=head2 make_schema_at
239
240This simple function allows one to create a Loader-based schema
241in-memory on the fly without any on-disk class files of any
242kind. When used with the C<dump_directory> option, you can
8f9d7ce5 243use this to generate a rough draft manual schema from a dsn
996be9ee 244without the intermediate step of creating a physical Loader-based
245schema class.
246
483987b9 247The return value is the input class name.
248
996be9ee 249This function can be exported/imported by the normal means, as
250illustrated in these Examples:
251
5223f24a 252 # Simple example, creates as a new class 'New::Schema::Name' in
253 # memory in the running perl interpreter.
996be9ee 254 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
255 make_schema_at(
256 'New::Schema::Name',
59cfa251 257 { debug => 1 },
996be9ee 258 [ 'dbi:Pg:dbname="foo"','postgres' ],
259 );
260
261 # Complex: dump loaded schema to disk, all from the commandline:
59cfa251 262 perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at("New::Schema::Name", { debug => 1 }, [ "dbi:Pg:dbname=foo","postgres" ])'
996be9ee 263
264 # Same, but inside a script, and using a different way to specify the
265 # dump directory:
266 use DBIx::Class::Schema::Loader qw/ make_schema_at /;
267 make_schema_at(
268 'New::Schema::Name',
59cfa251 269 { debug => 1, dump_directory => './lib' },
996be9ee 270 [ 'dbi:Pg:dbname="foo"','postgres' ],
271 );
272
273=cut
274
275sub make_schema_at {
276 my ($target, $opts, $connect_info) = @_;
277
483987b9 278 {
279 no strict 'refs';
280 @{$target . '::ISA'} = qw/DBIx::Class::Schema::Loader/;
281 }
282
283 $target->loader_options($opts);
284 $target->connection(@$connect_info);
996be9ee 285}
286
287=head1 EXAMPLE
288
289Using the example in L<DBIx::Class::Manual::ExampleSchema> as a basis
290replace the DB::Main with the following code:
291
292 package DB::Main;
293
294 use base qw/DBIx::Class::Schema::Loader/;
295
296 __PACKAGE__->loader_options(
996be9ee 297 debug => 1,
298 );
299 __PACKAGE__->connection('dbi:SQLite:example.db');
300
301 1;
302
303and remove the Main directory tree (optional). Every thing else
304should work the same
305
996be9ee 306=head1 KNOWN ISSUES
307
308=head2 Multiple Database Schemas
309
310Currently the loader is limited to working within a single schema
311(using the database vendors' definition of "schema"). If you
312have a multi-schema database with inter-schema relationships (which
8f9d7ce5 313is easy to do in PostgreSQL or DB2 for instance), you only get to
996be9ee 314automatically load the tables of one schema, and any relationships
315to tables in other schemas will be silently ignored.
316
317At some point in the future, an intelligent way around this might be
318devised, probably by allowing the C<db_schema> option to be an
d65cda9e 319arrayref of schemas to load.
89ecd854 320
996be9ee 321In "normal" L<DBIx::Class::Schema> usage, manually-defined
322source classes and relationships have no problems crossing vendor schemas.
89ecd854 323
a78e3fed 324=head1 AUTHOR
325
f654c972 326Brandon Black, C<blblack@gmail.com>
fbd83464 327
8a6b44ef 328Based on L<DBIx::Class::Loader> by Sebastian Riedel
a78e3fed 329
330Based upon the work of IKEBE Tomohiro
331
332=head1 THANK YOU
333
d65cda9e 334Matt S Trout, all of the #dbix-class folks, and everyone who's ever sent
335in a bug report or suggestion.
a78e3fed 336
337=head1 LICENSE
338
339This library is free software; you can redistribute it and/or modify it under
340the same terms as Perl itself.
341
342=head1 SEE ALSO
343
996be9ee 344L<DBIx::Class>, L<DBIx::Class::Manual::ExampleSchema>
a78e3fed 345
346=cut
347
3481;