don't print out the cust_credit_refund pruning every time
[freeside.git] / FS / bin / freeside-upgrade
1 #!/usr/bin/perl -w
2
3 use strict;
4 use vars qw($opt_d $opt_s $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 use FS::Upgrade qw(upgrade upgrade_sqlradius);
15
16 die "Not running uid freeside!" unless checkeuid();
17
18 getopts("dqs");
19
20 $DEBUG = !$opt_q;
21 #$DEBUG = $opt_v;
22
23 $DRY_RUN = $opt_d;
24
25 my $user = shift or die &usage;
26 $FS::CurrentUser::upgrade_hack = 1;
27 $FS::UID::callback_hack = 1;
28 my $dbh = adminsuidsetup($user);
29 $FS::UID::callback_hack = 0;
30
31 #needs to match FS::Schema...
32 my $dbdef_file = "%%%FREESIDE_CONF%%%/dbdef.". datasrc;
33
34 dbdef_create($dbh, $dbdef_file);
35
36 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
37 reload_dbdef($dbdef_file);
38
39 $DBIx::DBSchema::DEBUG = $DEBUG;
40 $DBIx::DBSchema::Table::DEBUG = $DEBUG;
41 $DBIx::DBSchema::Index::DEBUG = $DEBUG;
42
43 my @bugfix = ();
44
45 if (dbdef->table('cust_main')->column('agent_custid') && ! $opt_s) { 
46   push @bugfix,
47     "UPDATE cust_main SET agent_custid = NULL where agent_custid = ''";
48
49   push @bugfix,
50     "UPDATE h_cust_main SET agent_custid = NULL where agent_custid = ''"
51       if (dbdef->table('h_cust_main')); 
52 }
53
54 #you should have run fs-migrate-part_svc ages ago, when you upgraded
55 #from 1.3 to 1.4... if not, it needs to be hooked into -upgrade here or
56 #you'll lose all the part_svc settings it migrates to part_svc_column
57
58 if ( $DRY_RUN ) {
59   print
60     join(";\n", @bugfix, dbdef->sql_update_schema( dbdef_dist(datasrc), $dbh ) ). ";\n";
61   exit;
62 } else {
63   foreach my $statement ( @bugfix ) {
64     $dbh->do( $statement )
65       or die "Error: ". $dbh->errstr. "\n executing: $statement";
66   }
67
68   dbdef->update_schema( dbdef_dist(datasrc), $dbh );
69 }
70
71 my $hashref = {};
72 $hashref->{dry_run} = 1 if $DRY_RUN;
73 $hashref->{debug} = 1 if $DEBUG && $DRY_RUN;
74 prune_applications($hashref) unless $opt_s;
75
76 print "\n" if $DRY_RUN;
77
78 if ( $dbh->{Driver}->{Name} =~ /^mysql/i && ! $opt_s ) {
79
80   my $sth = $dbh->prepare(
81     "SELECT COUNT(*) FROM duplicate_lock WHERE lockname = 'svc_acct'"
82   ) or die $dbh->errstr;
83
84   $sth->execute or die $sth->errstr;
85
86   unless ( $sth->fetchrow_arrayref->[0] ) {
87
88     $sth = $dbh->prepare(
89       "INSERT INTO duplicate_lock ( lockname ) VALUES ( 'svc_acct' )"
90     ) or die $dbh->errstr;
91
92     $sth->execute or die $sth->errstr;
93
94   }
95 }
96
97 $dbh->commit or die $dbh->errstr;
98
99 dbdef_create($dbh, $dbdef_file);
100
101 $dbh->disconnect or die $dbh->errstr;
102
103 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
104 $FS::UID::AutoCommit = 0;
105 $FS::UID::callback_hack = 1;
106 $dbh = adminsuidsetup($user);
107 $FS::UID::callback_hack = 0;
108 unless ( $DRY_RUN ) {
109   my $dir = "%%%FREESIDE_CONF%%%/conf.". datasrc;
110   if (!scalar(qsearch('conf', {}))) {
111     my $error = FS::Conf::init_config($dir);
112     if ($error) {
113       warn "CONFIGURATION UPGRADE FAILED\n";
114       $dbh->rollback or die $dbh->errstr;
115       die $error;
116     }
117   }
118 }
119 $dbh->commit or die $dbh->errstr;
120 $dbh->disconnect or die $dbh->errstr;
121
122 $dbh = adminsuidsetup($user);
123
124 upgrade()
125   unless $DRY_RUN || $opt_s;
126
127 upgrade_sqlradius()
128   unless $DRY_RUN || $opt_s;
129
130 $dbh->commit or die $dbh->errstr;
131 $dbh->disconnect or die $dbh->errstr;
132
133 ###
134
135 sub dbdef_create { # reverse engineer the schema from the DB and save to file
136   my( $dbh, $file ) = @_;
137   my $dbdef = new_native DBIx::DBSchema $dbh;
138   $dbdef->save($file);
139 }
140
141 sub usage {
142   die "Usage:\n  freeside-upgrade [ -d ] [ -s ] [ -q | -v ] user\n"; 
143 }
144
145 =head1 NAME
146
147 freeside-upgrade - Upgrades database schema for new freeside verisons.
148
149 =head1 SYNOPSIS
150
151   freeside-upgrade [ -d ] [ -s ] [ -q | -v ]
152
153 =head1 DESCRIPTION
154
155 Reads your existing database schema and updates it to match the current schema,
156 adding any columns or tables necessary.
157
158 Also performs other upgrade functions:
159
160 =over 4
161
162 =item Calls FS:: Misc::prune::prune_applications (probably unnecessary every upgrade, but simply won't find any records to change)
163
164 =item If necessary, moves your configuration information from the filesystem in /usr/local/etc/freeside/conf.<datasrc> to the database.
165
166 =back
167
168   [ -d ]: Dry run; output SQL statements (to STDOUT) only, but do not execute
169           them.
170
171   [ -q ]: Run quietly.  This may become the default at some point.
172
173   [ -v ]: Run verbosely, sending debugging information to STDERR.  This is the
174           current default.
175
176   [ -s ]: Schema changes only.  Useful for Pg/slony slaves where the data
177           changes will be replicated from the Pg/slony master.
178
179 =head1 SEE ALSO
180
181 =cut
182