X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FDBI%2FOracle.pm;h=1c5b432a99aeb7138f376b7b458dd52dca70f196;hb=8a9cc3bb69bee00efb91480ed7106a9bdf473414;hp=da829b4336d13c66dbbb0a10a55e7d87ab9f5db9;hpb=ef73d2ade02190ee6e89138aa52d19f7138272b1;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/DBI/Oracle.pm b/lib/DBIx/Class/Schema/Loader/DBI/Oracle.pm index da829b4..1c5b432 100644 --- a/lib/DBIx/Class/Schema/Loader/DBI/Oracle.pm +++ b/lib/DBIx/Class/Schema/Loader/DBI/Oracle.pm @@ -5,13 +5,14 @@ use warnings; use base 'DBIx::Class::Schema::Loader::DBI::Component::QuotedDefault'; use mro 'c3'; use Try::Tiny; +use DBIx::Class::Schema::Loader::Utils qw/sigwarn_silencer/; use namespace::clean; -our $VERSION = '0.07027'; +our $VERSION = '0.07037'; =head1 NAME -DBIx::Class::Schema::Loader::DBI::Oracle - DBIx::Class::Schema::Loader::DBI +DBIx::Class::Schema::Loader::DBI::Oracle - DBIx::Class::Schema::Loader::DBI Oracle Implementation. =head1 DESCRIPTION @@ -69,15 +70,39 @@ sub _filter_tables { my $self = shift; # silence a warning from older DBD::Oracles in tests - my $warn_handler = $SIG{__WARN__} || sub { warn @_ }; - local $SIG{__WARN__} = sub { - $warn_handler->(@_) - unless $_[0] =~ /^Field \d+ has an Oracle type \(\d+\) which is not explicitly supported/; - }; + local $SIG{__WARN__} = sigwarn_silencer( + qr/^Field \d+ has an Oracle type \(\d+\) which is not explicitly supported/ + ); return $self->next::method(@_); } +sub _table_fk_info { + my $self = shift; + my ($table) = @_; + + my $rels = $self->next::method(@_); + + my $deferrable_sth = $self->dbh->prepare_cached(<<'EOF'); +select deferrable from all_constraints +where owner = ? and table_name = ? and constraint_name = ? +EOF + + foreach my $rel (@$rels) { + # Oracle does not have update rules + $rel->{attrs}{on_update} = 'NO ACTION';; + + # DBD::Oracle's foreign_key_info does not return DEFERRABILITY, so we get it ourselves + my ($deferrable) = $self->dbh->selectrow_array( + $deferrable_sth, undef, $table->schema, $table->name, $rel->{_constraint_name} + ); + + $rel->{attrs}{is_deferrable} = $deferrable && $deferrable =~ /^DEFERRABLE/i ? 1 : 0; + } + + return $rels; +} + sub _table_uniq_info { my ($self, $table) = @_; @@ -100,7 +125,7 @@ EOF my $constr_col = $self->_lc($constr->[1]); push @{$constr_names{$constr_name}}, $constr_col; } - + my @uniqs = map { [ $_ => $constr_names{$_} ] } keys %constr_names; return \@uniqs; } @@ -115,7 +140,7 @@ sub _table_comment { ($table_comment) = $self->dbh->selectrow_array(<<'EOF', {}, $table->schema, $table->name); SELECT comments FROM all_tab_comments -WHERE owner = ? +WHERE owner = ? AND table_name = ? AND (table_type = 'TABLE' OR table_type = 'VIEW') EOF @@ -133,7 +158,7 @@ sub _column_comment { ($column_comment) = $self->dbh->selectrow_array(<<'EOF', {}, $table->schema, $table->name, $self->_uc($column_name)); SELECT comments FROM all_col_comments -WHERE owner = ? +WHERE owner = ? AND table_name = ? AND column_name = ? EOF @@ -315,7 +340,7 @@ EOF elsif (lc($info->{data_type}) eq 'binary_float') { $info->{data_type} = 'real'; $info->{original}{data_type} = 'binary_float'; - } + } elsif (lc($info->{data_type}) eq 'binary_double') { $info->{data_type} = 'double precision'; $info->{original}{data_type} = 'binary_double';