This commit was generated by cvs2svn to compensate for changes in r2526,
[freeside.git] / rt / tools / initdb
1 #!/usr/bin/perl -w
2 # $Header: /home/cvs/cvsroot/freeside/rt/tools/Attic/initdb,v 1.1 2002-08-12 06:17:08 ivan Exp $
3
4 use strict;
5 use vars qw($PROMPT $SCHEMA_FILE $SCHEMA_DIR
6             $ACTION $DEBUG $DB_TYPE $DB_HOME 
7             $DB_HOST $DB_PORT $DB_DBA $DB_DATABASE $DB_DBA_PASSWORD);
8
9 use DBI;
10 use DBIx::DataSource qw( create_database drop_database );
11
12
13 $|=1; #unbuffer that output.
14
15 $DEBUG=0;
16 $PROMPT = 1; #by default, should at least *ask* before nuking databases
17 $SCHEMA_DIR ="etc";
18 $SCHEMA_FILE = "$SCHEMA_DIR/schema.pm"; #hmm
19
20 ($DB_TYPE, $DB_HOME, $DB_HOST, $DB_PORT, $DB_DBA, $DB_DATABASE, $ACTION) = @ARGV;
21
22
23 if ($DEBUG) {
24   print_config_params();
25 }
26 my $dsn = "dbi:$DB_TYPE:";
27
28 if (($DB_TYPE eq 'Pg') or ($DB_TYPE eq 'mysql')) {
29    $dsn .= "dbname=$DB_DATABASE";
30    if ($DB_HOST) {
31         $dsn .= ";host=$DB_HOST";
32     }
33    if ($DB_PORT) {
34         $dsn .= ";port=$DB_PORT";
35    }
36 }
37 elsif ($DB_TYPE eq 'Oracle') {
38    $dsn .= "$DB_DATABASE";
39 }
40
41
42 if ($ACTION eq 'create') {
43     unless ($DB_TYPE eq 'Oracle') {
44         print "Now creating a database for RT.\n";
45         prompt_for_dba_password();
46         create_db();
47     }
48 }
49 elsif ($ACTION eq 'drop' ) {
50     unless ($DB_TYPE eq 'Oracle') {
51         print "Now dropping the RT2 database.\n";
52         prompt_for_dba_password();
53         drop_db();
54     }
55 }
56 elsif ($ACTION eq 'insert' ) {
57     print "Now populating database schema.\n";
58     prompt_for_dba_password();
59     insert_schema();
60 }
61 elsif ($ACTION eq 'generate') {
62     prompt_for_dba_password();
63     generate_schema();
64 }
65 else {
66     print STDERR '$ACTION unspecified. Makefile error. It was '.$ACTION ;
67     exit(-1);
68 }
69
70
71 # {{{ sub prompt_for_dba_password
72
73 sub prompt_for_dba_password {
74     print "Enter the $DB_TYPE password for $DB_DBA: ";
75
76     system "stty -echo";
77     $DB_DBA_PASSWORD = scalar(<STDIN>); #keep off commandline
78     system "stty echo";
79     chomp $DB_DBA_PASSWORD;
80
81 }
82 # }}}
83
84 # {{{ sub print_config_params
85 sub print_config_params {
86     print <<END;
87 Database creation parameters:
88
89 DB_TYPE         = $DB_TYPE
90 DB_HOME         = $DB_HOME
91 DB_HOST         = $DB_HOST
92 DB_DBA          = $DB_DBA
93 DB_DBA_PASSWORD = <hidden>
94 DB_DATABASE     = $DB_DATABASE
95 END
96 }
97 # }}}
98
99 # {{{ sub drop_db
100 sub drop_db {
101     
102     if ( $PROMPT ) {
103         print <<END;
104
105 About to drop $DB_TYPE database $DB_DATABASE.
106 WARNING: This will erase all data in $DB_DATABASE.
107 If you have an existing RT 2.x installation, this will destroy all your data.
108 i
109 END
110         exit unless _yesno();
111         
112     }
113     
114
115   print "\nDropping $DB_TYPE database $DB_DATABASE.\n";
116   drop_database( $dsn, $DB_DBA, $DB_DBA_PASSWORD )
117     or warn $DBIx::DataSource::errstr;
118
119
120 }
121 # }}}
122
123 # {{{ sub generate_schema
124 sub generate_schema {
125     my @schema = generate_schema_from_hash();
126     print "Generating schema for $DB_TYPE...";
127     
128     system('mv', "$SCHEMA_DIR/schema.$DB_TYPE", "$SCHEMA_DIR/schema.$DB_TYPE.bak")
129       if (-f "$SCHEMA_DIR/schema.$DB_TYPE");
130     open(SCHEMA, ">$SCHEMA_DIR/schema.$DB_TYPE");
131     foreach my $line (@schema) {
132         print SCHEMA "$line;\n";
133     }
134     close(SCHEMA);
135     print "done.\n";
136 }
137 # }}}
138
139 # {{{ sub insert_schema
140 sub insert_schema {
141     my (@schema);
142     print "\nCreating database schema.\n";
143    
144     my $dbh = DBI->connect( $dsn, $DB_DBA, $DB_DBA_PASSWORD ) or die $DBI::errstr;    
145     
146     if ( -f "$SCHEMA_DIR/schema.$DB_TYPE") {
147         open (SCHEMA, "<$SCHEMA_DIR/schema.$DB_TYPE");
148         my $statement = "";
149         foreach my $line (<SCHEMA>) {
150             $statement .= $line;
151             if ($line =~ /;$/) {
152                 $statement =~ s/;$//g;
153                 push @schema, $statement;
154                 $statement = "";
155             }
156         }       
157     }   
158     
159     else {
160          @schema = generate_schema_from_hash();
161      }
162     
163     foreach my $statement (@schema) {
164         print STDERR $statement if $DEBUG;
165         my $sth = $dbh->prepare($statement) or die $dbh->errstr;
166         unless ($sth->execute) {
167             print STDERR "Problem with statement:\n $statement\n";
168             die $sth->errstr;
169         }
170     }
171     
172     
173     $dbh->disconnect;
174     print "schema sucessfully inserted\n";
175     
176 }
177 # }}}
178
179 # {{{ sub generate_schema_from_hash
180 sub generate_schema_from_hash {
181     my (@schema);
182     
183     require DBIx::DBSchema;    
184     my $schema_href = do "$SCHEMA_FILE" or die $@ || $!;
185     my $schema = DBIx::DBSchema->pretty_read($schema_href);
186     
187     
188     foreach my $statement ( $schema->sql($dsn, $DB_DBA, $DB_DBA_PASSWORD ) ) {
189         print STDERR $statement if $DEBUG;
190         chomp $statement;
191         push @schema, $statement;
192         
193     }
194     return (@schema);
195     
196 }
197 # }}}
198
199 # {{{ sub create_db
200 sub create_db {
201     
202     print "\nCreating $DB_TYPE database $DB_DATABASE.\n";
203     create_database( $dsn, $DB_DBA, $DB_DBA_PASSWORD )
204       or die $DBIx::DataSource::errstr;
205
206 }
207 # }}}
208
209 # {{{ sub _yesno
210 sub _yesno {
211     print "Proceed [y/N]:";
212     my $x = scalar(<STDIN>);
213     $x =~ /^y/i;
214 }
215
216 # }}}