X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema.pm;h=3ca9d5ef8df58f45cab69310661dc8cca7c6998e;hb=1ab6145705e18535e27e538c87a11b9483121f1e;hp=5cb37fb6e714e7e4c0205f9cf2203a18da208ce4;hpb=03e3321aba8d719195bf8a875e121e2b30e6655b;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Schema.pm b/lib/DBIx/Class/Schema.pm index 5cb37fb..3ca9d5e 100644 --- a/lib/DBIx/Class/Schema.pm +++ b/lib/DBIx/Class/Schema.pm @@ -173,8 +173,8 @@ sub _findallmod { } # returns a hash of $shortname => $fullname for every package -# found in the given namespaces ($shortname is with the $fullname's -# namespace stripped off) +# found in the given namespaces ($shortname is with the $fullname's +# namespace stripped off) sub _map_namespaces { my ($class, @namespaces) = @_; @@ -190,6 +190,22 @@ sub _map_namespaces { @results_hash; } +# returns the result_source_instance for the passed class/object, +# or dies with an informative message (used by load_namespaces) +sub _ns_get_rsrc_instance { + my $class = shift; + my $rs = ref ($_[0]) || $_[0]; + + if ($rs->can ('result_source_instance') ) { + return $rs->result_source_instance; + } + else { + $class->throw_exception ( + "Attempt to load_namespaces() class $rs failed - are you sure this is a real Result Class?" + ); + } +} + sub load_namespaces { my ($class, %args) = @_; @@ -231,27 +247,27 @@ sub load_namespaces { my $result_class = $results{$result}; my $rs_class = delete $resultsets{$result}; - my $rs_set = $result_class->resultset_class; + my $rs_set = $class->_ns_get_rsrc_instance ($result_class)->resultset_class; if($rs_set && $rs_set ne 'DBIx::Class::ResultSet') { if($rs_class && $rs_class ne $rs_set) { - warn "We found ResultSet class '$rs_class' for '$result', but it seems " + carp "We found ResultSet class '$rs_class' for '$result', but it seems " . "that you had already set '$result' to use '$rs_set' instead"; } } elsif($rs_class ||= $default_resultset_class) { $class->ensure_class_loaded($rs_class); - $result_class->resultset_class($rs_class); + $class->_ns_get_rsrc_instance ($result_class)->resultset_class($rs_class); } - my $source_name = $result_class->source_name || $result; + my $source_name = $class->_ns_get_rsrc_instance ($result_class)->source_name || $result; push(@to_register, [ $source_name, $result_class ]); } } foreach (sort keys %resultsets) { - warn "load_namespaces found ResultSet class $_ with no " + carp "load_namespaces found ResultSet class $_ with no " . 'corresponding Result class'; } @@ -269,8 +285,10 @@ sub load_namespaces { =back -Alternative method to L which you should look at -using if you can. +L is an alternative method to L, both of +which serve similar purposes, each with different advantages and disadvantages. +In the general case you should use L, unless you need to +be able to specify that only specific classes are loaded at runtime. With no arguments, this method uses L to find all classes under the schema's namespace. Otherwise, this method loads the classes you specify @@ -344,7 +362,7 @@ sub load_classes { my $snsub = $comp_class->can('source_name'); if(! $snsub ) { - warn "Failed to load $comp_class. Can't find source_name method. Is $comp_class really a full DBIC result class? Fix it, move it elsewhere, or make your load_classes call more specific."; + carp "Failed to load $comp_class. Can't find source_name method. Is $comp_class really a full DBIC result class? Fix it, move it elsewhere, or make your load_classes call more specific."; next; } $comp = $snsub->($comp_class) || $comp; @@ -999,16 +1017,16 @@ sub throw_exception { =over 4 -=item Arguments: $sqlt_args, $dir +=item Arguments: \%sqlt_args, $dir =back Attempts to deploy the schema to the current storage using L. -See L for a list of values for C<$sqlt_args>. The most -common value for this would be C<< { add_drop_table => 1, } >> to have the SQL -produced include a DROP TABLE statement for each table created. For quoting -purposes use C value with C and +See L for a list of values for C<\%sqlt_args>. +The most common value for this would be C<< { add_drop_table => 1 } >> +to have the SQL produced include a C statement for each table +created. For quoting purposes supply C and C. Additionally, the DBIx::Class parser accepts a C parameter as a hash @@ -1029,19 +1047,16 @@ sub deploy { =over 4 -=item Arguments: $rdbms_type, $sqlt_args, $dir +=item Arguments: See L =item Return value: $listofstatements =back -A convenient shortcut to storage->deployment_statements(). Returns the -SQL statements used by L and -L. C<$rdbms_type> provides the -(optional) SQLT (not DBI) database driver name for which the SQL -statements are produced. If not supplied, the type is determined by -interrogating the current connection. The other two arguments are -identical to those of L. +A convenient shortcut to +C<< $self->storage->deployment_statements($self, @args) >>. +Returns the SQL statements used by L and +L. =cut @@ -1058,42 +1073,15 @@ sub deployment_statements { =over 4 -=item Arguments: \@databases, $version, $directory, $preversion, $sqlt_args - -=back - -Creates an SQL file based on the Schema, for each of the specified -database types, in the given directory. Given a previous version number, -this will also create a file containing the ALTER TABLE statements to -transform the previous schema into the current one. Note that these -statements may contain DROP TABLE or DROP COLUMN statements that can -potentially destroy data. - -The file names are created using the C method below, please -override this method in your schema if you would like a different file -name format. For the ALTER file, the same format is used, replacing -$version in the name with "$preversion-$version". - -See L for details of $sqlt_args. - -If no arguments are passed, then the following default values are used: - -=over 4 - -=item databases - ['MySQL', 'SQLite', 'PostgreSQL'] - -=item version - $schema->schema_version - -=item directory - './' - -=item preversion - +=item Arguments: See L =back -Note that this feature is currently EXPERIMENTAL and may not work correctly -across all databases, or fully handle complex relationships. +A convenient shortcut to +C<< $self->storage->create_ddl_dir($self, @args) >>. -WARNING: Please check all SQL files created, before applying them. +Creates an SQL file based on the Schema, for each of the specified +database types, in the given directory. =cut @@ -1280,6 +1268,7 @@ sub _register_source { $self->source_registrations(\%reg); return if ($params->{extra}); + return unless defined($rs_class) && $rs_class->can('result_source_instance'); my %map = %{$self->class_mappings}; if ( @@ -1349,7 +1338,7 @@ more information. sub compose_connection { my ($self, $target, @info) = @_; - warn "compose_connection deprecated as of 0.08000" + carp "compose_connection deprecated as of 0.08000" unless ($INC{"DBIx/Class/CDBICompat.pm"} || $warn++); my $base = 'DBIx::Class::ResultSetProxy';