upgrade optimizations for space-constrained installs, RT10071
[freeside.git] / bin / merge-user
1 #!/usr/bin/perl -w
2
3 use strict;
4 use FS::UID qw(adminsuidsetup dbh);
5 use FS::Schema;
6 use FS::Record qw(qsearch qsearchs);
7
8 my $DRY_RUN = 1;
9 $FS::UID::AutoCommit = 0;
10
11 my ($user, $from_usernum, $to_usernum, $go) = @ARGV;
12 die usage() if not ($user and $from_usernum and $to_usernum);
13 $DRY_RUN = 0 if defined($go) and $go eq 'go';
14
15 my $dbh = adminsuidsetup($user);
16
17 # Sanity checks.
18 die "Can't merge a user to itself." if $from_usernum == $to_usernum;
19 my $from_user = FS::access_user->by_key($from_usernum) or 
20     die "Usernum '$from_usernum' not found.\n";
21 my $to_user = FS::access_user->by_key($to_usernum) or 
22     die "Usernum '$to_usernum' not found.\n";
23
24 my $tables = FS::Schema::tables_hashref;
25 foreach my $table (keys %$tables) {
26   if( grep /^usernum$/, FS::Record::real_fields($table) ) {
27     next if $table eq 'access_user';
28     foreach ($table, "h_$table") {
29       print "$_: ";
30       my $sql;
31       if( $table =~ /^access_(.*)$/ ) {
32         print "deleting ";
33         $sql = "DELETE FROM $_ WHERE usernum = $from_usernum";
34       }
35       else {
36         print "updating ";
37         $sql = "UPDATE $_ SET usernum = $to_usernum WHERE usernum = $from_usernum";
38       }
39       #print $sql;
40       my $sth = $dbh->prepare($sql);
41       $sth->execute;
42       if($dbh->err) {
43         print $dbh->errstr."\n";
44         $dbh->rollback;
45         exit(1);
46       }
47       print $sth->rows, "\n";
48     }
49   }
50 }
51
52 if($DRY_RUN) {
53   warn "Dry run complete.  Reverting all changes.\n";
54   $dbh->rollback;
55 }
56 else {
57 # Warning: access_user->delete does not transactionize because of 
58 # htpasswd issues.
59   print "Deleting merged user.\n";
60   my $error = $from_user->delete;
61   die $error if $error;
62
63   warn "Committing changes.\n";
64   $dbh->commit;
65 }
66 exit(0);
67
68 sub usage {
69   "Usage:\n    merge-user admin_user from_usernum to_usernum [ 'go' ]\n
70   (Specify 'go' to actually apply changes.)\n\n";
71 }