add enum_constraint
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Generator / DDL / SQLServer.pm
index c751e1d..15bab3a 100644 (file)
@@ -56,5 +56,90 @@ sub field_type_size {
 
 sub field_autoinc { ( $_[1]->is_auto_increment ? 'IDENTITY' : () ) }
 
+sub primary_key_constraint {
+  'CONSTRAINT ' .
+    $_[0]->quote($_[1]->name || $_[1]->table->name . '_pk') .
+    ' PRIMARY KEY (' .
+    join( ', ', map $_[0]->quote($_), $_[1]->fields ) .
+    ')'
+}
+
+sub index {
+  'CREATE INDEX ' .
+   $_[0]->quote($_[1]->name || $_[1]->table->name . '_idx') .
+   ' ON ' . $_[0]->quote($_[1]->table->name) .
+   ' (' . join( ', ', map $_[0]->quote($_), $_[1]->fields ) . ');'
+}
+
+sub unique_constraint_single {
+  my ($self, $constraint) = @_;
+
+  'CONSTRAINT ' .
+   $self->unique_constraint_name($constraint) .
+   ' UNIQUE (' . join( ', ', map $self->quote($_), $constraint->fields ) . ')'
+}
+
+sub unique_constraint_name {
+  my ($self, $constraint) = @_;
+  $self->quote($constraint->name || $constraint->table->name . '_uc' )
+}
+
+sub unique_constraint_multiple {
+  my ($self, $constraint) = @_;
+
+  'CREATE UNIQUE NONCLUSTERED INDEX ' .
+   $self->unique_constraint_name($constraint) .
+   ' ON ' . $self->quote($constraint->table->name) . ' (' .
+   join( ', ', $constraint->fields ) . ')' .
+   ' WHERE ' . join( ' AND ',
+    map $self->quote($_->name) . ' IS NOT NULL',
+    grep { $_->is_nullable } $constraint->fields ) . ';'
+}
+
+sub foreign_key_constraint {
+  my ($self, $constraint) = @_;
+
+  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 (map uc $_ || '', $on_delete, $on_update) {
+    undef $_ if $_ eq 'RESTRICT'
+  }
+
+  'ALTER TABLE ' . $self->quote($constraint->table->name) .
+   ' ADD CONSTRAINT ' .
+   $self->quote($constraint->name || $constraint->table->name . '_fk') .
+   ' FOREIGN KEY' .
+   ' (' . join( ', ', map $self->quote($_), $constraint->fields ) . ') REFERENCES '.
+   $self->quote($constraint->reference_table) .
+   ' (' . join( ', ', map $self->quote($_), $constraint->reference_fields ) . ')'
+   . (
+     $on_delete && $on_delete ne "NO ACTION"
+       ? ' ON DELETE ' . $on_delete
+       : ''
+   ) . (
+     $on_update && $on_update ne "NO ACTION"
+       ? ' ON UPDATE ' . $on_update
+       : ''
+   ) . ';';
+}
+
+sub enum_constraint_name {
+  my ($self, $field_name) = @_;
+  $self->quote($field_name . '_chk' )
+}
+
+sub enum_constraint {
+  my ( $self, $field_name, $vals ) = @_;
+
+  return (
+     'CONSTRAINT ' . $self->enum_constraint_name($field_name) .
+       ' CHECK (' . $self->quote($field_name) .
+       ' IN (' . join( ',', map qq('$_'), @$vals ) . '))'
+  )
+}
+
 1;