]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 545770: Make contrib/merge-users.pl figure out what columns to merge
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Tue, 16 Mar 2010 05:43:16 +0000 (22:43 -0700)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Tue, 16 Mar 2010 05:43:16 +0000 (22:43 -0700)
by tracing FKs instead of having a fixed list.
r=LpSolit, a=LpSolit

Bugzilla/DB.pm
contrib/merge-users.pl

index 830d2835e781421dbf11fd6f042aa395c78d44a2..85ad77e17a6048f300ed7cae64fc8334d0d5a9c1 100644 (file)
@@ -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 {
index 6c1ed13771f5bff5c6e12f7abee74880a4975d6d..ee6ec862815581dffc24e052e2c7c2176d3773c4 100755 (executable)
@@ -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);