summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla/DB.pm19
-rwxr-xr-xcontrib/merge-users.pl37
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);