even more deliberate reset
[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 use FS::Upgrade qw(upgrade);
15
16 die "Not running uid freeside!" unless checkeuid();
17
18 getopts("dq");
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')) { 
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;
74 print join "\n", prune_applications($hashref);
75 print "\n" if $DRY_RUN;
76
77 if ( $dbh->{Driver}->{Name} =~ /^mysql/i ) {
78
79   my $sth = $dbh->prepare(
80     "SELECT COUNT(*) FROM duplicate_lock WHERE lockname = 'svc_acct'"
81   ) or die $dbh->errstr;
82
83   $sth->execute or die $sth->errstr;
84
85   unless ( $sth->fetchrow_arrayref->[0] ) {
86
87     $sth = $dbh->prepare(
88       "INSERT INTO duplicate_lock ( lockname ) VALUES ( 'svc_acct' )"
89     ) or die $dbh->errstr;
90
91     $sth->execute or die $sth->errstr;
92
93   }
94 }
95
96 $dbh->commit or die $dbh->errstr;  # we *MUST* commit before upgrading data
97 dbdef_create($dbh, $dbdef_file);
98 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
99 $dbh = adminsuidsetup($user);
100
101 upgrade()
102   unless $DRY_RUN;
103
104 $dbh->commit or die $dbh->errstr;
105
106 dbdef_create($dbh, $dbdef_file);
107
108 $dbh->disconnect or die $dbh->errstr;
109
110 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
111 $FS::UID::AutoCommit = 1;
112 $FS::UID::callback_hack = 1;
113 $dbh = adminsuidsetup($user);
114 $FS::UID::callback_hack = 0;
115 unless ( $DRY_RUN ) {
116   my $dir = "%%%FREESIDE_CONF%%%/conf.". datasrc;
117   if (!scalar(qsearch('conf', {}))) {
118     my $error = FS::Conf::init_config($dir);
119     if ($error) {
120       warn "CONFIGURATION UPGRADE FAILED\n";
121       $dbh->rollback or die $dbh->errstr;
122       die $error;
123     }
124   }
125 }
126 $dbh->commit or die $dbh->errstr;
127 $dbh->disconnect or die $dbh->errstr;
128
129 ###
130
131 sub dbdef_create { # reverse engineer the schema from the DB and save to file
132   my( $dbh, $file ) = @_;
133   my $dbdef = new_native DBIx::DBSchema $dbh;
134   $dbdef->save($file);
135 }
136
137 sub usage {
138   die "Usage:\n  freeside-upgrade [ -d ] [ -q | -v ] user\n"; 
139 }
140
141 =head1 NAME
142
143 freeside-upgrade - Upgrades database schema for new freeside verisons.
144
145 =head1 SYNOPSIS
146
147   freeside-upgrade [ -d ] [ -q | -v ]
148
149 =head1 DESCRIPTION
150
151 Reads your existing database schema and updates it to match the current schema,
152 adding any columns or tables necessary.
153
154 Also performs other upgrade functions:
155
156 =over 4
157
158 =item Calls FS:: Misc::prune::prune_applications (probably unnecessary every upgrade, but simply won't find any records to change)
159
160 =item If necessary, moves your configuration information from the filesystem in /usr/local/etc/freeside/conf.<datasrc> to the database.
161
162 =back
163
164   [ -d ]: Dry run; output SQL statements (to STDOUT) only, but do not execute
165           them.
166
167   [ -q ]: Run quietly.  This may become the default at some point.
168
169   [ -v ]: Run verbosely, sending debugging information to STDERR.  This is the
170           current default.
171
172 =head1 SEE ALSO
173
174 =cut
175