Commit a41f75dd authored by Max Kanat-Alexander's avatar Max Kanat-Alexander

Bug 545770: Make contrib/merge-users.pl figure out what columns to merge

by tracing FKs instead of having a fixed list. r=LpSolit, a=LpSolit
parent 0ee52e9d
...@@ -754,10 +754,10 @@ sub bz_drop_fk { ...@@ -754,10 +754,10 @@ sub bz_drop_fk {
} }
sub bz_drop_related_fks { sub bz_get_related_fks {
my ($self, $table, $column) = @_; my ($self, $table, $column) = @_;
my @tables = $self->_bz_real_schema->get_table_list(); my @tables = $self->_bz_real_schema->get_table_list();
my @dropped; my @related;
foreach my $check_table (@tables) { foreach my $check_table (@tables) {
my @columns = $self->bz_table_columns($check_table); my @columns = $self->bz_table_columns($check_table);
foreach my $check_column (@columns) { foreach my $check_column (@columns) {
...@@ -767,13 +767,22 @@ sub bz_drop_related_fks { ...@@ -767,13 +767,22 @@ sub bz_drop_related_fks {
and (($fk->{TABLE} eq $table and $fk->{COLUMN} eq $column) and (($fk->{TABLE} eq $table and $fk->{COLUMN} eq $column)
or ($check_column eq $column and $check_table eq $table))) or ($check_column eq $column and $check_table eq $table)))
{ {
$self->bz_drop_fk($check_table, $check_column); push(@related, [$check_table, $check_column, $fk]);
push(@dropped, [$check_table, $check_column, $fk]);
} }
} # foreach $column } # foreach $column
} # foreach $table } # foreach $table
return \@dropped; return \@related;
}
sub bz_drop_related_fks {
my $self = shift;
my $related = $self->bz_get_related_fks(@_);
foreach my $item (@$related) {
my ($table, $column) = @$item;
$self->bz_drop_fk($table, $column);
}
return $related;
} }
sub bz_drop_index { sub bz_drop_index {
......
...@@ -121,20 +121,13 @@ if ($old_id == $new_id) { ...@@ -121,20 +121,13 @@ if ($old_id == $new_id) {
# where fooN is the column to update, and barN1, barN2, ... are # where fooN is the column to update, and barN1, barN2, ... are
# the columns to take into account to avoid duplicated entries. # the columns to take into account to avoid duplicated entries.
# Note that the barNM columns are optional. # Note that the barNM columns are optional.
my $changes = { #
# Tables affecting bugs. # We set the tables that require custom stuff (multiple columns to check)
bugs => ['assigned_to', 'reporter', 'qa_contact'], # here, but the simple stuff is all handled below by bz_get_related_fks.
bugs_activity => ['who'], my %changes = (
attachments => ['submitter_id'],
flags => ['setter_id', 'requestee_id'],
cc => ['who bug_id'], cc => ['who bug_id'],
longdescs => ['who'],
# Tables affecting global behavior / other users. # Tables affecting global behavior / other users.
components => ['initialowner', 'initialqacontact'],
component_cc => ['user_id component_id'], component_cc => ['user_id component_id'],
quips => ['userid'],
series => ['creator'],
whine_events => ['owner_userid'],
watch => ['watcher watched', 'watched watcher'], watch => ['watcher watched', 'watched watcher'],
# Tables affecting the user directly. # Tables affecting the user directly.
namedqueries => ['userid name'], namedqueries => ['userid name'],
...@@ -142,17 +135,23 @@ my $changes = { ...@@ -142,17 +135,23 @@ my $changes = {
user_group_map => ['user_id group_id isbless grant_type'], user_group_map => ['user_id group_id isbless grant_type'],
email_setting => ['user_id relationship event'], email_setting => ['user_id relationship event'],
profile_setting => ['user_id setting_name'], profile_setting => ['user_id setting_name'],
profiles_activity => ['userid', 'who'], # Should activity be migrated?
# Only do it if mailto_type = 0, i.e is pointing to a user account! # Only do it if mailto_type = 0, i.e is pointing to a user account!
# This requires to be done separately due to this condition. # This requires to be done separately due to this condition.
whine_schedules => [], # ['mailto'], whine_schedules => [], # ['mailto'],
);
my $userid_fks = $dbh->bz_get_related_fks('profiles', 'userid');
foreach my $item (@$userid_fks) {
my ($table, $column) = @$item;
$changes{$table} ||= [];
push(@{ $changes{$table} }, $column);
}
# Delete all old records for these tables; no migration. # Delete all old records for these tables; no migration.
logincookies => [], # ['userid'], foreach my $table (qw(logincookies tokens profiles)) {
tokens => [], # ['userid'], $changes{$table} = [];
profiles => [], # ['userid'], }
};
# Start the transaction # Start the transaction
$dbh->bz_start_transaction(); $dbh->bz_start_transaction();
...@@ -162,8 +161,8 @@ $dbh->do('DELETE FROM logincookies WHERE userid = ?', undef, $old_id); ...@@ -162,8 +161,8 @@ $dbh->do('DELETE FROM logincookies WHERE userid = ?', undef, $old_id);
$dbh->do('DELETE FROM tokens WHERE userid = ?', undef, $old_id); $dbh->do('DELETE FROM tokens WHERE userid = ?', undef, $old_id);
# Migrate records from old user to new user. # Migrate records from old user to new user.
foreach my $table (keys(%$changes)) { foreach my $table (keys %changes) {
foreach my $column_list (@{$changes->{$table}}) { foreach my $column_list (@{ $changes{$table} }) {
# Get all columns to consider. There is always at least # Get all columns to consider. There is always at least
# one column given: the one to update. # one column given: the one to update.
my @columns = split(/[\s]+/, $column_list); my @columns = split(/[\s]+/, $column_list);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment