1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#!/usr/bin/perl -w
use strict;
use vars qw($opt_d $opt_s $opt_q $opt_v);
use vars qw($DEBUG $DRY_RUN);
use Getopt::Std;
use DBIx::DBSchema 0.31;
use FS::UID qw(adminsuidsetup checkeuid datasrc ); #getsecrets);
use FS::CurrentUser;
use FS::Schema qw( dbdef dbdef_dist reload_dbdef );
use FS::Misc::prune qw(prune_applications);
use FS::Upgrade qw( upgrade upgrade_sqlradius );
die "Not running uid freeside!" unless checkeuid();
getopts("dqs");
$DEBUG = !$opt_q;
#$DEBUG = $opt_v;
$DRY_RUN = $opt_d;
my $user = shift or die &usage;
$FS::CurrentUser::upgrade_hack = 1;
my $dbh = adminsuidsetup($user);
#needs to match FS::Schema...
my $dbdef_file = "%%%FREESIDE_CONF%%%/dbdef.". datasrc;
dbdef_create($dbh, $dbdef_file);
delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
reload_dbdef($dbdef_file);
$DBIx::DBSchema::DEBUG = $DEBUG;
$DBIx::DBSchema::Table::DEBUG = $DEBUG;
my @bugfix = ();
if (dbdef->table('cust_main')->column('agent_custid') && ! $opt_s) {
push @bugfix,
"UPDATE cust_main SET agent_custid = NULL where agent_custid = ''";
push @bugfix,
"UPDATE h_cust_main SET agent_custid = NULL where agent_custid = ''"
if (dbdef->table('h_cust_main'));
}
my @statements =
grep { $_ !~ /^CREATE +INDEX +h_queue/ } #useless, holds up queue insertion
dbdef->sql_update_schema( dbdef_dist(datasrc), $dbh );
if ( $DRY_RUN ) {
print
join(";\n", @bugfix, @statements ). ";\n";
exit;
} else {
foreach my $statement ( @bugfix, @statements ) {
$dbh->do( $statement )
or die "Error: ". $dbh->errstr. "\n executing: $statement";
}
# dbdef->update_schema( dbdef_dist(datasrc), $dbh );
}
my $hashref = {};
$hashref->{dry_run} = 1 if $DRY_RUN;
$hashref->{debug} = 1 if $DEBUG && $DRY_RUN;
prune_applications($hashref) unless $opt_s;
print "\n" if $DRY_RUN;
if ( $dbh->{Driver}->{Name} =~ /^mysql/i && ! $opt_s ) {
my $sth = $dbh->prepare(
"SELECT COUNT(*) FROM duplicate_lock WHERE lockname = 'svc_acct'"
) or die $dbh->errstr;
$sth->execute or die $sth->errstr;
unless ( $sth->fetchrow_arrayref->[0] ) {
$sth = $dbh->prepare(
"INSERT INTO duplicate_lock ( lockname ) VALUES ( 'svc_acct' )"
) or die $dbh->errstr;
$sth->execute or die $sth->errstr;
}
}
$dbh->commit or die $dbh->errstr; # we *MUST* commit before upgrading data
dbdef_create($dbh, $dbdef_file);
delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
reload_dbdef($dbdef_file);
upgrade()
unless $DRY_RUN || $opt_s;
$dbh->commit or die $dbh->errstr;
upgrade_sqlradius()
unless $DRY_RUN || $opt_s;
$dbh->commit or die $dbh->errstr;
$dbh->disconnect or die $dbh->errstr;
###
sub dbdef_create { # reverse engineer the schema from the DB and save to file
my( $dbh, $file ) = @_;
my $dbdef = new_native DBIx::DBSchema $dbh;
$dbdef->save($file);
}
sub usage {
die "Usage:\n freeside-upgrade [ -d ] [ -s ] [ -q | -v ] user\n";
}
=head1 NAME
freeside-upgrade - Upgrades database schema for new freeside verisons.
=head1 SYNOPSIS
freeside-upgrade [ -d ] [ -s ] [ -q | -v ]
=head1 DESCRIPTION
Reads your existing database schema and updates it to match the current schema,
adding any columns or tables necessary.
[ -d ]: Dry run; output SQL statements (to STDOUT) only, but do not execute
them.
[ -q ]: Run quietly. This may become the default at some point.
[ -v ]: Run verbosely, sending debugging information to STDERR. This is the
current default.
[ -s ]: Schema changes only. Useful for Pg/slony slaves where the data
changes will be replicated from the Pg/slony master.
=head1 SEE ALSO
=cut
|