#!/usr/bin/perl -w use strict; use FS::UID qw(adminsuidsetup dbh); use FS::Schema; use FS::Record qw(qsearch qsearchs); my $DRY_RUN = 1; $FS::UID::AutoCommit = 0; my ($user, $from_usernum, $to_usernum, $go) = @ARGV; die usage() if not ($user and $from_usernum and $to_usernum); $DRY_RUN = 0 if defined($go) and $go eq 'go'; my $dbh = adminsuidsetup($user); # Sanity checks. die "Can't merge a user to itself." if $from_usernum == $to_usernum; my $from_user = FS::access_user->by_key($from_usernum) or die "Usernum '$from_usernum' not found.\n"; my $to_user = FS::access_user->by_key($to_usernum) or die "Usernum '$to_usernum' not found.\n"; my $tables = FS::Schema::tables_hashref; foreach my $table (keys %$tables) { if( grep /^usernum$/, FS::Record::real_fields($table) ) { next if $table eq 'access_user'; foreach ($table, "h_$table") { print "$_: "; my $sql; if( $table =~ /^access_(.*)$/ ) { print "deleting "; $sql = "DELETE FROM $_ WHERE usernum = $from_usernum"; } else { print "updating "; $sql = "UPDATE $_ SET usernum = $to_usernum WHERE usernum = $from_usernum"; } #print $sql; my $sth = $dbh->prepare($sql); $sth->execute; if($dbh->err) { print $dbh->errstr."\n"; $dbh->rollback; exit(1); } print $sth->rows, "\n"; } } } if($DRY_RUN) { warn "Dry run complete. Reverting all changes.\n"; $dbh->rollback; } else { # Warning: access_user->delete does not transactionize because of # htpasswd issues. print "Deleting merged user.\n"; my $error = $from_user->delete; die $error if $error; warn "Committing changes.\n"; $dbh->commit; } exit(0); sub usage { "Usage:\n merge-user admin_user from_usernum to_usernum [ 'go' ]\n (Specify 'go' to actually apply changes.)\n\n"; }