From 3ef62a0570055da710328937e7f65dbb2c027c62 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 12 Aug 2002 06:17:09 +0000 Subject: import rt 2.0.14 --- rt/tools/initdb | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 rt/tools/initdb (limited to 'rt/tools/initdb') diff --git a/rt/tools/initdb b/rt/tools/initdb new file mode 100644 index 000000000..ffb1ae3b0 --- /dev/null +++ b/rt/tools/initdb @@ -0,0 +1,216 @@ +#!/usr/bin/perl -w +# $Header: /home/cvs/cvsroot/freeside/rt/tools/Attic/initdb,v 1.1 2002-08-12 06:17:08 ivan Exp $ + +use strict; +use vars qw($PROMPT $SCHEMA_FILE $SCHEMA_DIR + $ACTION $DEBUG $DB_TYPE $DB_HOME + $DB_HOST $DB_PORT $DB_DBA $DB_DATABASE $DB_DBA_PASSWORD); + +use DBI; +use DBIx::DataSource qw( create_database drop_database ); + + +$|=1; #unbuffer that output. + +$DEBUG=0; +$PROMPT = 1; #by default, should at least *ask* before nuking databases +$SCHEMA_DIR ="etc"; +$SCHEMA_FILE = "$SCHEMA_DIR/schema.pm"; #hmm + +($DB_TYPE, $DB_HOME, $DB_HOST, $DB_PORT, $DB_DBA, $DB_DATABASE, $ACTION) = @ARGV; + + +if ($DEBUG) { + print_config_params(); +} +my $dsn = "dbi:$DB_TYPE:"; + +if (($DB_TYPE eq 'Pg') or ($DB_TYPE eq 'mysql')) { + $dsn .= "dbname=$DB_DATABASE"; + if ($DB_HOST) { + $dsn .= ";host=$DB_HOST"; + } + if ($DB_PORT) { + $dsn .= ";port=$DB_PORT"; + } +} +elsif ($DB_TYPE eq 'Oracle') { + $dsn .= "$DB_DATABASE"; +} + + +if ($ACTION eq 'create') { + unless ($DB_TYPE eq 'Oracle') { + print "Now creating a database for RT.\n"; + prompt_for_dba_password(); + create_db(); + } +} +elsif ($ACTION eq 'drop' ) { + unless ($DB_TYPE eq 'Oracle') { + print "Now dropping the RT2 database.\n"; + prompt_for_dba_password(); + drop_db(); + } +} +elsif ($ACTION eq 'insert' ) { + print "Now populating database schema.\n"; + prompt_for_dba_password(); + insert_schema(); +} +elsif ($ACTION eq 'generate') { + prompt_for_dba_password(); + generate_schema(); +} +else { + print STDERR '$ACTION unspecified. Makefile error. It was '.$ACTION ; + exit(-1); +} + + +# {{{ sub prompt_for_dba_password + +sub prompt_for_dba_password { + print "Enter the $DB_TYPE password for $DB_DBA: "; + + system "stty -echo"; + $DB_DBA_PASSWORD = scalar(); #keep off commandline + system "stty echo"; + chomp $DB_DBA_PASSWORD; + +} +# }}} + +# {{{ sub print_config_params +sub print_config_params { + print < +DB_DATABASE = $DB_DATABASE +END +} +# }}} + +# {{{ sub drop_db +sub drop_db { + + if ( $PROMPT ) { + print <$SCHEMA_DIR/schema.$DB_TYPE"); + foreach my $line (@schema) { + print SCHEMA "$line;\n"; + } + close(SCHEMA); + print "done.\n"; +} +# }}} + +# {{{ sub insert_schema +sub insert_schema { + my (@schema); + print "\nCreating database schema.\n"; + + my $dbh = DBI->connect( $dsn, $DB_DBA, $DB_DBA_PASSWORD ) or die $DBI::errstr; + + if ( -f "$SCHEMA_DIR/schema.$DB_TYPE") { + open (SCHEMA, "<$SCHEMA_DIR/schema.$DB_TYPE"); + my $statement = ""; + foreach my $line () { + $statement .= $line; + if ($line =~ /;$/) { + $statement =~ s/;$//g; + push @schema, $statement; + $statement = ""; + } + } + } + + else { + @schema = generate_schema_from_hash(); + } + + foreach my $statement (@schema) { + print STDERR $statement if $DEBUG; + my $sth = $dbh->prepare($statement) or die $dbh->errstr; + unless ($sth->execute) { + print STDERR "Problem with statement:\n $statement\n"; + die $sth->errstr; + } + } + + + $dbh->disconnect; + print "schema sucessfully inserted\n"; + +} +# }}} + +# {{{ sub generate_schema_from_hash +sub generate_schema_from_hash { + my (@schema); + + require DBIx::DBSchema; + my $schema_href = do "$SCHEMA_FILE" or die $@ || $!; + my $schema = DBIx::DBSchema->pretty_read($schema_href); + + + foreach my $statement ( $schema->sql($dsn, $DB_DBA, $DB_DBA_PASSWORD ) ) { + print STDERR $statement if $DEBUG; + chomp $statement; + push @schema, $statement; + + } + return (@schema); + +} +# }}} + +# {{{ sub create_db +sub create_db { + + print "\nCreating $DB_TYPE database $DB_DATABASE.\n"; + create_database( $dsn, $DB_DBA, $DB_DBA_PASSWORD ) + or die $DBIx::DataSource::errstr; + +} +# }}} + +# {{{ sub _yesno +sub _yesno { + print "Proceed [y/N]:"; + my $x = scalar(); + $x =~ /^y/i; +} + +# }}} -- cgit v1.2.1