X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FOracle.pm;h=12e7fdf8d6e9536dff62fb6053fb867f5315f685;hb=fd498bb0acde8fb312f841aaebc896ed19db59d1;hp=2f03d676dae9ccb36d78aba68dbb074a58b06f28;hpb=16fc4c72a0ca81a6bc6d9e9fe1bd1bfd3733ff28;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Parser/Oracle.pm b/lib/SQL/Translator/Parser/Oracle.pm index 2f03d67..12e7fdf 100644 --- a/lib/SQL/Translator/Parser/Oracle.pm +++ b/lib/SQL/Translator/Parser/Oracle.pm @@ -91,7 +91,7 @@ our @EXPORT_OK = qw(parse); our $GRAMMAR = <<'END_OF_GRAMMAR'; -{ my ( %tables, %indices, %constraints, $table_order, @table_comments, %views, $view_order, %procedures, $proc_order ) } +{ my ( %tables, %indices, %constraints, $table_order, @table_comments, %views, $view_order, %procedures, $proc_order, %triggers, $trigger_order ) } # # The "eofile" rule makes the parser fail if any "statement" rule @@ -107,6 +107,7 @@ startrule : statement(s) eofile constraints => \%constraints, views => \%views, procedures => \%procedures, + triggers => \%triggers, }; } @@ -123,6 +124,13 @@ statement : remark | drop | +alter: /alter/i TABLE table_name /add/i table_constraint ';' + { + my $constraint = $item{table_constraint}; + $constraint->{type} = $constraint->{constraint_type}; + push @{$tables{$item{table_name}}{constraints}}, $constraint; + } + alter : /alter/i WORD /[^;]+/ ';' { @table_comments = () } @@ -198,6 +206,21 @@ index_expr: parens_name_list $return = "$item[2]($arg_list)"; } +create : /create/i /or replace/i /trigger/i table_name not_end m#^/$#im + { + @table_comments = (); + my $trigger_name = $item[4]; + # Hack to strip owner from trigger name + $trigger_name =~ s#.*\.##; + my $owner = ''; + my $action = "$item[1] $item[2] $item[3] $item[4] $item[5]"; + + $triggers{ $trigger_name }{'order'} = ++$trigger_order; + $triggers{ $trigger_name }{'name'} = $trigger_name; + $triggers{ $trigger_name }{'owner'} = $owner; + $triggers{ $trigger_name }{'action'} = $action; + } + create : /create/i /or replace/i /procedure/i table_name not_end m#^/$#im { @table_comments = (); @@ -582,11 +605,11 @@ NAME : /\w+/ { $item[1] } TABLE : /table/i -DQSTRING : '"' /((?:[^"]|"")+)/ '"' - { ($return = $item[2]) =~ s/""/"/g; } +DQSTRING : '"' /((?:[^"]|"")+)/ '"' + { ($return = $item[3]) =~ s/""/"/g; } -SQSTRING : "'" /((?:[^']|'')*)/ "'" - { ($return = $item[2]) =~ s/''/'/g } +SQSTRING : "'" /((?:[^']|'')*)/ "'" + { ($return = $item[3]) =~ s/''/'/g } VALUE : /[-+]?\d*\.?\d+(?:[eE]\d+)?/ | SQSTRING @@ -702,6 +725,16 @@ sub parse { ); } + my @triggers = sort { + $result->{triggers}->{ $a }->{'order'} <=> $result->{triggers}->{ $b }->{'order'} + } keys %{ $result->{triggers} }; + foreach my $trigger_name (@triggers) { + $schema->add_trigger( + name => $trigger_name, + action => $result->{triggers}->{$trigger_name}->{action}, + ); + } + return 1; }