From ed7dea412c4ace135b2145746524d6b12795ef17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tina=20M=C3=BCller?= Date: Sun, 23 Aug 2015 19:54:15 +0200 Subject: [PATCH 1/2] datatype mapping; IDENTITY datatype mapping must also be done for identity fields IDENTITY comes after the datatype, not before --- AUTHORS | 2 +- lib/SQL/Translator/Producer/Sybase.pm | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/AUTHORS b/AUTHORS index 26d2c5e1b..60165b4b1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -56,7 +56,7 @@ The following people have contributed to the SQLFairy project: - Stephen Bennett - Stephen Clouse - SymKat -- Tina Müller +- Tina Müller - Vincent Bachelier - Wallace Reis - William Wolf diff --git a/lib/SQL/Translator/Producer/Sybase.pm b/lib/SQL/Translator/Producer/Sybase.pm index fec655a64..3777c8ca6 100644 --- a/lib/SQL/Translator/Producer/Sybase.pm +++ b/lib/SQL/Translator/Producer/Sybase.pm @@ -163,6 +163,8 @@ sub produce { my $commalist = join( ', ', map { qq['$_'] } @$list ); my $seq_name; + my $identity = ''; + if ( $data_type eq 'enum' ) { my $check_name = mk_name( $table_name.'_'.$field_name, 'chk' ,undef, 1 @@ -174,10 +176,10 @@ sub produce { elsif ( $data_type eq 'set' ) { $data_type .= 'character varying'; } - elsif ( $field->is_auto_increment ) { - $field_def .= ' IDENTITY'; - } else { + if ( $field->is_auto_increment ) { + $identity = 'IDENTITY'; + } if ( defined $translate{ $data_type } ) { $data_type = $translate{ $data_type }; } @@ -209,6 +211,7 @@ sub produce { $field_def .= " $data_type"; $field_def .= "($size)" if $size; + $field_def .= " $identity" if $identity; # # Default value From 010b5b1f261574b5fcfcce734d7e3db882f97ddc Mon Sep 17 00:00:00 2001 From: Tina Mueller Date: Wed, 26 Aug 2015 16:46:14 +0200 Subject: [PATCH 2/2] put FK at the end; return a list in list context In Sybase you can't deactivate foreign keys; so put all the foreign key statements at the end after the create statements Return a list of statements in list context, like DBIC deployment_statements prefers. --- lib/SQL/Translator/Producer/Sybase.pm | 35 ++++++++++++++------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/lib/SQL/Translator/Producer/Sybase.pm b/lib/SQL/Translator/Producer/Sybase.pm index 3777c8ca6..1a7375d17 100644 --- a/lib/SQL/Translator/Producer/Sybase.pm +++ b/lib/SQL/Translator/Producer/Sybase.pm @@ -123,8 +123,10 @@ sub produce { my $add_drop_table = $translator->add_drop_table; my $schema = $translator->schema; - my $output; - $output .= header_comment unless ($no_comments); + my @output; + push @output, header_comment unless ($no_comments); + + my @foreign_keys; for my $table ( $schema->get_tables ) { my $table_name = $table->name or next; @@ -260,8 +262,8 @@ sub produce { } elsif ( $type eq FOREIGN_KEY ) { $name ||= mk_name( $table_name, 'fk', undef,1 ); - push @constraint_defs, - "CONSTRAINT $name FOREIGN KEY". + push @foreign_keys, + "ALTER TABLE $table ADD CONSTRAINT $name FOREIGN KEY". ' (' . join( ', ', @fields ) . ') REFERENCES '. $constraint->reference_table. ' (' . join( ', ', @rfields ) . ')'; @@ -284,25 +286,23 @@ sub produce { push @index_defs, 'CREATE INDEX ' . $index->name . " ON $table_name (". - join( ', ', $index->fields ) . ");"; + join( ', ', $index->fields ) . ")"; } - my $create_statement; - $create_statement = qq[DROP TABLE $table_name_ur;\n] - if $add_drop_table; - $create_statement .= qq[CREATE TABLE $table_name_ur (\n]. + my $drop_statement = $add_drop_table + ? qq[DROP TABLE $table_name_ur] : ''; + my $create_statement = qq[CREATE TABLE $table_name_ur (\n]. join( ",\n", map { " $_" } @field_defs, @constraint_defs ). - "\n);" + "\n)" ; - $output .= join( "\n\n", - @comments, + $create_statement = join("\n\n", @comments) . "\n\n" . $create_statement; + push @output, $create_statement, @index_defs, - '' - ); + ; } foreach my $view ( $schema->get_views ) { @@ -314,7 +314,7 @@ sub produce { # text of view is already a 'create view' statement so no need # to do anything fancy. - $output .= join("\n\n", + push @output, join("\n\n", @comments, $view->sql(), ); @@ -333,11 +333,12 @@ sub produce { # think about doing fancy stuff with granting permissions and # so on. - $output .= join("\n\n", + push @output, join("\n\n", @comments, $procedure->sql(), ); } + push @output, @foreign_keys; if ( $WARN ) { if ( %truncated ) { @@ -352,7 +353,7 @@ sub produce { } } - return $output; + return wantarray ? @output : join ";\n\n", @output; } sub mk_name {