summaryrefslogtreecommitdiff
path: root/FS/bin/freeside-upgrade
blob: 419384c2a5ec51fdfa08ebcc626ae79029feab54 (plain)
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
#!/usr/bin/perl -w

use strict;
use vars qw($DEBUG $DRY_RUN);
use Term::ReadKey;
use DBIx::DBSchema 0.27;
use FS::UID qw(adminsuidsetup checkeuid datasrc );  #getsecrets);
use FS::Schema qw( dbdef dbdef_dist reload_dbdef );


$DEBUG = 1;
$DRY_RUN = 0;


die "Not running uid freeside!" unless checkeuid();

my $user = shift or die &usage;
my $dbh = adminsuidsetup($user);

#needs to match FS::Schema...
my $dbdef_file = "/usr/local/etc/freeside/dbdef.". datasrc;

dbdef_create($dbh, $dbdef_file);

delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
reload_dbdef($dbdef_file);


foreach my $table ( dbdef_dist->tables ) {

  if ( dbdef->table($table) ) {

    warn "$table exists\n" if $DEBUG > 1;

    foreach my $column ( dbdef_dist->table($table)->columns ) {
      if ( dbdef->table($table)->column($column) )  {
        warn "  $table.$column exists\n" if $DEBUG > 2;
      } else {

        if ( $DEBUG ) {
          print STDERR "column $table.$column does not exist.  create?";
          next unless yesno();
        }

        foreach my $statement (
          dbdef_dist->table($table)->column($column)->sql_add_column( $dbh )
        ) {
          warn "$statement\n" if $DEBUG || $DRY_RUN;
          unless ( $DRY_RUN ) {
            $dbh->do( $statement)
              or die "CREATE error: ". $dbh->errstr. "\nexecuting: $statement";
          }
        }

      }

    }

    #should eventually check & create missing indices

    #should eventually drop columns not in dbdef_dist...

  } else {

    if ( $DEBUG ) {
      print STDERR "table $table does not exist.  create?";
      next unless yesno();
    }

    foreach my $statement (
      dbdef_dist->table($table)->sql_create_table( $dbh )
    ) {
      warn "$statement\n" if $DEBUG || $DRY_RUN;
      unless ( $DRY_RUN ) {
        $dbh->do( $statement)
          or die "CREATE error: ". $dbh->errstr. "\nexecuting: $statement";
      }
    }

  }

}

# should eventually drop tables not in dbdef_dist too i guess...

$dbh->commit or die $dbh->errstr;

dbdef_create($dbh, $dbdef_file);

$dbh->disconnect or die $dbh->errstr;

###

my $all = 0;
sub yesno {
  print STDERR ' [yes/no/all] ';
  if ( $all ) {
    warn "yes\n";
    return 1;
  } else {
    while ( 1 ) {
      ReadMode 4;
      my $x = lc(ReadKey);
      ReadMode 0;
      if ( $x eq 'n' ) {
        warn "no\n"; 
        return 0;
      } elsif ( $x eq 'y' ) {
        warn "yes\n"; 
        return 1;
      } elsif ( $x eq 'a' ) {
        warn "yes\n"; 
        $all = 1;
        return 1;
      }
    }
  }
}

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 user\n"; 
}

1;