infrastructure for easier schema changes, and: add payment_gateway, payment_gateway_o...
[freeside.git] / FS / bin / freeside-upgrade
1 #!/usr/bin/perl -w
2
3 use strict;
4 use vars qw($DEBUG $DRY_RUN);
5 use Term::ReadKey;
6 use DBIx::DBSchema 0.27;
7 use FS::UID qw(adminsuidsetup checkeuid datasrc );  #getsecrets);
8 use FS::Schema qw( dbdef dbdef_dist reload_dbdef );
9
10
11 $DEBUG = 1;
12 $DRY_RUN = 0;
13
14
15 die "Not running uid freeside!" unless checkeuid();
16
17 my $user = shift or die &usage;
18 my $dbh = adminsuidsetup($user);
19
20 #needs to match FS::Schema...
21 my $dbdef_file = "/usr/local/etc/freeside/dbdef.". datasrc;
22
23 dbdef_create($dbh, $dbdef_file);
24 reload_dbdef($dbdef_file);
25
26
27 foreach my $table ( dbdef_dist->tables ) {
28
29   if ( dbdef->table($table) ) {
30
31     warn "$table exists\n" if $DEBUG > 1;
32
33     foreach my $column ( dbdef_dist->table($table)->columns ) {
34       if ( dbdef->table($table)->column($column) )  {
35         warn "  $table.$column exists\n" if $DEBUG > 2;
36       } else {
37
38         if ( $DEBUG ) {
39           print STDERR "column $table.$column does not exist.  create?";
40           next unless yesno();
41         }
42
43         foreach my $statement (
44           dbdef_dist->table($table)->column($column)->sql_add_column( $dbh )
45         ) {
46           warn "$statement\n" if $DEBUG || $DRY_RUN;
47           unless ( $DRY_RUN ) {
48             $dbh->do( $statement)
49               or die "CREATE error: ". $dbh->errstr. "\nexecuting: $statement";
50           }
51         }
52
53       }
54
55     }
56
57     #should eventually check & create missing indices
58
59     #should eventually drop columns not in dbdef_dist...
60
61   } else {
62
63     if ( $DEBUG ) {
64       print STDERR "table $table does not exist.  create?";
65       next unless yesno();
66     }
67
68     foreach my $statement (
69       dbdef_dist->table($table)->sql_create_table( $dbh )
70     ) {
71       warn "$statement\n" if $DEBUG || $DRY_RUN;
72       unless ( $DRY_RUN ) {
73         $dbh->do( $statement)
74           or die "CREATE error: ". $dbh->errstr. "\nexecuting: $statement";
75       }
76     }
77
78   }
79
80 }
81
82 # should eventually drop tables not in dbdef_dist too i guess...
83
84 $dbh->commit or die $dbh->errstr;
85
86 dbdef_create($dbh, $dbdef_file);
87
88 $dbh->disconnect or die $dbh->errstr;
89
90 ###
91
92 my $all = 0;
93 sub yesno {
94   print STDERR ' [yes/no/all] ';
95   if ( $all ) {
96     warn "yes\n";
97     return 1;
98   } else {
99     while ( 1 ) {
100       ReadMode 4;
101       my $x = lc(ReadKey);
102       ReadMode 0;
103       if ( $x eq 'n' ) {
104         warn "no\n"; 
105         return 0;
106       } elsif ( $x eq 'y' ) {
107         warn "yes\n"; 
108         return 1;
109       } elsif ( $x eq 'a' ) {
110         warn "yes\n"; 
111         $all = 1;
112         return 1;
113       }
114     }
115   }
116 }
117
118 sub dbdef_create { # reverse engineer the schema from the DB and save to file
119   my( $dbh, $file ) = @_;
120   my $dbdef = new_native DBIx::DBSchema $dbh;
121   $dbdef->save($file);
122 }
123
124 sub usage {
125   die "Usage:\n  freeside-upgrade user\n"; 
126 }
127
128 1;
129