Revert my previous changes (rev 1722 reverted back to rev 1721)
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Producer / SQLServer.pm
index b211847..8affe1a 100644 (file)
@@ -152,6 +152,9 @@ sub produce {
     }
 
     # Generate the CREATE sql
+
+    my @foreign_constraints = (); # these need to be added separately, as tables may not exist yet
+
     for my $table ( $schema->get_tables ) {
         my $table_name    = $table->name or next;
         my $table_name_ur = unreserve($table_name) || '';
@@ -195,6 +198,9 @@ sub produce {
             elsif ( $data_type eq 'set' ) {
                 $data_type .= 'character varying';
             }
+            elsif ( grep { $data_type eq $_ } qw/bytea blob clob/ ) {
+                $data_type = 'varbinary';
+            }
             else {
                 if ( defined $translate{ $data_type } ) {
                     $data_type = $translate{ $data_type };
@@ -247,16 +253,13 @@ sub produce {
             #
             # Default value
             #
-            my $default = $field->default_value;
-            if ( defined $default ) {
-                SQL::Translator::Producer->_apply_default_value(
-                  \$field_def,
-                  $default, 
-                  [
-                    'NULL'       => \'NULL',
-                  ],
-                );
-            }
+            SQL::Translator::Producer->_apply_default_value(
+              $field,
+              \$field_def,
+              [
+                'NULL'       => \'NULL',
+              ],
+            );
 
             push @field_defs, $field_def;            
         }
@@ -275,29 +278,45 @@ sub produce {
                 $constraint->reference_fields;
             next unless @fields;
 
-                       my $c_def;
+            my $c_def;
+            if ( $type eq FOREIGN_KEY ) {
+                $name ||= mk_name( $table_name . '_fk' );
+                my $on_delete = uc ($constraint->on_delete || '');
+                my $on_update = uc ($constraint->on_update || '');
+
+                # The default implicit constraint action in MSSQL is RESTRICT
+                # but you can not specify it explicitly. Go figure :)
+                for ($on_delete, $on_update) {
+                  undef $_ if $_ eq 'RESTRICT'
+                }
+
+                $c_def = 
+                    "ALTER TABLE $table_name ADD CONSTRAINT $name FOREIGN KEY".
+                    ' (' . join( ', ', @fields ) . ') REFERENCES '.
+                    $constraint->reference_table.
+                    ' (' . join( ', ', @rfields ) . ')'
+                ;
+
+                if ( $on_delete && $on_delete ne "NO ACTION") {
+                  $c_def .= " ON DELETE $on_delete";
+                }
+                if ( $on_update && $on_update ne "NO ACTION") {
+                  $c_def .= " ON UPDATE $on_update";
+                }
+
+                $c_def .= ";";
+
+                push @foreign_constraints, $c_def;
+                next;
+            }
+
+
             if ( $type eq PRIMARY_KEY ) {
                 $name ||= mk_name( $table_name . '_pk' );
                 $c_def = 
                     "CONSTRAINT $name PRIMARY KEY ".
                     '(' . join( ', ', @fields ) . ')';
             }
-            elsif ( $type eq FOREIGN_KEY ) {
-                $name ||= mk_name( $table_name . '_fk' );
-                $c_def = 
-                    "CONSTRAINT $name FOREIGN KEY".
-                    ' (' . join( ', ', @fields ) . ') REFERENCES '.
-                    $constraint->reference_table.
-                    ' (' . join( ', ', @rfields ) . ')';
-                 my $on_delete = $constraint->on_delete;
-                 if ( $on_delete && $on_delete ne "NO ACTION") {
-                       $c_def .= " ON DELETE $on_delete";
-                 }
-                 my $on_update = $constraint->on_update;
-                 if ( $on_update && $on_update ne "NO ACTION") {
-                       $c_def .= " ON UPDATE $on_update";
-                 }
-            }
             elsif ( $type eq UNIQUE ) {
                 $name ||= mk_name( $table_name . '_uc' );
                 $c_def = 
@@ -332,6 +351,9 @@ sub produce {
         );
     }
 
+# Add FK constraints
+    $output .= join ("\n", '', @foreign_constraints) if @foreign_constraints;
+
 # create view/procedure are NOT prepended to the input $sql, needs
 # to be filled in with the proper syntax