X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader.pm;h=a495e40ffc5e94304d68f6726e8cd1bb10699193;hb=c39e35077d88eb3c81696032a2e51fdf5cb69eab;hp=b3cd945143acdd2b2fdd6605de7f16b60dcd6683;hpb=fa994d3c6ada53f4610e6384fe924d4bf8163a68;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader.pm b/lib/DBIx/Class/Schema/Loader.pm index b3cd945..a495e40 100644 --- a/lib/DBIx/Class/Schema/Loader.pm +++ b/lib/DBIx/Class/Schema/Loader.pm @@ -2,8 +2,7 @@ package DBIx::Class::Schema::Loader; use strict; use warnings; -use base qw/DBIx::Class::Schema/; -use base qw/Class::Data::Accessor/; +use base qw/DBIx::Class::Schema Class::Data::Accessor/; use Carp::Clan qw/^DBIx::Class/; use UNIVERSAL::require; use Class::C3; @@ -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.04002'; -__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, ); @@ -48,16 +45,17 @@ L by scanning database table definitions and setting up the columns, primary keys, and relationships. DBIx::Class::Schema::Loader currently supports only the DBI storage type. -It has explicit support for L, L, L, and -L. Other DBI drivers may function to a greater or lesser -degree with this loader, depending on how much of the DBI spec they -implement, and how standard their implementation is. Patches to make -other DBDs work correctly welcome. +It has explicit support for L, L, L, +L, and L. Other DBI drivers may function to +a greater or lesser degree with this loader, depending on how much of the +DBI spec they implement, and how standard their implementation is. + +Patches to make other DBDs work correctly welcome. See L for notes on writing your own vendor-specific subclass for an unsupported DBD driver. -This module requires L 0.06 or later, and obsoletes +This module requires L 0.07006 or later, and obsoletes the older L. This module is designed more to get you up and running quickly against @@ -66,9 +64,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,17 +76,11 @@ 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. - -Setting these options explicitly via this method B calling -C is deprecated and will stop working in version 0.04000. -For now the code merely warns about this condition. - -The preferred way of doing things is to either call C -before any connection is made, or embed the C in -the connection information itself as shown below. +If you intend to use C, you 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 @@ -97,18 +88,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," - . " this will be unsupported in 0.04000"; - $self->_invoke_loader; - } $self; } @@ -117,7 +97,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; @@ -125,10 +111,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; } @@ -159,13 +144,9 @@ sub connection { $self = $self->next::method(@_); my $class = ref $self || $self; - if($self->_loader_args && !$class->loader) { + if(!$class->_loader_invoked) { $self->_invoke_loader } - else { - warn "loader_options should be set before connecting the " - . "schema, see the DBIx::Class::Schema::Loader docs"; - } return $self; } @@ -274,19 +255,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' ], ); @@ -304,6 +285,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 @@ -314,7 +307,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'); @@ -324,89 +316,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