Fix DROP TABLE in SQL Server Producer
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Generator / DDL / SQLServer.pm
index 649fc7e..9e35d89 100644 (file)
@@ -1,12 +1,24 @@
 package SQL::Translator::Generator::DDL::SQLServer;
 
+=head1 NAME
+
+SQL::Translator::Generator::DDL::SQLServer - A Moo based MS SQL Server DDL
+generation engine.
+
+=head1 DESCRIPTION
+
+I<documentation volunteers needed>
+
+=cut
+
 use Moo;
-use SQL::Translator::Generator::Utils;
 use SQL::Translator::Schema::Constants;
 
+with 'SQL::Translator::Generator::Role::Quote';
 with 'SQL::Translator::Generator::Role::DDL';
 
-sub _build_shim { SQL::Translator::Generator::Utils->new( quote_chars => [qw( [ ] )] ) }
+sub quote_chars { [qw([ ])] }
+sub name_sep { q(.) }
 
 sub _build_numeric_types {
    +{
@@ -27,11 +39,6 @@ sub _build_type_map {
    }
 }
 
-has sizeless_types => (
-   is => 'ro',
-   builder => '_build_sizeless_types',
-);
-
 sub _build_sizeless_types {
    +{ map { $_ => 1 }
          qw( tinyint smallint int integer bigint text bit image datetime ) }
@@ -46,15 +53,6 @@ sub field {
       $self->field_default($field),
 }
 
-sub field_type_size {
-   my ($self, $field) = @_;
-
-   ($field->size && !$self->sizeless_types->{$field->data_type}
-      ? '(' . $field->size . ')'
-      : ''
-   )
-}
-
 sub field_autoinc { ( $_[1]->is_auto_increment ? 'IDENTITY' : () ) }
 
 sub primary_key_constraint {
@@ -91,7 +89,7 @@ sub unique_constraint_multiple {
   'CREATE UNIQUE NONCLUSTERED INDEX ' .
    $self->unique_constraint_name($constraint) .
    ' ON ' . $self->quote($constraint->table->name) . ' (' .
-   join( ', ', $constraint->fields ) . ')' .
+   join( ', ', map $self->quote($_), $constraint->fields ) . ')' .
    ' WHERE ' . join( ' AND ',
     map $self->quote($_->name) . ' IS NOT NULL',
     grep { $_->is_nullable } $constraint->fields ) . ';'
@@ -160,13 +158,27 @@ sub constraints {
 
 sub table {
    my ($self, $table) = @_;
-   'CREATE TABLE ' . $self->quote($table->name) . " (\n".
-     join( ",\n",
-        map { "  $_" }
-        $self->fields($table),
-        $self->constraints($table),
-     ) .
-     "\n);",
+   join ( "\n", $self->table_comments($table), '' ) .
+   join ( "\n\n",
+      'CREATE TABLE ' . $self->quote($table->name) . " (\n".
+        join( ",\n",
+           map { "  $_" }
+           $self->fields($table),
+           $self->constraints($table),
+        ) .
+        "\n);",
+        $self->unique_constraints_multiple($table),
+        $self->indices($table),
+   )
+}
+
+sub unique_constraints_multiple {
+  my ($self, $table) = @_;
+  (map $self->unique_constraint_multiple($_),
+     grep {
+        $_->type eq UNIQUE &&
+        grep { $_->is_nullable } $_->fields
+     } $table->get_constraints)
 }
 
 sub drop_table {
@@ -186,7 +198,7 @@ sub remove_table_constraints {
 }
 
 sub drop_tables {
-   my ($self, $schema) = shift;
+   my ($self, $schema) = @_;
 
    if ($self->add_drop_table) {
       my @tables = sort { $b->order <=> $a->order } $schema->get_tables;
@@ -218,5 +230,29 @@ sub foreign_key_constraints {
      $schema->get_tables )
 }
 
+sub schema {
+   my ($self, $schema) = @_;
+
+   $self->header_comments .
+      $self->drop_tables($schema) .
+      join("\n\n", map $self->table($_), grep { $_->name } $schema->get_tables) .
+      "\n" . join "\n", $self->foreign_key_constraints($schema)
+}
+
 1;
 
+=head1 AUTHORS
+
+See the included AUTHORS file:
+L<http://search.cpan.org/dist/SQL-Translator/AUTHORS>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2012 the SQL::Translator L</AUTHORS> as listed above.
+
+=head1 LICENSE
+
+This code is free software and may be distributed under the same terms as Perl
+itself.
+
+=cut