Correct constraint names in preprocess for MySQL producer
Ash Berlin [Thu, 10 Jan 2008 13:55:19 +0000 (13:55 +0000)]
META.yml
lib/SQL/Translator/Producer/MySQL.pm
t/16xml-parser.t
t/30sqlt-new-diff-mysql.t

index 0286bed..32fa024 100644 (file)
--- a/META.yml
+++ b/META.yml
@@ -237,7 +237,7 @@ provides:
   Test::SQL::Translator:
     file: lib/Test/SQL/Translator.pm
     version: 1.08
-generated_by: Module::Build version 0.2806
+generated_by: Module::Build version 0.2808
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.2.html
   version: 1.2
index f3f53a4..6c20e56 100644 (file)
@@ -167,6 +167,9 @@ sub preprocess_schema {
 
     };
 
+    # Names are only specific to a given schema
+    local %used_names = ();
+
     #
     # Work out which tables need to be InnoDB to support foreign key
     # constraints. We do this first as we need InnoDB at both ends.
@@ -175,10 +178,19 @@ sub preprocess_schema {
        
         $mysql_table_type_to_options->($table);
 
-        foreach ( $table->get_constraints ) {
-            next unless $_->type eq FOREIGN_KEY;
+        foreach my $c( $table->get_constraints ) {
+            next unless $c->type eq FOREIGN_KEY;
+
+            # Normalize constraint names here.
+            my $c_name = $c->name;
+            # Give the constraint a name if it doesn't have one, so it doens't feel
+            # left out
+            $c_name   = $table->name . '_fk' unless length $c_name;
+            
+            $c->name( next_unused_name($c_name) );
+
             for my $meth (qw/table reference_table/) {
-                my $table = $schema->get_table($_->$meth) || next;
+                my $table = $schema->get_table($c->$meth) || next;
                 next if $mysql_table_type_to_options->($table);
                 $table->options( { 'ENGINE' => 'InnoDB' } );
             }
@@ -510,7 +522,6 @@ sub create_constraint
     my $qf      = $options->{quote_field_names} || '';
     my $qt      = $options->{quote_table_names} || '';
     my $leave_name      = $options->{leave_name} || undef;
-    my $counter = ($options->{fk_name_counter}   ||= {});
 
     my @fields = $c->fields or next;
 
@@ -531,18 +542,10 @@ sub create_constraint
         my $table = $c->table;
         my $c_name = $c->name;
 
-        # Give the constraint a name if it doesn't have one, so it doens't feel
-        # left out
-        unless ( $c_name ){
-            $c_name   = $table->name . '_fk';
-        }
-
-        $counter->{$table} ||= {};
         my $def = join(' ', 
                        map { $_ || () } 
                          'CONSTRAINT', 
-                         $qt . join('_', next_unused_name($c_name)
-                                   ) . $qt, 
+                         $qt . $c_name . $qt, 
                          'FOREIGN KEY'
                       );
 
index ed4a93d..b7fcb78 100644 (file)
@@ -154,6 +154,7 @@ schema_ok( $scma, {
                     fields => ["another_id"],
                     reference_table => "Another",
                     reference_fields => ["id"],
+                    name => 'Basic_fk'
                 },
             ],
             indices => [
index eca0a2d..0927d7d 100644 (file)
@@ -155,7 +155,7 @@ SET foreign_key_checks=1;
 
 ALTER TABLE employee DROP FOREIGN KEY FK5302D47D93FE702E,
                      DROP COLUMN job_title,
-                     ADD CONSTRAINT FK5302D47D93FE702E_diff_1 FOREIGN KEY (employee_id) REFERENCES person (person_id);
+                     ADD CONSTRAINT FK5302D47D93FE702E_diff FOREIGN KEY (employee_id) REFERENCES person (person_id);
 ALTER TABLE person DROP UNIQUE UC_age_name,
                    DROP INDEX u_name,
                    ADD COLUMN is_rock_star tinyint(4) DEFAULT '1',