DB2.pm the first
Jess Robinson [Sat, 20 Nov 2004 15:47:39 +0000 (15:47 +0000)]
lib/SQL/Translator/Parser/DB2.pm [new file with mode: 0644]

diff --git a/lib/SQL/Translator/Parser/DB2.pm b/lib/SQL/Translator/Parser/DB2.pm
new file mode 100644 (file)
index 0000000..8a89f37
--- /dev/null
@@ -0,0 +1,112 @@
+package SQL::Translator::Parser::DB2;
+use Data::Dumper;
+use SQL::Translator::Parser::DB2::Grammar;
+use Exporter;
+use base qw(Exporter);
+
+@EXPORT_OK = qw(parse);
+
+# Enable warnings within the Parse::RecDescent module.
+$::RD_ERRORS = 1; # Make sure the parser dies when it encounters an error
+$::RD_WARN   = 1; # Enable warnings. This will warn on unused rules &c.
+$::RD_HINT   = 1; # Give out hints to help fix problems.
+
+# -------------------------------------------------------------------
+sub parse {
+    my ( $translator, $data ) = @_;
+    my $parser = SQL::Translator::Parser::DB2::Grammar->new();
+
+    local $::RD_TRACE  = $translator->trace ? 1 : undef;
+    local $DEBUG       = $translator->debug;
+
+    unless (defined $parser) {
+        return $translator->error("Error instantiating Parse::RecDescent ".
+            "instance: Bad grammer");
+    }
+
+    my $result = $parser->startrule($data);
+    return $translator->error( "Parse failed." ) unless defined $result;
+    warn Dumper( $result ) if $DEBUG;
+
+    my $schema = $translator->schema;
+    my @tables = 
+        map   { $_->[1] }
+        sort  { $a->[0] <=> $b->[0] } 
+        map   { [ $result->{'tables'}{ $_ }->{'order'}, $_ ] }
+        keys %{ $result->{'tables'} };
+
+    for my $table_name ( @tables ) {
+        my $tdata =  $result->{'tables'}{ $table_name };
+        my $table =  $schema->add_table( 
+            name  => $tdata->{'name'},
+        ) or die $schema->error;
+
+        $table->comments( $tdata->{'comments'} );
+
+        for my $fdata ( @{ $tdata->{'fields'} } ) {
+            my $field = $table->add_field(
+                name              => $fdata->{'name'},
+                data_type         => $fdata->{'data_type'},
+                size              => $fdata->{'size'},
+                default_value     => $fdata->{'default'},
+                is_auto_increment => $fdata->{'is_auto_inc'},
+                is_nullable       => $fdata->{'is_nullable'},
+                comments          => $fdata->{'comments'},
+            ) or die $table->error;
+
+            $table->primary_key( $field->name ) if $fdata->{'is_primary_key'};
+
+            for my $cdata ( @{ $fdata->{'constraints'} } ) {
+                next unless $cdata->{'type'} eq 'foreign_key';
+                $cdata->{'fields'} ||= [ $field->name ];
+                push @{ $tdata->{'constraints'} }, $cdata;
+            }
+        }
+
+        for my $idata ( @{ $tdata->{'indices'} || [] } ) {
+            my $index  =  $table->add_index(
+                name   => $idata->{'name'},
+                type   => uc $idata->{'type'},
+                fields => $idata->{'fields'},
+            ) or die $table->error;
+        }
+
+        for my $cdata ( @{ $tdata->{'constraints'} || [] } ) {
+            my $constraint       =  $table->add_constraint(
+                name             => $cdata->{'name'},
+                type             => $cdata->{'type'},
+                fields           => $cdata->{'fields'},
+                reference_table  => $cdata->{'reference_table'},
+                reference_fields => $cdata->{'reference_fields'},
+                match_type       => $cdata->{'match_type'} || '',
+                on_delete        => $cdata->{'on_delete_do'},
+                on_update        => $cdata->{'on_update_do'},
+            ) or die $table->error;
+        }
+    }
+
+    for my $def ( @{ $result->{'views'} || [] } ) {
+        my $view = $schema->add_view(
+            name => $def->{'name'},
+            sql  => $def->{'sql'},
+        );
+    }
+
+    for my $def ( @{ $result->{'triggers'} || [] } ) {
+        my $trig                = $schema->add_trigger(
+            name                => $def->{'name'},
+            perform_action_when => $def->{'when'},
+            database_event      => $def->{'db_event'},
+            action              => $def->{'action'},
+            fields              => $def->{'fields'},
+            on_table            => $def->{'table'}
+                                                       );
+        $trig->extra( reference => $def->{'reference'},
+                      condition => $def->{'condition'},
+                      granularity => $def->{'granularity'} );
+    }
+
+    return 1;
+}
+
+1;