diff options
author | mkanat%bugzilla.org <> | 2006-08-11 08:44:49 +0200 |
---|---|---|
committer | mkanat%bugzilla.org <> | 2006-08-11 08:44:49 +0200 |
commit | fb079a1bcf1a9eb442dbd746d787d573a89fdc4a (patch) | |
tree | 644d05740726c4e746f0f77b3cb8b66e49100f39 /Bugzilla/DB | |
parent | d89140b00e196de6d4d6f2c8e3b163784b5c15ff (diff) | |
download | bugzilla-fb079a1bcf1a9eb442dbd746d787d573a89fdc4a.tar.gz bugzilla-fb079a1bcf1a9eb442dbd746d787d573a89fdc4a.tar.xz |
Bug 347291: Make Bugzilla::User use Bugzilla::Object
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=myk
Diffstat (limited to 'Bugzilla/DB')
-rw-r--r-- | Bugzilla/DB/Pg.pm | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/Bugzilla/DB/Pg.pm b/Bugzilla/DB/Pg.pm index 7bf64ab9d..98bfc5903 100644 --- a/Bugzilla/DB/Pg.pm +++ b/Bugzilla/DB/Pg.pm @@ -224,6 +224,49 @@ sub bz_setup_database { # login_name, which we do with sql_istrcmp all over the place. $self->bz_add_index('profiles', 'profiles_login_name_lower_idx', {FIELDS => ['LOWER(login_name)'], TYPE => 'UNIQUE'}); + + # Now that Bugzilla::Object uses sql_istrcmp, other tables + # also need a LOWER() index. + _fix_case_differences('fielddefs', 'name'); + $self->bz_add_index('fielddefs', 'fielddefs_name_lower_idx', + {FIELDS => ['LOWER(name)'], TYPE => 'UNIQUE'}); + _fix_case_differences('keyworddefs', 'name'); + $self->bz_add_index('keyworddefs', 'keyworddefs_name_lower_idx', + {FIELDS => ['LOWER(name)'], TYPE => 'UNIQUE'}); + _fix_case_differences('products', 'name'); + $self->bz_add_index('products', 'products_name_lower_idx', + {FIELDS => ['LOWER(name)'], TYPE => 'UNIQUE'}); +} + +# Renames things that differ only in case. +sub _fix_case_differences { + my ($table, $field) = @_; + my $dbh = Bugzilla->dbh; + + my $duplicates = $dbh->selectcol_arrayref( + "SELECT DISTINCT LOWER($field) FROM $table + GROUP BY LOWER($field) HAVING COUNT(LOWER($field)) > 1"); + + foreach my $name (@$duplicates) { + my $dups = $dbh->selectcol_arrayref( + "SELECT $field FROM $table WHERE LOWER($field) = ?", + undef, $name); + my $primary = shift @$dups; + foreach my $dup (@$dups) { + my $new_name = "${dup}_"; + # Make sure the new name isn't *also* a duplicate. + while (1) { + last if (!$dbh->selectrow_array( + "SELECT 1 FROM $table WHERE LOWER($field) = ?", + undef, lc($new_name))); + $new_name .= "_"; + } + print "$table '$primary' and '$dup' have names that differ", + " only in case.\nRenaming '$dup' to '$new_name'...\n"; + $dbh->do("UPDATE $table SET $field = ? WHERE $field = ?", + undef, $new_name, $dup); + } + } } ##################################################################### |