use mro 'c3';
use Try::Tiny;
use List::MoreUtils 'any';
+use Carp::Clan qw/^DBIx::Class/;
use namespace::clean;
use DBIx::Class::Schema::Loader::Table ();
-our $VERSION = '0.07017';
+our $VERSION = '0.07019';
__PACKAGE__->mk_group_accessors('simple', qw/
_disable_pk_detection
my $driver = $self->dbh->{Driver}->{Name};
my $subclass = 'DBIx::Class::Schema::Loader::DBI::' . $driver;
- if ($self->load_optional_class($subclass)) {
- bless $self, $subclass unless $self->isa($subclass);
+ if ((not $self->isa($subclass)) && $self->load_optional_class($subclass)) {
+ bless $self, $subclass;
$self->_rebless;
+ Class::C3::reinitialize() if $] < 5.009005;
}
}
$self->_setup;
- $self;
+ return $self;
}
sub _build_quote_char {
my $relid = ($raw_rel->[11] || ( "__dcsld__" . $i++ ));
foreach my $var ($uk_scm, $uk_tbl, $uk_col, $fk_scm, $fk_col, $relid) {
- $var =~ s/[\Q$self->{quote_char}\E]//g;
+ $var =~ s/[\Q$self->{quote_char}\E]//g if defined $var;
}
if ($self->db_schema && $self->db_schema->[0] ne '%'
my $col_name = $info->{COLUMN_NAME};
$col_name =~ s/^\"(.*)\"$/$1/;
- $col_name = $self->_lc($col_name);
-
my $extra_info = $self->_extra_column_info(
$table, $col_name, $column_info, $info
) || {};
my @columns = @{ $sth->{NAME} };
COL: for my $i (0 .. $#columns) {
- next COL if %{ $result{ $self->_lc($columns[$i]) }||{} };
+ next COL if %{ $result{ $columns[$i] }||{} };
my $column_info = {};
$column_info->{data_type} = lc $sth->{TYPE}[$i];
my $extra_info = $self->_extra_column_info($table, $columns[$i], $column_info, $sth) || {};
$column_info = { %$column_info, %$extra_info };
- $result{ $self->_lc($columns[$i]) } = $column_info;
+ $result{ $columns[$i] } = $column_info;
}
$sth->finish;
}
}
+ # check for instances of the same column name with different case in preserve_case=0 mode
+ if (not $self->preserve_case) {
+ my %lc_colnames;
+
+ foreach my $col (keys %result) {
+ push @{ $lc_colnames{lc $col} }, $col;
+ }
+
+ if (keys %lc_colnames != keys %result) {
+ my @offending_colnames = map @$_, grep @$_ > 1, values %lc_colnames;
+
+ my $offending_colnames = join ", ", map "'$_'", @offending_colnames;
+
+ croak "columns $offending_colnames in table @{[ $table->sql_name ]} collide in preserve_case=0 mode. preserve_case=1 mode required";
+ }
+
+ # apply lowercasing
+ my %lc_result;
+
+ while (my ($col, $info) = each %result) {
+ $lc_result{ $self->_lc($col) } = $info;
+ }
+
+ %result = %lc_result;
+ }
+
return \%result;
}