Add trigger support to PostgreSQL producer and parser (including trigger scope)
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Producer / PostgreSQL.pm
index 551f9b1..c994817 100644 (file)
@@ -21,8 +21,8 @@ Does not yet support PostGIS Views.
 
 use strict;
 use warnings;
-use vars qw[ $DEBUG $WARN $VERSION ];
-$VERSION = '1.59';
+our ( $DEBUG, $WARN );
+our $VERSION = '1.59';
 $DEBUG = 0 unless defined $DEBUG;
 
 use base qw(SQL::Translator::Producer);
@@ -201,6 +201,13 @@ sub produce {
       });
     }
 
+    for my $trigger ( $schema->get_triggers ) {
+      push @table_defs, create_trigger( $trigger, {
+          add_drop_trigger => $add_drop_table,
+          no_comments      => $no_comments,
+        });
+    }
+
     push @output, map { "$_;\n\n" } values %type_defs;
     push @output, map { "$_;\n\n" } @table_defs;
     if ( @fks ) {
@@ -552,7 +559,7 @@ sub create_index
 
     my $type = $index->type || NORMAL;
     my @fields     =  $index->fields;
-    next unless @fields;
+    return unless @fields;
 
     my $def_start = qq[CONSTRAINT ${qf}$name${qf} ];
     my $field_names = '(' . join(", ", (map { $_ =~ /\(.*\)/ ? $_ : ($qf . $_ . $qf ) } @fields)) . ')';
@@ -634,6 +641,30 @@ sub create_constraint
     return \@constraint_defs, \@fks;
 }
 
+sub create_trigger {
+  my ($trigger,$options) = @_;
+
+  my @statements;
+
+  push @statements, sprintf( 'DROP TRIGGER IF EXISTS %s', $trigger->name )
+    if $options->{add_drop_trigger};
+
+  my $scope = $trigger->scope || '';
+  $scope = " FOR EACH $scope" if $scope;
+
+  push @statements, sprintf(
+    'CREATE TRIGGER %s %s %s ON %s%s %s',
+    $trigger->name,
+    $trigger->perform_action_when,
+    join( ' OR ', @{ $trigger->database_events } ),
+    $trigger->on_table,
+    $scope,
+    $trigger->action,
+  );
+
+  return @statements;
+}
+
 sub convert_datatype
 {
     my ($field) = @_;