X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FDBI.pm;h=6229cf8b505132000f3830cb18c5952404bbdc29;hb=refs%2Ftags%2F0.05003;hp=8a06554098df217a204c97032e1b587ca80812d0;hpb=075aff9752f9c6ec020cc040b6f70e131be0f4ad;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/DBI.pm b/lib/DBIx/Class/Schema/Loader/DBI.pm index 8a06554..6229cf8 100644 --- a/lib/DBIx/Class/Schema/Loader/DBI.pm +++ b/lib/DBIx/Class/Schema/Loader/DBI.pm @@ -6,7 +6,7 @@ use base qw/DBIx::Class::Schema::Loader::Base/; use Class::C3; use Carp::Clan qw/^DBIx::Class/; -our $VERSION = '0.04999_13'; +our $VERSION = '0.05003'; =head1 NAME @@ -90,9 +90,11 @@ sub _tables_list { my $dbh = $self->schema->storage->dbh; my @tables = $dbh->tables(undef, $self->db_schema, $table, $type); - my $qt = qr/\Q$self->{_quoter}\E/; + my $qt = qr/[\Q$self->{_quoter}\E"'`\[\]]/; - if ($self->{_quoter} && $tables[0] =~ /$qt/) { + my $all_tables_quoted = (grep /$qt/, @tables) == @tables; + + if ($self->{_quoter} && $all_tables_quoted) { s/.* $qt (?= .* $qt)//xg for @tables; } else { s/^.*\Q$self->{_namesep}\E// for @tables; @@ -109,13 +111,23 @@ sub _filter_tables { my @filtered_tables; for my $table (@tables) { - my $sth = $self->_sth_for($table, undef, \'1 = 0'); - eval { $sth->execute }; + eval { + my $sth = $self->_sth_for($table, undef, \'1 = 0'); + $sth->execute; + }; if (not $@) { push @filtered_tables, $table; } else { warn "Bad table or view '$table', ignoring: $@\n"; + local $@; + eval { + my $schema = $self->schema; + # in older DBIC it's a private method + my $unregister = $schema->can('unregister_source') + || $schema->can('_unregister_source'); + $schema->$unregister($self->_table2moniker($table)); + }; } } @@ -270,17 +282,18 @@ sub _columns_info_for { eval { my $sth = $dbh->column_info( undef, $self->db_schema, $table, '%' ); while ( my $info = $sth->fetchrow_hashref() ){ - my %column_info; - $column_info{data_type} = $info->{TYPE_NAME}; - $column_info{size} = $info->{COLUMN_SIZE}; - $column_info{is_nullable} = $info->{NULLABLE} ? 1 : 0; - $column_info{default_value} = $info->{COLUMN_DEF}; + my $column_info = {}; + $column_info->{data_type} = $info->{TYPE_NAME}; + $column_info->{size} = $info->{COLUMN_SIZE}; + $column_info->{is_nullable} = $info->{NULLABLE} ? 1 : 0; + $column_info->{default_value} = $info->{COLUMN_DEF}; my $col_name = $info->{COLUMN_NAME}; $col_name =~ s/^\"(.*)\"$/$1/; my $extra_info = $self->_extra_column_info($info) || {}; + $column_info = { %$column_info, %$extra_info }; - $result{$col_name} = { %column_info, %$extra_info }; + $result{$col_name} = $column_info; } $sth->finish; }; @@ -292,19 +305,20 @@ sub _columns_info_for { $sth->execute; my @columns = @{$sth->{NAME_lc}}; for my $i ( 0 .. $#columns ){ - my %column_info; - $column_info{data_type} = $sth->{TYPE}->[$i]; - $column_info{size} = $sth->{PRECISION}->[$i]; - $column_info{is_nullable} = $sth->{NULLABLE}->[$i] ? 1 : 0; - - if ($column_info{data_type} =~ m/^(.*?)\((.*?)\)$/) { - $column_info{data_type} = $1; - $column_info{size} = $2; + my $column_info = {}; + $column_info->{data_type} = $sth->{TYPE}->[$i]; + $column_info->{size} = $sth->{PRECISION}->[$i]; + $column_info->{is_nullable} = $sth->{NULLABLE}->[$i] ? 1 : 0; + + if ($column_info->{data_type} =~ m/^(.*?)\((.*?)\)$/) { + $column_info->{data_type} = $1; + $column_info->{size} = $2; } my $extra_info = $self->_extra_column_info($table, $columns[$i], $sth, $i) || {}; + $column_info = { %$column_info, %$extra_info }; - $result{$columns[$i]} = { %column_info, %$extra_info }; + $result{$columns[$i]} = $column_info; } $sth->finish;