Merge 'trunk' into 'replication_dedux'
John Napiorkowski [Wed, 4 Jun 2008 17:12:45 +0000 (17:12 +0000)]
r13529@dev (orig r4456):  castaway | 2008-06-02 13:46:12 -0500
I suck, should read code while doccing it, not assume someone else got it right!

r13584@dev (orig r4462):  ash | 2008-06-03 11:11:25 -0500
Remove the length limit on identifiers - it doesn't belong in DBIx::Class
A few doc fixes
r13585@dev (orig r4463):  ash | 2008-06-03 13:15:27 -0500
Remove Digest::SHA1 dep too

1  2 
Makefile.PL
lib/SQL/Translator/Parser/DBIx/Class.pm
t/71mysql.t
t/86sqlt.t

diff --combined Makefile.PL
@@@ -22,9 -22,7 +22,8 @@@ requires 'Class::Inspector'          =
  requires 'Class::Accessor::Grouped'  => 0.05002;
  requires 'JSON::Any'                 => 1.00; 
  requires 'Scope::Guard'              => 0.03;
- requires 'Digest::SHA1'              => 2.00;
  requires 'Path::Class'               => 0;
 +requires 'List::Util'                => 1.19;
  
  # Perl 5.8.0 doesn't have utf8::is_utf8()
  requires 'Encode'                    => 0 if ($] <= 5.008000);  
@@@ -14,7 -14,6 +14,6 @@@ $DEBUG = 0 unless defined $DEBUG
  
  use Exporter;
  use Data::Dumper;
- use Digest::SHA1 qw( sha1_hex );
  use SQL::Translator::Utils qw(debug normalize_name);
  
  use base qw(Exporter);
@@@ -101,7 -100,7 +100,7 @@@ sub parse 
              if (!$source->compare_relationship_keys($unique_constraints{$uniq}, \@primary)) {
                  $table->add_constraint(
                              type             => 'unique',
-                             name             => _create_unique_symbol($uniq),
+                             name             => $uniq,
                              fields           => $unique_constraints{$uniq}
                  );
              }
              my $othertable = $source->related_source($rel);
              my $rel_table = $othertable->name;
  
 +            # Force the order of @cond to match the order of ->add_columns
 +            my $idx;
 +            my %other_columns_idx = map {'foreign.'.$_ => ++$idx } $othertable->columns;            
 +            my @cond = sort { $other_columns_idx{$a} cmp $other_columns_idx{$b} } keys(%{$rel_info->{cond}}); 
 +      
              # Get the key information, mapping off the foreign/self markers
 -            my @cond = keys(%{$rel_info->{cond}});
              my @refkeys = map {/^\w+\.(\w+)$/} @cond;
              my @keys = map {$rel_info->{cond}->{$_} =~ /^\w+\.(\w+)$/} @cond;
  
                  if (scalar(@keys)) {
                    $table->add_constraint(
                                      type             => 'foreign_key',
-                                     name             => _create_unique_symbol($table->name
-                                                                             . '_fk_'
-                                                                             . join('_', @keys)),
+                                     name             => join('_', $table->name, 'fk', @keys),
                                      fields           => \@keys,
                                      reference_fields => \@refkeys,
                                      reference_table  => $rel_table,
                    );
                      
                    my $index = $table->add_index(
-                                     name   => _create_unique_symbol(join('_', $table->name, 'idx', @keys)),
+                                     name   => join('_', $table->name, 'idx', @keys),
                                      fields => \@keys,
                                      type   => 'NORMAL',
                    );
      return 1;
  }
  
- # TODO - is there a reasonable way to pass configuration?
- # Default of 64 comes from mysql's limit.
- our $MAX_SYMBOL_LENGTH    ||= 64;
- our $COLLISION_TAG_LENGTH ||= 8;
- # -------------------------------------------------------------------
- # $resolved_name = _create_unique_symbol($desired_name)
- #
- # If desired_name is really long, it will be truncated in a way that
- # has a high probability of leaving it unique.
- # -------------------------------------------------------------------
- sub _create_unique_symbol {
-     my $desired_name = shift;
-     return $desired_name if length $desired_name <= $MAX_SYMBOL_LENGTH;
-     my $truncated_name = substr $desired_name, 0, $MAX_SYMBOL_LENGTH - $COLLISION_TAG_LENGTH - 1;
-     # Hex isn't the most space-efficient, but it skirts around allowed
-     # charset issues
-     my $digest = sha1_hex($desired_name);
-     my $collision_tag = substr $digest, 0, $COLLISION_TAG_LENGTH;
-     return $truncated_name
-          . '_'
-          . $collision_tag;
- }
  1;
diff --combined t/71mysql.t
@@@ -86,8 -86,9 +86,9 @@@ SKIP: 
  }
  
  ## Can we properly deal with the null search problem?
- use Data::Dump qw/dump/;
+ ##
+ ## Only way is to do a SET SQL_AUTO_IS_NULL = 0; on connect
+ ## But I'm not sure if we should do this or not (Ash, 2008/06/03)
  
  NULLINSEARCH: {
      
  
  # clean up our mess
  END {
 -    $dbh->do("DROP TABLE artist") if $dbh;
 -}
 +    #$dbh->do("DROP TABLE artist") if $dbh;
 +}
diff --combined t/86sqlt.t
@@@ -10,7 -10,7 +10,7 @@@ plan skip_all => 'SQL::Translator requi
  
  my $schema = DBICTest->init_schema;
  
- plan tests => 160;
+ plan tests => 131;
  
  my $translator = SQL::Translator->new( 
    parser_args => {
@@@ -58,14 -58,14 +58,14 @@@ my %fk_constraints = 
    fourkeys_to_twokeys => [
      {
        'display' => 'fourkeys_to_twokeys->twokeys',
 -      'name' => 'fourkeys_to_twokeys_fk_t_cd_t_artist', 'index_name' => 'fourkeys_to_twokeys_idx_t_cd_t_artist',
 +      'name' => 'fourkeys_to_twokeys_fk_t_artist_t_cd', 'index_name' => 'fourkeys_to_twokeys_idx_t_artist_t_cd',
        'selftable' => 'fourkeys_to_twokeys', 'foreigntable' => 'twokeys', 
        'selfcols'  => ['t_artist', 't_cd'], 'foreigncols' => ['artist', 'cd'], 
        on_delete => 'CASCADE', on_update => 'CASCADE', deferrable => 1,
      },
      {
 -      'display' => 'fourkeys_to_twokeys->fourkeys', 'index_name' => 'fourkeys_to_twokeys_idx_f_foo_f_goodbye_f_hello_f_bar',
 -      'name' => 'fourkeys_to_twokeys_fk_f_foo_f_goodbye_f_hello_f_bar',
 +      'display' => 'fourkeys_to_twokeys->fourkeys', 'index_name' => 'fourkeys_to_twokeys_idx_f_foo_f_bar_f_hello_f_goodbye',
 +      'name' => 'fourkeys_to_twokeys_fk_f_foo_f_bar_f_hello_f_goodbye',
        'selftable' => 'fourkeys_to_twokeys', 'foreigntable' => 'fourkeys', 
        'selfcols'  => [qw(f_foo f_bar f_hello f_goodbye)],
        'foreigncols' => [qw(foo bar hello goodbye)], 
        'display' => 'forceforeign->artist',
        'name' => 'forceforeign_fk_artist', 'index_name' => 'forceforeign_idx_artist',
        'selftable' => 'forceforeign', 'foreigntable' => 'artist', 
 -      'selfcols'  => ['artist'], 'foreigncols' => ['artist_id'], 
 +      'selfcols'  => ['artist'], 'foreigncols' => ['artistid'], 
        on_delete => '', on_update => '', deferrable => 1,
      },
    ],
  
-   # LongColumns
-   long_columns => [
-     {
-       'display' => 'long_columns->owner',
-       'name' => 'long_columns_fk__64_character_column_aaaaaaaaaaaaaaaaaa_cfc8d5b0',
-       'index_name' => 'long_columns_idx__64_character_column_aaaaaaaaaaaaaaaaa_5050aa42',
-       'selftable' => 'long_columns', 'foreigntable' => 'long_columns',
-       'selfcols' => ['_64_character_column_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'],
-       'foreigncols' => ['lcid'],
-       on_delete => '', on_update => '', deferrable => 1,
-     },
-     {
-       'display' => 'long_columns->owner2',
-       'name' => 'long_columns_fk__32_character_column_bbbbbbbbbbb__32_ch_b7ee284e',
-       'index_name' => 'long_columns_idx__32_character_column_bbbbbbbbbbb__32_c_82bf6e69',
-       'selftable' => 'long_columns', 'foreigntable' => 'long_columns',
-       'selfcols' => ['_32_character_column_bbbbbbbbbbb', '_32_character_column_aaaaaaaaaaa'],
-       'foreigncols' => ['_32_character_column_aaaaaaaaaaa', '_32_character_column_bbbbbbbbbbb'],
-       on_delete => '', on_update => '', deferrable => 1,
-     },
-     {
-       'display' => 'long_columns->owner3',
-       'name' => 'long_columns_fk__16_chars_column',
-       'index_name' => 'long_columns_idx__16_chars_column',
-       'selftable' => 'long_columns', 'foreigntable' => 'long_columns',
-       'selfcols' => ['_16_chars_column'], 'foreigncols' => ['_8_chr_c'],
-       on_delete => '', on_update => '', deferrable => 1,
-     },
-   ],
  );
  
  my %unique_constraints = (
      },
    ],
  
-   long_columns => [
-     {
-       'display' => 'long but not quite truncated unique',
-       'name' => 'long_columns__16_chars_column__32_character_column_aaaaaaaaaaa',
-       'table' => 'long_columns', 'cols' => [qw( _32_character_column_aaaaaaaaaaa _16_chars_column )],
-     },
-     {
-       'display' => 'multi column truncated unique',
-       'name' => 'long_columns__8_chr_c__16_chars_column__32_character_co_004ce318',
-       'table' => 'long_columns', 'cols' => [qw( _32_character_column_aaaaaaaaaaa _16_chars_column _8_chr_c )],
-     },
-     {
-       'display' => 'different multi column truncated unique with same base',
-       'name' => 'long_columns__8_chr_c__16_chars_column__32_character_co_25773323',
-       'table' => 'long_columns', 'cols' => [qw( _32_character_column_bbbbbbbbbbb _16_chars_column _8_chr_c )],
-     },
-     {
-       'display' => 'single column truncated unique',
-       'name' => 'long_columns__64_character_column_aaaaaaaaaaaaaaaaaaaaa_0acf5172',
-       'table' => 'long_columns', 'cols' => ['_64_character_column_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'],
-     },
-   ],
    # TwoKeyTreeLike
    twokeytreelike => [
      {
@@@ -364,6 -312,7 +312,7 @@@ sub get_constraint 
    my %fields = map { $_ => 1 } @$cols;
    my %f_fields = map { $_ => 1 } @$f_cols;
  
+   die "No $table_name" unless $table;
   CONSTRAINT:
    for my $constraint ( $table->get_constraints ) {
      next unless $constraint->type eq $type;