diff options
-rw-r--r-- | Bugzilla/DB.pm | 19 | ||||
-rwxr-xr-x | contrib/merge-users.pl | 37 |
2 files changed, 32 insertions, 24 deletions
diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index 830d2835e..85ad77e17 100644 --- a/Bugzilla/DB.pm +++ b/Bugzilla/DB.pm @@ -754,10 +754,10 @@ sub bz_drop_fk { } -sub bz_drop_related_fks { +sub bz_get_related_fks { my ($self, $table, $column) = @_; my @tables = $self->_bz_real_schema->get_table_list(); - my @dropped; + my @related; foreach my $check_table (@tables) { my @columns = $self->bz_table_columns($check_table); foreach my $check_column (@columns) { @@ -767,13 +767,22 @@ sub bz_drop_related_fks { and (($fk->{TABLE} eq $table and $fk->{COLUMN} eq $column) or ($check_column eq $column and $check_table eq $table))) { - $self->bz_drop_fk($check_table, $check_column); - push(@dropped, [$check_table, $check_column, $fk]); + push(@related, [$check_table, $check_column, $fk]); } } # foreach $column } # 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 { diff --git a/contrib/merge-users.pl b/contrib/merge-users.pl index 6c1ed1377..ee6ec8628 100755 --- a/contrib/merge-users.pl +++ b/contrib/merge-users.pl @@ -121,20 +121,13 @@ if ($old_id == $new_id) { # where fooN is the column to update, and barN1, barN2, ... are # the columns to take into account to avoid duplicated entries. # Note that the barNM columns are optional. -my $changes = { - # Tables affecting bugs. - bugs => ['assigned_to', 'reporter', 'qa_contact'], - bugs_activity => ['who'], - attachments => ['submitter_id'], - flags => ['setter_id', 'requestee_id'], +# +# We set the tables that require custom stuff (multiple columns to check) +# here, but the simple stuff is all handled below by bz_get_related_fks. +my %changes = ( cc => ['who bug_id'], - longdescs => ['who'], # Tables affecting global behavior / other users. - components => ['initialowner', 'initialqacontact'], component_cc => ['user_id component_id'], - quips => ['userid'], - series => ['creator'], - whine_events => ['owner_userid'], watch => ['watcher watched', 'watched watcher'], # Tables affecting the user directly. namedqueries => ['userid name'], @@ -142,17 +135,23 @@ my $changes = { user_group_map => ['user_id group_id isbless grant_type'], email_setting => ['user_id relationship event'], 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! # This requires to be done separately due to this condition. 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. - logincookies => [], # ['userid'], - tokens => [], # ['userid'], - profiles => [], # ['userid'], -}; +# Delete all old records for these tables; no migration. +foreach my $table (qw(logincookies tokens profiles)) { + $changes{$table} = []; +} # Start the transaction $dbh->bz_start_transaction(); @@ -162,8 +161,8 @@ $dbh->do('DELETE FROM logincookies WHERE userid = ?', undef, $old_id); $dbh->do('DELETE FROM tokens WHERE userid = ?', undef, $old_id); # Migrate records from old user to new user. -foreach my $table (keys(%$changes)) { - foreach my $column_list (@{$changes->{$table}}) { +foreach my $table (keys %changes) { + foreach my $column_list (@{ $changes{$table} }) { # Get all columns to consider. There is always at least # one column given: the one to update. my @columns = split(/[\s]+/, $column_list); |