X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2Fbin%2Ffreeside-upgrade;h=5bd1415389648a8b0a107946f527241c7d748ac5;hp=16c30d9cf4345a3e2134f1afc12ac3f56f0403cb;hb=63973c641c4be00765fa27e55c57cc5b9aa4da19;hpb=45191e95387a76195ec735dddd27be8ed7d2b8c7 diff --git a/FS/bin/freeside-upgrade b/FS/bin/freeside-upgrade index 16c30d9cf..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); @@ -84,21 +84,6 @@ if ( dbdef->table('areacode') and } } -# RT required field flag -# for consistency with RT schema: mysql is in CamelCase, -# pg is in lowercase, and they use different data types. -my ($t, $creq, $cdis) = - map { driver_name =~ /^mysql/i ? $_ : lc($_) } - ('CustomFields','Required','Disabled'); - -if ( dbdef->table($t) && - ! dbdef->table($t)->column($creq) ) { - push @bugfix, - "ALTER TABLE $t ADD COLUMN $creq ". - dbdef->table($t)->column($cdis)->type . - ' NOT NULL DEFAULT 0'; -} - if ( $DRY_RUN ) { print join(";\n", @bugfix ). ";\n"; @@ -127,18 +112,29 @@ my @statements = dbdef->sql_update_schema( dbdef_dist(datasrc), { 'nullify_default' => 1, }, ); -#### NEW CUSTOM FIELDS (prevent columns from being dropped by upgrade) +#### 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; -# likely a very inefficient implementation of this while ( $cf = $cfsth->fetchrow_hashref ) { my $tbl = $cf->{'dbtable'}; my $name = $cf->{'name'}; - @statements = grep { $_ !~ /^\s*ALTER\s+TABLE\s+$tbl\s+DROP\s+COLUMN\s+cf_$name\s*$/i } + $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 @@ -240,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;