Bug 342060: checksetup fails if no database exists

Patch By Frederic Buclin <LpSolit@gmail.com> r=mkanat, a=myk
This commit is contained in:
mkanat%bugzilla.org 2006-06-20 06:43:53 +00:00
Родитель 35641d545f
Коммит 6726c370af
1 изменённых файлов: 164 добавлений и 158 удалений

Просмотреть файл

@ -83,9 +83,9 @@
# #
# add/delete local configuration variables --LOCAL-- # add/delete local configuration variables --LOCAL--
# check for more required modules --MODULES-- # check for more required modules --MODULES--
# change the defaults for local configuration vars --LOCAL--
# update the assigned file permissions --CHMOD--
# add more database-related checks --DATABASE-- # add more database-related checks --DATABASE--
# change the defaults for local configuration vars --DATA--
# update the assigned file permissions --CHMOD--
# change table definitions --TABLE-- # change table definitions --TABLE--
# add more groups --GROUPS-- # add more groups --GROUPS--
# add user-adjustable settings --SETTINGS-- # add user-adjustable settings --SETTINGS--
@ -506,7 +506,10 @@ if ($^O =~ /MSWin/i) {
# we've already checked all of the pre-requisites above in the previous # we've already checked all of the pre-requisites above in the previous
# BEGIN block. # BEGIN block.
BEGIN { BEGIN {
# We need $::ENV{'PATH'} to remain defined.
my $env = $::ENV{'PATH'};
require Bugzilla; require Bugzilla;
$::ENV{'PATH'} = $env;
require Bugzilla::Config; require Bugzilla::Config;
import Bugzilla::Config qw(:DEFAULT :admin :locations); import Bugzilla::Config qw(:DEFAULT :admin :locations);
@ -881,6 +884,164 @@ EOF
} }
} }
###########################################################################
# Check Database setup
###########################################################################
#
# Check if we have access to the --DATABASE--
#
# At this point, localconfig is defined and is readable. So we know
# everything we need to create the DB. We have to create it early,
# because some data required to populate data/params are stored in the DB.
if ($my_db_check) {
# Only certain values are allowed for $db_driver.
if (!exists DB_MODULE->{lc($my_db_driver)}) {
die "$my_db_driver is not a valid choice for \$db_driver in",
" localconfig";
}
# Check the existence and version of the DBD that we need.
my $actual_dbd = DB_MODULE->{lc($my_db_driver)}->{dbd};
my $actual_dbd_ver = DB_MODULE->{lc($my_db_driver)}->{dbd_version};
my $sql_server = DB_MODULE->{lc($my_db_driver)}->{name};
my $sql_want = DB_MODULE->{lc($my_db_driver)}->{db_version};
unless (have_vers($actual_dbd, $actual_dbd_ver)) {
print "For $sql_server, Bugzilla requires that perl's"
. " $actual_dbd be installed.\nTo install this module,"
. " you can do:\n " . install_command($actual_dbd) . "\n";
exit;
}
# And now check the version of the database server itself.
my $dbh = Bugzilla::DB::connect_main("no database connection");
printf("Checking for %15s %-9s ", $sql_server, "(v$sql_want)") unless $silent;
my $sql_vers = $dbh->bz_server_version;
# Check what version of the database server is installed and let
# the user know if the version is too old to be used with Bugzilla.
if ( vers_cmp($sql_vers,$sql_want) > -1 ) {
print "ok: found v$sql_vers\n" unless $silent;
} else {
die "\nYour $sql_server v$sql_vers is too old.\n" .
" Bugzilla requires version $sql_want or later of $sql_server.\n" .
" Please download and install a newer version.\n";
}
# See if we can connect to the database.
my $conn_success = eval {
my $check_dbh = Bugzilla::DB::connect_main();
$check_dbh->disconnect;
};
if (!$conn_success) {
print "Creating database $my_db_name ...\n";
# Try to create the DB, and if we fail print an error.
if (!eval { $dbh->do("CREATE DATABASE $my_db_name") }) {
my $error = $dbh->errstr;
die <<"EOF"
The '$my_db_name' database could not be created. The error returned was:
$error
This might have several reasons:
* $sql_server is not running.
* $sql_server is running, but there is a problem either in the
server configuration or the database access rights. Read the Bugzilla
Guide in the doc directory. The section about database configuration
should help.
* There is a subtle problem with Perl, DBI, or $sql_server. Make
sure all settings in '$localconfig' are correct. If all else fails, set
'\$db_check' to zero.\n
EOF
}
}
$dbh->disconnect if $dbh;
}
# now get a handle to the database:
my $dbh = Bugzilla::DB::connect_main();
END { $dbh->disconnect if $dbh }
###########################################################################
# Create tables
###########################################################################
# Note: table definitions are now in Bugzilla::DB::Schema.
$dbh->bz_setup_database();
###########################################################################
# Detect changed local settings
###########################################################################
# Nick Barnes nb+bz@ravenbrook.com 2005-10-05
#
# PopulateEnumTable($table, @values): if the table $table has no
# entries, fill it with the entries in the list @values, in the same
# order as that list.
sub PopulateEnumTable {
my ($table, @valuelist) = @_;
# If we encounter any of the keys in this hash, they are
# automatically set to isactive=0
my %defaultinactive = ('---' => 1);
# Check if there are any table entries
my $query = "SELECT COUNT(id) FROM $table";
my $sth = $dbh->prepare($query);
$sth->execute();
# If the table is empty...
if ( !$sth->fetchrow_array() ) {
my $insert = $dbh->prepare("INSERT INTO $table"
. " (value,sortkey,isactive) VALUES (?,?,?)");
my $sortorder = 0;
foreach my $value (@valuelist) {
$sortorder = $sortorder + 100;
# Not active if the value exists in $defaultinactive
my $isactive = exists($defaultinactive{$value}) ? 0 : 1;
print "Inserting value '$value' in table $table"
. " with sortkey $sortorder...\n";
$insert->execute($value, $sortorder, $isactive);
}
}
}
# Set default values for what used to be the enum types. These values
# are no longer stored in localconfig. If we are upgrading from a
# Bugzilla with enums to a Bugzilla without enums, we use the
# enum values.
#
# The values that you see here are ONLY DEFAULTS. They are only used
# the FIRST time you run checksetup, IF you are NOT upgrading from a
# Bugzilla with enums. After that, they are either controlled through
# the Bugzilla UI or through the DB.
my $enum_defaults = {
bug_severity => ['blocker', 'critical', 'major', 'normal',
'minor', 'trivial', 'enhancement'],
priority => ["P1","P2","P3","P4","P5"],
op_sys => ["All","Windows","Mac OS","Linux","Other"],
rep_platform => ["All","PC","Macintosh","Other"],
bug_status => ["UNCONFIRMED","NEW","ASSIGNED","REOPENED","RESOLVED",
"VERIFIED","CLOSED"],
resolution => ["","FIXED","INVALID","WONTFIX","LATER","REMIND",
"DUPLICATE","WORKSFORME","MOVED"],
};
# Get all the enum column values for the existing database, or the
# defaults if the columns are not enums.
my $enum_values = $dbh->bz_enum_initial_values($enum_defaults);
# Populate the enum tables.
while (my ($table, $values) = each %$enum_values) {
PopulateEnumTable($table, @$values);
}
########################################################################### ###########################################################################
# Check data directory # Check data directory
########################################################################### ###########################################################################
@ -1506,85 +1667,6 @@ import Bugzilla::Bug qw(is_open_state);
# their existence and create them if they don't exist. # their existence and create them if they don't exist.
require "globals.pl"; require "globals.pl";
###########################################################################
# Check Database setup
###########################################################################
#
# Check if we have access to the --DATABASE--
#
if ($my_db_check) {
# Only certain values are allowed for $db_driver.
if (!exists DB_MODULE->{lc($my_db_driver)}) {
die "$my_db_driver is not a valid choice for \$db_driver in",
" localconfig";
}
# Check the existence and version of the DBD that we need.
my $actual_dbd = DB_MODULE->{lc($my_db_driver)}->{dbd};
my $actual_dbd_ver = DB_MODULE->{lc($my_db_driver)}->{dbd_version};
my $sql_server = DB_MODULE->{lc($my_db_driver)}->{name};
my $sql_want = DB_MODULE->{lc($my_db_driver)}->{db_version};
unless (have_vers($actual_dbd, $actual_dbd_ver)) {
print "For $sql_server, Bugzilla requires that perl's"
. " $actual_dbd be installed.\nTo install this module,"
. " you can do:\n " . install_command($actual_dbd) . "\n";
exit;
}
# And now check the version of the database server itself.
my $dbh = Bugzilla::DB::connect_main("no database connection");
printf("Checking for %15s %-9s ", $sql_server, "(v$sql_want)") unless $silent;
my $sql_vers = $dbh->bz_server_version;
# Check what version of the database server is installed and let
# the user know if the version is too old to be used with Bugzilla.
if ( vers_cmp($sql_vers,$sql_want) > -1 ) {
print "ok: found v$sql_vers\n" unless $silent;
} else {
die "\nYour $sql_server v$sql_vers is too old.\n" .
" Bugzilla requires version $sql_want or later of $sql_server.\n" .
" Please download and install a newer version.\n";
}
# See if we can connect to the database.
my $conn_success = eval {
my $check_dbh = Bugzilla::DB::connect_main();
$check_dbh->disconnect;
};
if (!$conn_success) {
print "Creating database $my_db_name ...\n";
# Try to create the DB, and if we fail print an error.
if (!eval { $dbh->do("CREATE DATABASE $my_db_name") }) {
my $error = $dbh->errstr;
die <<"EOF"
The '$my_db_name' database could not be created. The error returned was:
$error
This might have several reasons:
* $sql_server is not running.
* $sql_server is running, but there is a problem either in the
server configuration or the database access rights. Read the Bugzilla
Guide in the doc directory. The section about database configuration
should help.
* There is a subtle problem with Perl, DBI, or $sql_server. Make
sure all settings in '$localconfig' are correct. If all else fails, set
'\$db_check' to zero.\n
EOF
}
}
$dbh->disconnect if $dbh;
}
# now get a handle to the database:
my $dbh = Bugzilla::DB::connect_main();
END { $dbh->disconnect if $dbh }
########################################################################### ###########################################################################
# Check for LDAP # Check for LDAP
########################################################################### ###########################################################################
@ -1628,13 +1710,6 @@ if( Param('webdotbase') && Param('webdotbase') !~ /^https?:/ ) {
print "\n" unless $silent; print "\n" unless $silent;
###########################################################################
# Create tables
###########################################################################
# Note: --TABLE-- definitions are now in Bugzilla::DB::Schema.
$dbh->bz_setup_database();
########################################################################### ###########################################################################
# Populate groups table # Populate groups table
########################################################################### ###########################################################################
@ -1826,75 +1901,6 @@ if ($old_field_id && ($old_field_name ne $new_field_name)) {
} }
AddFDef($new_field_name, $field_description, 0); AddFDef($new_field_name, $field_description, 0);
###########################################################################
# Detect changed local settings
###########################################################################
# Nick Barnes nb+bz@ravenbrook.com 2005-10-05
#
# PopulateEnumTable($table, @values): if the table $table has no
# entries, fill it with the entries in the list @values, in the same
# order as that list.
sub PopulateEnumTable {
my ($table, @valuelist) = @_;
# If we encounter any of the keys in this hash, they are
# automatically set to isactive=0
my %defaultinactive = ('---' => 1);
# Check if there are any table entries
my $query = "SELECT COUNT(id) FROM $table";
my $sth = $dbh->prepare($query);
$sth->execute();
# If the table is empty...
if ( !$sth->fetchrow_array() ) {
my $insert = $dbh->prepare("INSERT INTO $table"
. " (value,sortkey,isactive) VALUES (?,?,?)");
my $sortorder = 0;
foreach my $value (@valuelist) {
$sortorder = $sortorder + 100;
# Not active if the value exists in $defaultinactive
my $isactive = exists($defaultinactive{$value}) ? 0 : 1;
print "Inserting value '$value' in table $table"
. " with sortkey $sortorder...\n";
$insert->execute($value, $sortorder, $isactive);
}
}
}
# Set default values for what used to be the enum types. These values
# are no longer stored in localconfig. If we are upgrading from a
# Bugzilla with enums to a Bugzilla without enums, we use the
# enum values.
#
# The values that you see here are ONLY DEFAULTS. They are only used
# the FIRST time you run checksetup, IF you are NOT upgrading from a
# Bugzilla with enums. After that, they are either controlled through
# the Bugzilla UI or through the DB.
my $enum_defaults = {
bug_severity => ['blocker', 'critical', 'major', 'normal',
'minor', 'trivial', 'enhancement'],
priority => ["P1","P2","P3","P4","P5"],
op_sys => ["All","Windows","Mac OS","Linux","Other"],
rep_platform => ["All","PC","Macintosh","Other"],
bug_status => ["UNCONFIRMED","NEW","ASSIGNED","REOPENED","RESOLVED",
"VERIFIED","CLOSED"],
resolution => ["","FIXED","INVALID","WONTFIX","LATER","REMIND",
"DUPLICATE","WORKSFORME","MOVED"],
};
# Get all the enum column values for the existing database, or the
# defaults if the columns are not enums.
my $enum_values = $dbh->bz_enum_initial_values($enum_defaults);
# Populate the enum tables.
while (my ($table, $values) = each %$enum_values) {
PopulateEnumTable($table, @$values);
}
########################################################################### ###########################################################################
# Create initial test product if there are no products present. # Create initial test product if there are no products present.
########################################################################### ###########################################################################
@ -1943,7 +1949,7 @@ if (!$class_count) {
} }
########################################################################### ###########################################################################
# Update the tables to the current definition # Update the tables to the current definition --TABLE--
########################################################################### ###########################################################################
# Both legacy code and modern code need this variable. # Both legacy code and modern code need this variable.