use Exporter;
use SQL::Translator::Utils qw(debug normalize_name);
use DBIx::Class::Carp qw/^SQL::Translator|^DBIx::Class|^Try::Tiny/;
-use DBIx::Class::Exception;
+use DBIx::Class::_Util qw( dbic_internal_try dbic_internal_catch bag_eq );
+use Class::C3::Componentised;
use Scalar::Util 'blessed';
-use Try::Tiny;
use namespace::clean;
use base qw(Exporter);
DBIx::Class::Exception->throw('No DBIx::Class::Schema') unless ($dbicschema);
if (!ref $dbicschema) {
- eval "require $dbicschema"
- or DBIx::Class::Exception->throw("Can't load $dbicschema: $@");
+ dbic_internal_try {
+ Class::C3::Componentised->ensure_class_loaded($dbicschema)
+ }
+ dbic_internal_catch {
+ DBIx::Class::Exception->throw("Can't load $dbicschema: $_");
+ }
}
if (
name => $table_name,
type => 'TABLE',
);
+
+ my $ci = $source->columns_info;
+
+ # same order as add_columns
foreach my $col ($source->columns)
{
# assuming column_info in dbic is the same as DBI (?)
is_auto_increment => 0,
is_foreign_key => 0,
is_nullable => 0,
- %{$source->column_info($col)}
+ %{$ci->{$col} || {}}
);
if ($colinfo{is_nullable}) {
$colinfo{default} = '' unless exists $colinfo{default};
my %unique_constraints = $source->unique_constraints;
foreach my $uniq (sort keys %unique_constraints) {
- if (!$source->_compare_relationship_keys($unique_constraints{$uniq}, \@primary)) {
- $table->add_constraint(
- type => 'unique',
- name => $uniq,
- fields => $unique_constraints{$uniq}
- );
- }
+ $table->add_constraint(
+ type => 'unique',
+ name => $uniq,
+ fields => $unique_constraints{$uniq}
+ ) unless bag_eq( \@primary, $unique_constraints{$uniq} );
}
my @rels = $source->relationships();
my $rel_info = $source->relationship_info($rel);
# Ignore any rel cond that isn't a straight hash
+ #
+ # FIXME - this can be done *WAY* better via the recolcond resolver
+ # but no time to think through the implications for deploy() at
+ # the moment. Grep for {identity_map_matches_condition} for ideas
+ # how to improve this, and the /^\w+\.(\w+)$/ crap below
next unless ref $rel_info->{cond} eq 'HASH';
- my $relsource = try { $source->related_source($rel) };
+ my $relsource = dbic_internal_try { $source->related_source($rel) };
unless ($relsource) {
- carp "Ignoring relationship '$rel' - related resultsource '$rel_info->{class}' is not registered with this schema\n";
+ carp "Ignoring relationship '$rel' on '$moniker' - related resultsource '$rel_info->{class}' is not registered with this schema\n";
next;
};
for ( keys %{$rel_info->{cond}} ) {
unless (exists $other_columns_idx{$_}) {
- carp "Ignoring relationship '$rel' - related resultsource does not contain one of the specified columns: '$_'\n";
+ carp "Ignoring relationship '$rel' on '$moniker' - related resultsource '@{[ $relsource->source_name ]}' does not contain one of the specified columns: '$_'\n";
next REL;
}
}
# this is supposed to indicate a has_one/might_have...
# where's the introspection!!?? :)
else {
- $fk_constraint = not $source->_compare_relationship_keys(\@keys, \@primary);
+ $fk_constraint = ! bag_eq( \@keys, \@primary );
}
- my ($otherrelname, $otherrelationship) = %{ $source->reverse_relationship_info($rel) };
my $cascade;
+ CASCADE_TYPE:
for my $c (qw/delete update/) {
if (exists $rel_info->{attrs}{"on_$c"}) {
if ($fk_constraint) {
. "If you are sure that SQLT must generate a constraint for this relationship, add 'is_foreign_key_constraint => 1' to the attributes.\n";
}
}
- elsif (defined $otherrelationship and $otherrelationship->{attrs}{$c eq 'update' ? 'cascade_copy' : 'cascade_delete'}) {
- $cascade->{$c} = 'CASCADE';
+ else {
+ for my $revrelinfo (values %{ $source->reverse_relationship_info($rel) } ) {
+ ( ( $cascade->{$c} = 'CASCADE' ), next CASCADE_TYPE ) if (
+ $revrelinfo->{attrs}
+ ->{ ($c eq 'update')
+ ? 'cascade_copy'
+ : 'cascade_delete'
+ }
+ );
+ }
}
}
L<SQL::Translator>, L<DBIx::Class::Schema>
-=head1 AUTHORS
-
-See L<DBIx::Class/CONTRIBUTORS>.
+=head1 FURTHER QUESTIONS?
-=head1 LICENSE
+Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
-You may distribute this code under the same terms as Perl itself.
+=head1 COPYRIGHT AND LICENSE
-=cut
+This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
+by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
+redistribute it and/or modify it under the same terms as the
+L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.