add enum_constraint
Arthur Axel 'fREW' Schmidt [Thu, 10 Mar 2011 01:38:11 +0000 (19:38 -0600)]
lib/SQL/Translator/Generator/DDL/SQLServer.pm
lib/SQL/Translator/Producer/SQLServer.pm

index 0d9c5cc..15bab3a 100644 (file)
@@ -126,5 +126,20 @@ sub foreign_key_constraint {
    ) . ';';
 }
 
+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;
 
index a125873..741f61e 100644 (file)
@@ -144,15 +144,9 @@ sub produce {
             #
             my $data_type      = lc $field->data_type;
             my %extra          = $field->extra;
-            my $list           = $extra{'list'} || [];
-            # \todo deal with embedded quotes
-            my $commalist      = join( ', ', map { qq['$_'] } @$list );
 
             if ( $data_type eq 'enum' ) {
-                my $check_name = mk_name( $field_name . '_chk' );
-                push @constraint_defs,
-                  "CONSTRAINT $check_name CHECK ($field_name IN ($commalist))";
-                $data_type .= 'character varying';
+                push @constraint_defs, $future->enum_constraint($field_name, $extra{'list'} || [])
             }
 
             push @field_defs, $future->field($field);