agent_custid bugfix (1746)
[freeside.git] / FS / bin / freeside-upgrade
1 #!/usr/bin/perl -w
2
3 use strict;
4 use vars qw($opt_d $opt_q $opt_v);
5 use vars qw($DEBUG $DRY_RUN);
6 use Getopt::Std;
7 use DBIx::DBSchema 0.31;
8 use FS::UID qw(adminsuidsetup checkeuid datasrc );  #getsecrets);
9 use FS::CurrentUser;
10 use FS::Schema qw( dbdef dbdef_dist reload_dbdef );
11 use FS::Misc::prune qw(prune_applications);
12 use FS::Conf;
13 use FS::Record qw(qsearch);
14
15 die "Not running uid freeside!" unless checkeuid();
16
17 getopts("dq");
18
19 $DEBUG = !$opt_q;
20 #$DEBUG = $opt_v;
21
22 $DRY_RUN = $opt_d;
23
24 my $user = shift or die &usage;
25 $FS::CurrentUser::upgrade_hack = 1;
26 $FS::UID::callback_hack = 1;
27 my $dbh = adminsuidsetup($user);
28 $FS::UID::callback_hack = 0;
29
30 #needs to match FS::Schema...
31 my $dbdef_file = "%%%FREESIDE_CONF%%%/dbdef.". datasrc;
32
33 dbdef_create($dbh, $dbdef_file);
34
35 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
36 reload_dbdef($dbdef_file);
37
38 $DBIx::DBSchema::DEBUG = $DEBUG;
39 $DBIx::DBSchema::Table::DEBUG = $DEBUG;
40 $DBIx::DBSchema::Index::DEBUG = $DEBUG;
41
42 my @bugfix = ();
43
44 if (dbdef->table('cust_main')->column('agent_custid')) { 
45   push @bugfix,
46     "UPDATE cust_main SET agent_custid = NULL where agent_custid = ''";
47
48   push @bugfix,
49     "UPDATE h_cust_main SET agent_custid = NULL where agent_custid = ''"
50       if (dbdef->table('h_cust_main')); 
51 }
52
53 if ( $DRY_RUN ) {
54   print
55     join(";\n", @bugfix, dbdef->sql_update_schema( dbdef_dist, $dbh ) ). ";\n";
56   exit;
57 } else {
58   foreach my $statement ( @bugfix ) {
59     $dbh->do( $statement )
60       or die "Error: ". $dbh->errstr. "\n executing: $statement";
61   }
62
63   dbdef->update_schema( dbdef_dist, $dbh );
64 }
65
66 my $hashref = {};
67 $hashref->{dry_run} = 1 if $DRY_RUN;
68 $hashref->{debug} = 1 if $DEBUG;
69 print join "\n", prune_applications($hashref);
70 print "\n" if $DRY_RUN;
71
72
73 $dbh->commit or die $dbh->errstr;
74
75 dbdef_create($dbh, $dbdef_file);
76
77 $dbh->disconnect or die $dbh->errstr;
78
79 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
80 $FS::UID::AutoCommit = 1;
81 $FS::UID::callback_hack = 1;
82 $dbh = adminsuidsetup($user);
83 $FS::UID::callback_hack = 0;
84 unless ( $DRY_RUN ) {
85   my $dir = "%%%FREESIDE_CONF%%%/conf.". datasrc;
86   if (!scalar(qsearch('conf', {}))) {
87     my $error = FS::Conf::init_config($dir);
88     if ($error) {
89       warn "CONFIGURATION UPGRADE FAILED\n";
90       $dbh->rollback or die $dbh->errstr;
91       die $error;
92     }
93   }
94 }
95 $dbh->commit or die $dbh->errstr;
96 $dbh->disconnect or die $dbh->errstr;
97
98 ###
99
100 sub dbdef_create { # reverse engineer the schema from the DB and save to file
101   my( $dbh, $file ) = @_;
102   my $dbdef = new_native DBIx::DBSchema $dbh;
103   $dbdef->save($file);
104 }
105
106 sub usage {
107   die "Usage:\n  freeside-upgrade [ -d ] [ -q | -v ] user\n"; 
108 }
109
110 =head1 NAME
111
112 freeside-upgrade - Upgrades database schema for new freeside verisons.
113
114 =head1 SYNOPSIS
115
116   freeside-upgrade [ -d ] [ -q | -v ]
117
118 =head1 DESCRIPTION
119
120 Reads your existing database schema and updates it to match the current schema,
121 adding any columns or tables necessary.
122
123 Also performs other upgrade functions:
124
125 =over 4
126
127 =item Calls FS:: Misc::prune::prune_applications (probably unnecessary every upgrade, but simply won't find any records to change)
128
129 =item If necessary, moves your configuration information from the filesystem in /usr/local/etc/freeside/conf.<datasrc> to the database.
130
131 =back
132
133   [ -d ]: Dry run; output SQL statements (to STDOUT) only, but do not execute
134           them.
135
136   [ -q ]: Run quietly.  This may become the default at some point.
137
138   [ -v ]: Run verbosely, sending debugging information to STDERR.  This is the
139           current default.
140
141 =head1 SEE ALSO
142
143 =cut
144