X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FProducer%2FOracle.pm;h=45c379d3c68277e027d6f32bdc42da3ae8566210;hb=ca1b7c76bf8239d94a4e820dada0f0ce7416bcb9;hp=c3febb142515d6655b4913b422dc7b61aaec313f;hpb=977651a56d55fa4b2aacb19977667abd7f241c9a;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Producer/Oracle.pm b/lib/SQL/Translator/Producer/Oracle.pm index c3febb1..45c379d 100644 --- a/lib/SQL/Translator/Producer/Oracle.pm +++ b/lib/SQL/Translator/Producer/Oracle.pm @@ -1,7 +1,7 @@ package SQL::Translator::Producer::Oracle; # ------------------------------------------------------------------- -# $Id: Oracle.pm,v 1.30 2004-02-09 23:02:15 kycl4rk Exp $ +# $Id: Oracle.pm,v 1.34 2005-08-10 16:33:39 duality72 Exp $ # ------------------------------------------------------------------- # Copyright (C) 2002-4 SQLFairy Authors # @@ -39,7 +39,7 @@ Creates an SQL DDL suitable for Oracle. use strict; use vars qw[ $VERSION $DEBUG $WARN ]; -$VERSION = sprintf "%d.%02d", q$Revision: 1.30 $ =~ /(\d+)\.(\d+)/; +$VERSION = sprintf "%d.%02d", q$Revision: 1.34 $ =~ /(\d+)\.(\d+)/; $DEBUG = 0 unless defined $DEBUG; use SQL::Translator::Schema::Constants; @@ -190,6 +190,7 @@ sub produce { ); my $field_name_ur = unreserve( $field_name, $table_name ); my $field_def = $field_name_ur; + $field->name( $field_name_ur ); # # Datatype @@ -229,6 +230,15 @@ sub produce { if $WARN; } + if ( $data_type eq 'clob' && $field->is_unique ) { + $data_type = 'varchar2'; + $size[0] = 4000; + warn "CLOB cannot be a unique key, changing to VARCHAR2\n" + if $WARN; + } + + + # # Fixes ORA-00907: missing right parenthesis # @@ -254,7 +264,7 @@ sub produce { # if ( $data_type =~ /^number$/i && - $default !~ /^\d+$/ && + $default !~ /^-?\d+$/ && $default !~ m/null/i ) { if ( $default =~ /^true$/i ) { @@ -296,7 +306,7 @@ sub produce { # Auto_increment # if ( $field->is_auto_increment ) { - my $base_name = $table_name . "_". $field_name; + my $base_name = $table_name_ur . "_". $field_name; my $seq_name = mk_name( $base_name, 'sq' ); my $trigger_name = mk_name( $base_name, 'ai' ); @@ -317,7 +327,7 @@ sub produce { } if ( lc $field->data_type eq 'timestamp' ) { - my $base_name = $table_name . "_". $field_name_ur; + my $base_name = $table_name_ur . "_". $field_name_ur; my $trig_name = mk_name( $base_name, 'ts' ); push @trigger_defs, "CREATE OR REPLACE TRIGGER $trig_name\n". @@ -331,9 +341,10 @@ sub produce { push @field_defs, $field_def; if ( my $comment = $field->comments ) { + $comment =~ s/'/''/g; push @field_comments, - "COMMENT ON COLUMN $table_name.$field_name_ur is\n '". - $comment."';" unless $no_comments; + "COMMENT ON COLUMN $table_name_ur.$field_name_ur is\n '" . + $comment . "';" unless $no_comments; } } @@ -371,12 +382,20 @@ sub produce { next if !@fields && $c->type ne CHECK_C; if ( $c->type eq PRIMARY_KEY ) { - $name ||= mk_name( $table_name, 'pk' ); - push @constraint_defs, "CONSTRAINT $name PRIMARY KEY ". - '(' . join( ', ', @fields ) . ')'; + #$name ||= mk_name( $table_name, 'pk' ); + push @constraint_defs, ($name ? "CONSTRAINT $name " : '') . + 'PRIMARY KEY (' . join( ', ', @fields ) . ')'; } elsif ( $c->type eq UNIQUE ) { - $name ||= mk_name( $table_name, 'u' ); + # Don't create UNIQUE constraints identical to the primary key + if ( my $pk = $table->primary_key ) { + my $u_fields = join(":", @fields); + my $pk_fields = join(":", $pk->fields); + next if $u_fields eq $pk_fields; + } + + $name ||= mk_name( $name || $table_name, 'u' ); + for my $f ( $c->fields ) { my $field_def = $table->get_field( $f ) or next; my $dtype = $translate{ $field_def->data_type } or next; @@ -386,11 +405,12 @@ sub produce { $field_def->name . ".'\n" } } + push @constraint_defs, "CONSTRAINT $name UNIQUE " . '(' . join( ', ', @fields ) . ')'; } elsif ( $c->type eq CHECK_C ) { - $name ||= mk_name( $table_name, 'ck' ); + $name ||= mk_name( $name || $table_name, 'ck' ); my $expression = $c->expression || ''; push @constraint_defs, "CONSTRAINT $name CHECK ($expression)"; } @@ -439,12 +459,14 @@ sub produce { next unless @fields; if ( $index_type eq PRIMARY_KEY ) { - $index_name ||= mk_name( $table_name, 'pk' ); + $index_name = $index_name ? mk_name( $index_name ) + : mk_name( $table_name, 'pk' ); push @field_defs, 'CONSTRAINT '.$index_name.' PRIMARY KEY '. '(' . join( ', ', @fields ) . ')'; } elsif ( $index_type eq NORMAL ) { - $index_name ||= mk_name( $table_name, $index_name || 'i' ); + $index_name = $index_name ? mk_name( $index_name ) + : mk_name( $table_name, $index_name || 'i' ); push @index_defs, "CREATE INDEX $index_name on $table_name_ur (". join( ', ', @fields ). @@ -462,8 +484,9 @@ sub produce { if ( my @table_comments = $table->comments ) { for my $comment ( @table_comments ) { next unless $comment; - push @field_comments, "COMMENT ON TABLE $table_name is\n '". - $comment."';" unless $no_comments + $comment =~ s/'/''/g; + push @field_comments, "COMMENT ON TABLE $table_name_ur is\n '". + $comment . "';" unless $no_comments ; } } @@ -526,9 +549,9 @@ sub mk_name { $scope ||= \%global_names; if ( my $prev = $scope->{ $name } ) { my $name_orig = $name; - $name .= sprintf( "%02d", ++$prev ); - substr($name, $max_id_length - 3) = "00" - if length( $name ) > $max_id_length; + substr($name, $max_id_length - 2) = "" + if length( $name ) >= $max_id_length - 1; + $name .= sprintf( "%02d", $prev++ ); warn "The name '$name_orig' has been changed to ", "'$name' to make it unique.\n" if $WARN;