some notes about old part_svc columns, since DBIx::DBSchema 0.33+ will now drop them...
[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 #you should have run fs-migrate-part_svc ages ago, when you upgraded
54 #from 1.3 to 1.4... if not, it needs to be hooked into -upgrade here or
55 #you'll lose all the part_svc settings it migrates to part_svc_column
56
57 if ( $DRY_RUN ) {
58   print
59     join(";\n", @bugfix, dbdef->sql_update_schema( dbdef_dist, $dbh ) ). ";\n";
60   exit;
61 } else {
62   foreach my $statement ( @bugfix ) {
63     $dbh->do( $statement )
64       or die "Error: ". $dbh->errstr. "\n executing: $statement";
65   }
66
67   dbdef->update_schema( dbdef_dist, $dbh );
68 }
69
70 my $hashref = {};
71 $hashref->{dry_run} = 1 if $DRY_RUN;
72 $hashref->{debug} = 1 if $DEBUG;
73 print join "\n", prune_applications($hashref);
74 print "\n" if $DRY_RUN;
75
76
77 $dbh->commit or die $dbh->errstr;
78
79 dbdef_create($dbh, $dbdef_file);
80
81 $dbh->disconnect or die $dbh->errstr;
82
83 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
84 $FS::UID::AutoCommit = 1;
85 $FS::UID::callback_hack = 1;
86 $dbh = adminsuidsetup($user);
87 $FS::UID::callback_hack = 0;
88 unless ( $DRY_RUN ) {
89   my $dir = "%%%FREESIDE_CONF%%%/conf.". datasrc;
90   if (!scalar(qsearch('conf', {}))) {
91     my $error = FS::Conf::init_config($dir);
92     if ($error) {
93       warn "CONFIGURATION UPGRADE FAILED\n";
94       $dbh->rollback or die $dbh->errstr;
95       die $error;
96     }
97   }
98 }
99 $dbh->commit or die $dbh->errstr;
100 $dbh->disconnect or die $dbh->errstr;
101
102 ###
103
104 sub dbdef_create { # reverse engineer the schema from the DB and save to file
105   my( $dbh, $file ) = @_;
106   my $dbdef = new_native DBIx::DBSchema $dbh;
107   $dbdef->save($file);
108 }
109
110 sub usage {
111   die "Usage:\n  freeside-upgrade [ -d ] [ -q | -v ] user\n"; 
112 }
113
114 =head1 NAME
115
116 freeside-upgrade - Upgrades database schema for new freeside verisons.
117
118 =head1 SYNOPSIS
119
120   freeside-upgrade [ -d ] [ -q | -v ]
121
122 =head1 DESCRIPTION
123
124 Reads your existing database schema and updates it to match the current schema,
125 adding any columns or tables necessary.
126
127 Also performs other upgrade functions:
128
129 =over 4
130
131 =item Calls FS:: Misc::prune::prune_applications (probably unnecessary every upgrade, but simply won't find any records to change)
132
133 =item If necessary, moves your configuration information from the filesystem in /usr/local/etc/freeside/conf.<datasrc> to the database.
134
135 =back
136
137   [ -d ]: Dry run; output SQL statements (to STDOUT) only, but do not execute
138           them.
139
140   [ -q ]: Run quietly.  This may become the default at some point.
141
142   [ -v ]: Run verbosely, sending debugging information to STDERR.  This is the
143           current default.
144
145 =head1 SEE ALSO
146
147 =cut
148