X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FDBI%2FPg.pm;h=f9176d1766a5418aee545b9fb2a327d323d8395f;hb=fc6b19d0097dae3c1742de34c25a9f3adfb9bb62;hp=0745bd96c703a28c10848eeafc1509ac4059c0b2;hpb=22f91663244e30dd4bcae10e54a761113f3a587c;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/DBI/Pg.pm b/lib/DBIx/Class/Schema/Loader/DBI/Pg.pm index 0745bd9..f9176d1 100644 --- a/lib/DBIx/Class/Schema/Loader/DBI/Pg.pm +++ b/lib/DBIx/Class/Schema/Loader/DBI/Pg.pm @@ -2,13 +2,10 @@ package DBIx::Class::Schema::Loader::DBI::Pg; use strict; use warnings; -use base qw/ - DBIx::Class::Schema::Loader::DBI::Component::QuotedDefault - DBIx::Class::Schema::Loader::DBI -/; +use base 'DBIx::Class::Schema::Loader::DBI::Component::QuotedDefault'; use mro 'c3'; -our $VERSION = '0.07019'; +our $VERSION = '0.07027'; =head1 NAME @@ -43,6 +40,58 @@ sub _system_schemas { return ($self->next::method(@_), 'pg_catalog'); } +sub _table_fk_info { + my ($self, $table) = @_; + + my $sth = $self->dbh->prepare_cached(<<"EOF"); +SELECT rc.constraint_name, rc.unique_constraint_schema, uk_tc.table_name, + fk_kcu.column_name, uk_kcu.column_name, rc.delete_rule, rc.update_rule, + fk_tc.is_deferrable +FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS fk_tc +JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc + ON rc.constraint_name = fk_tc.constraint_name + AND rc.constraint_schema = fk_tc.table_schema +JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fk_kcu + ON fk_kcu.constraint_name = fk_tc.constraint_name + AND fk_kcu.table_name = fk_tc.table_name + AND fk_kcu.table_schema = fk_tc.table_schema +JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS uk_tc + ON uk_tc.constraint_name = rc.unique_constraint_name + AND uk_tc.table_schema = rc.unique_constraint_schema +JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE uk_kcu + ON uk_kcu.constraint_name = rc.unique_constraint_name + AND uk_kcu.ordinal_position = fk_kcu.ordinal_position + AND uk_kcu.table_name = uk_tc.table_name + AND uk_kcu.table_schema = rc.unique_constraint_schema +WHERE fk_tc.table_name = ? + AND fk_tc.table_schema = ? +ORDER BY fk_kcu.ordinal_position +EOF + + $sth->execute($table->name, $table->schema); + + my %rels; + + while (my ($fk, $remote_schema, $remote_table, $col, $remote_col, + $delete_rule, $update_rule, $is_deferrable) = $sth->fetchrow_array) { + push @{ $rels{$fk}{local_columns} }, $self->_lc($col); + push @{ $rels{$fk}{remote_columns} }, $self->_lc($remote_col); + + $rels{$fk}{remote_table} = DBIx::Class::Schema::Loader::Table->new( + loader => $self, + name => $remote_table, + schema => $remote_schema, + ) unless exists $rels{$fk}{remote_table}; + + $rels{$fk}{attrs}{on_delete} = uc $delete_rule; + $rels{$fk}{attrs}{on_update} = uc $update_rule; + $rels{$fk}{attrs}{is_deferrable} = uc $is_deferrable eq 'YES' ? 1 : 0; + } + + return [ values %rels ]; +} + + sub _table_uniq_info { my ($self, $table) = @_; @@ -111,8 +160,8 @@ sub _table_comment { return $table_comment if $table_comment; ($table_comment) = $self->dbh->selectrow_array(<<'EOF', {}, $table->name, $table->schema); -SELECT obj_description(oid) -FROM pg_class +SELECT obj_description(oid) +FROM pg_class WHERE relname=? AND relnamespace=(SELECT oid FROM pg_namespace WHERE nspname=?) EOF @@ -130,7 +179,7 @@ sub _column_comment { my ($table_oid) = $self->dbh->selectrow_array(<<'EOF', {}, $table->name, $table->schema); SELECT oid -FROM pg_class +FROM pg_class WHERE relname=? AND relnamespace=(SELECT oid FROM pg_namespace WHERE nspname=?) EOF @@ -251,7 +300,7 @@ EOF $info->{extra}{custom_type_name} = $info->{data_type}; $info->{data_type} = 'enum'; - + delete $info->{size}; } }