X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader.pm;h=2b33b0f56f9eef90aa48e9d0b55bcb6f75bac260;hb=85f65df633434e4aece7aacbadbf2ecbf7be3f62;hp=6c7c87a78fcdde9866ff5739960500ff980ddf40;hpb=fd64d90d6e091f7036d297a23008648f38259793;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader.pm b/lib/DBIx/Class/Schema/Loader.pm index 6c7c87a..2b33b0f 100644 --- a/lib/DBIx/Class/Schema/Loader.pm +++ b/lib/DBIx/Class/Schema/Loader.pm @@ -2,9 +2,8 @@ package DBIx::Class::Schema::Loader; use strict; use warnings; -use base qw/DBIx::Class::Schema/; -use base qw/Class::Data::Accessor/; -use Carp::Clan qw/^DBIx::Class::Schema::Loader/; +use base qw/DBIx::Class::Schema Class::Data::Accessor/; +use Carp::Clan qw/^DBIx::Class/; use UNIVERSAL::require; use Class::C3; use Scalar::Util qw/ weaken /; @@ -12,11 +11,10 @@ use Scalar::Util qw/ weaken /; # Always remember to do all digits for the version even if they're 0 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports # brain damage and presumably various other packaging systems too -our $VERSION = '0.03004'; +our $VERSION = '0.03999_01'; -__PACKAGE__->mk_classaccessor('dump_to_dir'); -__PACKAGE__->mk_classaccessor('loader'); -__PACKAGE__->mk_classaccessor('_loader_args'); +__PACKAGE__->mk_classaccessor('_loader_args' => {}); +__PACKAGE__->mk_classaccessors(qw/dump_to_dir _loader_invoked _loader/); =head1 NAME @@ -28,7 +26,6 @@ DBIx::Class::Schema::Loader - Dynamic definition of a DBIx::Class::Schema use base qw/DBIx::Class::Schema::Loader/; __PACKAGE__->loader_options( - relationships => 1, constraint => '^foo.*', # debug => 1, ); @@ -66,9 +63,8 @@ than to be what you use in the long term for a complex database/project. That being said, transitioning your code from a Schema generated by this module to one that doesn't use this module should be straightforward and -painless (as long as you're not using any methods that are now deprecated -in this document), so don't shy away from it just for fears of the -transition down the road. +painless, so don't shy away from it just for fears of the transition down +the road. =head1 METHODS @@ -79,14 +75,10 @@ detailed information on all of the arguments, most of which are only useful in fairly complex scenarios, see the L documentation. -This method is *required* at this time, for backwards compatibility -reasons. If you do not wish to change any options, just call it -with an empty argument list during schema class initialization. - -You should either specify this method before setting the connection -information for your schema, or specify these options as a part of -your connection information (see below). For now it will merely -warn if the ordering is wrong, but in the future this will cause problems. +One must call C before any connection is made, +or embed the C in the connection information itself +as shown below. Setting C after the connection has +already been made is useless. =cut @@ -94,17 +86,7 @@ sub loader_options { my $self = shift; my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_; - - my $class = ref $self || $self; - $args{schema} = $self; - $args{schema_class} = $class; - weaken($args{schema}) if ref $self; - $self->_loader_args(\%args); - if($self->storage && !$class->loader) { - warn "Do not set loader_options after specifying the connection info"; - $self->_invoke_loader; - } $self; } @@ -113,7 +95,13 @@ sub _invoke_loader { my $self = shift; my $class = ref $self || $self; - $self->_loader_args->{dump_directory} ||= $self->dump_to_dir; + my $args = $self->_loader_args; + + # set up the schema/schema_class arguments + $args->{schema} = $self; + $args->{schema_class} = $class; + weaken($args->{schema}) if ref $self; + $args->{dump_directory} ||= $self->dump_to_dir; # XXX this only works for relative storage_type, like ::DBI ... my $impl = "DBIx::Class::Schema::Loader" . $self->storage_type; @@ -121,10 +109,9 @@ sub _invoke_loader { croak qq/Could not load storage_type loader "$impl": / . qq/"$UNIVERSAL::require::ERROR"/; - # XXX in the future when we get rid of ->loader, the next two - # lines can be replaced by "$impl->new(%{$self->_loader_args})->load;" - $class->loader($impl->new(%{$self->_loader_args})); - $class->loader->load; + $self->_loader($impl->new(%$args)); + $self->_loader->load; + $self->_loader_invoked(1); $self; } @@ -155,7 +142,9 @@ sub connection { $self = $self->next::method(@_); my $class = ref $self || $self; - $self->_invoke_loader if $self->_loader_args && !$class->loader; + if(!$class->_loader_invoked) { + $self->_invoke_loader + } return $self; } @@ -169,14 +158,12 @@ See L. sub clone { my $self = shift; - croak "You failed to specify the required loader_options" - if !$self->_loader_args; - my $clone = $self->next::method(@_); - $clone->_loader_args($self->_loader_args); - $clone->_loader_args->{schema} = $clone; - weaken($clone->_loader_args->{schema}); + if($clone->_loader_args) { + $clone->_loader_args->{schema} = $clone; + weaken($clone->_loader_args->{schema}); + } $clone; } @@ -266,19 +253,19 @@ illustrated in these Examples: use DBIx::Class::Schema::Loader qw/ make_schema_at /; make_schema_at( 'New::Schema::Name', - { relationships => 1, debug => 1 }, + { debug => 1 }, [ 'dbi:Pg:dbname="foo"','postgres' ], ); # Complex: dump loaded schema to disk, all from the commandline: - 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" ])' + 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" ])' # Same, but inside a script, and using a different way to specify the # dump directory: use DBIx::Class::Schema::Loader qw/ make_schema_at /; make_schema_at( 'New::Schema::Name', - { relationships => 1, debug => 1, dump_directory => './lib' }, + { debug => 1, dump_directory => './lib' }, [ 'dbi:Pg:dbname="foo"','postgres' ], ); @@ -296,6 +283,18 @@ sub make_schema_at { $target->connection(@$connect_info); } +=head2 rescan + +Re-scans the database for newly added tables since the initial +load, and adds them to the schema at runtime, including relationships, +etc. Does not process drops or changes. + +Returns a list of the new monikers added. + +=cut + +sub rescan { my $self = shift; $self->_loader->rescan($self) } + =head1 EXAMPLE Using the example in L as a basis @@ -306,7 +305,6 @@ replace the DB::Main with the following code: use base qw/DBIx::Class::Schema::Loader/; __PACKAGE__->loader_options( - relationships => 1, debug => 1, ); __PACKAGE__->connection('dbi:SQLite:example.db'); @@ -316,89 +314,6 @@ replace the DB::Main with the following code: and remove the Main directory tree (optional). Every thing else should work the same -=head1 DEPRECATED METHODS - -You don't need to read anything in this section unless you're upgrading -code that was written against pre-0.03 versions of this module. This -version is intended to be backwards-compatible with pre-0.03 code, but -will issue warnings about your usage of deprecated features/methods. - -B, -and converting code that uses these methods should be trivial. - -=head2 load_from_connection - -This deprecated method is now roughly an alias for L. - -For now, using this method will invoke the legacy behavior for -backwards compatibility, and merely emit a warning about upgrading -your code. - -It also reverts the default inflection scheme to -use L just like pre-0.03 versions of this -module did. - -You can force these legacy inflections with the -option L, -even after switch over to the preferred L way of doing -things. That option will not go away until at least 0.05. - -See the source of this method for more details. - -=cut - -sub load_from_connection { - my ($self, %args) = @_; - - my $cmds_ver = $Catalyst::Model::DBIC::Schema::VERSION; - if($cmds_ver) { - if($cmds_ver < 0.14) { - warn 'You should upgrade your installation of' - . ' Catalyst::Model::DBIC::Schema to 0.14 or higher, then:'; - } - warn 'You should regenerate your Model files, which may eliminate' - . ' the following deprecation warning:'; - } - warn 'load_from_connection deprecated, and will dissappear in 0.04000, ' - . 'please [re-]read the [new] DBIx::Class::Schema::Loader ' - . 'documentation'; - - # Support the old connect_info / dsn / etc args... - $args{connect_info} = [ - delete $args{dsn}, - delete $args{user}, - delete $args{password}, - delete $args{options}, - ] if $args{dsn}; - - $self->connection(@{delete $args{connect_info}}) - if $args{connect_info}; - - $self->loader_options('legacy_default_inflections' => 1, %args); -} - -=head2 loader - -This is an accessor in the generated Schema class for accessing -the L -based loader object -that was used during construction. See the -L docs for more information -on the available loader methods there. - -This accessor is deprecated. Do not use it. Anything you can -get from C, you can get via the normal L -methods, and your code will be more robust and forward-thinking -for doing so. - -If you're already using C in your code, make an effort -to get rid of it. If you think you've found a situation where it -is necessary, let me know and we'll see what we can do to remedy -that situation. - -In some future version, this accessor *will* disappear. It was -apparently quite a design/API mistake to ever have exposed it to -user-land in the first place, all things considered. - =head1 KNOWN ISSUES =head2 Multiple Database Schemas