X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2Fbin%2Ffreeside-upgrade;h=5bd1415389648a8b0a107946f527241c7d748ac5;hp=d3723a1887d26d54d5821302a074117940f4048c;hb=63973c641c4be00765fa27e55c57cc5b9aa4da19;hpb=3fbf293ee485c7b9245d1fadeb69c9b06ec075ed diff --git a/FS/bin/freeside-upgrade b/FS/bin/freeside-upgrade index d3723a188..5bd141538 100755 --- a/FS/bin/freeside-upgrade +++ b/FS/bin/freeside-upgrade @@ -5,7 +5,7 @@ use vars qw($opt_d $opt_s $opt_q $opt_v $opt_r); use vars qw($DEBUG $DRY_RUN); use Getopt::Std; use DBIx::DBSchema 0.31; #0.39 -use FS::UID qw(adminsuidsetup checkeuid datasrc driver_name); #getsecrets); +use FS::UID qw(adminsuidsetup checkeuid datasrc driver_name); use FS::CurrentUser; use FS::Schema qw( dbdef dbdef_dist reload_dbdef ); use FS::Misc::prune qw(prune_applications); @@ -71,6 +71,19 @@ if ( dbdef->table('cgp_rule_condition') && } +if ( dbdef->table('areacode') and + dbdef->table('areacode')->primary_key eq 'code' ) +{ + if ( driver_name =~ /^mysql/i ) { + push @bugfix, + 'ALTER TABLE areacode DROP PRIMARY KEY', + 'ALTER TABLE areacode ADD COLUMN (areanum int auto_increment primary key)'; + } + else { + push @bugfix, 'ALTER TABLE areacode DROP CONSTRAINT areacode_pkey'; + } +} + if ( $DRY_RUN ) { print join(";\n", @bugfix ). ";\n"; @@ -99,6 +112,30 @@ my @statements = dbdef->sql_update_schema( dbdef_dist(datasrc), { 'nullify_default' => 1, }, ); +#### NEW CUSTOM FIELDS: +# 1. prevent new custom field columns from being dropped by upgrade +# 2. migrate old virtual fields to real fields (new custom fields) +#### +my $cfsth = $dbh->prepare("SELECT * FROM part_virtual_field") + or die $dbh->errstr; +$cfsth->execute or die $cfsth->errstr; +my $cf; +while ( $cf = $cfsth->fetchrow_hashref ) { + my $tbl = $cf->{'dbtable'}; + my $name = $cf->{'name'}; + $name = lc($name) unless driver_name =~ /^mysql/i; + + @statements = grep { $_ !~ /^\s*ALTER\s+TABLE\s+(h_|)$tbl\s+DROP\s+COLUMN\s+cf_$name\s*$/i } + @statements; + push @statements, + "ALTER TABLE $tbl ADD COLUMN cf_$name varchar(".$cf->{'length'}.")" + unless (dbdef->table($tbl) && dbdef->table($tbl)->column("cf_$name")); + push @statements, + "ALTER TABLE h_$tbl ADD COLUMN cf_$name varchar(".$cf->{'length'}.")" + unless (dbdef->table("h_$tbl") && dbdef->table("h_$tbl")->column("cf_$name")); +} +warn "Custom fields schema upgrade completed"; + @statements = grep { $_ !~ /^CREATE +INDEX +h_queue/i } #useless, holds up queue insertion @statements; @@ -199,6 +236,30 @@ $dbh = adminsuidsetup($user); warn "Re-initialization with updated schema completed in ". (time-$start). " seconds\n"; # if $DEBUG; $start = time; +#### NEW CUSTOM FIELDS: +# 3. migrate old virtual field data to the new custom fields +#### +$cfsth = $dbh->prepare("SELECT * FROM virtual_field left join part_virtual_field using (vfieldpart)") + or die $dbh->errstr; +$cfsth->execute or die $cfsth->errstr; +my @cfst; +while ( $cf = $cfsth->fetchrow_hashref ) { + my $tbl = $cf->{'dbtable'}; + my $name = $cf->{'name'}; + my $dtable = dbdef->table($tbl); + next unless $dtable && $dtable->primary_key; # XXX: warn first? + my $pkey = $dtable->primary_key; + next unless $dtable->column($pkey)->type =~ /int/i; # XXX: warn first? + push @cfst, "UPDATE $tbl set cf_$name = '".$cf->{'value'}."' WHERE $pkey = ".$cf->{'recnum'}; + push @cfst, "DELETE FROM virtual_field WHERE vfieldnum = ".$cf->{'vfieldnum'}; +} +foreach my $cfst ( @cfst ) { + warn "$cfst\n"; + $dbh->do( $cfst ) + or die "Error: ". $dbh->errstr. "\n executing: $cfst"; +} +warn "Custom fields data upgrade completed"; + upgrade_config() unless $DRY_RUN || $opt_s;