Commit 782a89bc authored by mkanat%kerio.com's avatar mkanat%kerio.com

Bug 311047: populating enum tables fails without localconfig, when upgrading

Patch By Max Kanat-Alexander <mkanat@bugzilla.org> and Nick Barnes <nb+bz@ravenbrook.com> r=mkanat, r=LpSolit, a=justdave
parent f4401b3f
...@@ -336,6 +336,13 @@ sub bz_setup_database { ...@@ -336,6 +336,13 @@ sub bz_setup_database {
} }
} }
# The defauly implementation just returns what you passed-in. This function
# really exists just to be overridden in Bugzilla::DB::Mysql.
sub bz_enum_initial_values {
my ($self, $enum_defaults) = @_;
return $enum_defaults;
}
##################################################################### #####################################################################
# Schema Modification Methods # Schema Modification Methods
##################################################################### #####################################################################
...@@ -1283,6 +1290,26 @@ These methods return information about data in the database. ...@@ -1283,6 +1290,26 @@ These methods return information about data in the database.
=back =back
=head2 Database Setup Methods
These methods are used by the Bugzilla installation programs to set up
the database.
=over 4
=item C<bz_enum_initial_values(\%enum_defaults)>
Description: For an upgrade or an initial installation, provides
what the values should be for the "enum"-type fields,
such as version, op_sys, rep_platform, etc.
Params: \%enum_defaults - The default initial list of values for
each enum field. A hash, with the field
names pointing to an arrayref of values.
Returns: A hashref with the correct initial values for the enum fields.
=back
=head2 Schema Modification Methods =head2 Schema Modification Methods
These methods modify the current Bugzilla Schema. These methods modify the current Bugzilla Schema.
......
...@@ -540,6 +540,38 @@ sub bz_setup_database { ...@@ -540,6 +540,38 @@ sub bz_setup_database {
} }
sub bz_enum_initial_values {
my ($self, $enum_defaults) = @_;
my %enum_values = %$enum_defaults;
# Get a complete description of the 'bugs' table; with DBD::MySQL
# there isn't a column-by-column way of doing this. Could use
# $dbh->column_info, but it would go slower and we would have to
# use the undocumented mysql_type_name accessor to get the type
# of each row.
my $sth = $self->prepare("DESCRIBE bugs");
$sth->execute();
# Look for the particular columns we are interested in.
while (my ($thiscol, $thistype) = $sth->fetchrow_array()) {
if (defined $enum_values{$thiscol}) {
# this is a column of interest.
my @value_list;
if ($thistype and ($thistype =~ /^enum\(/)) {
# it has an enum type; get the set of values.
while ($thistype =~ /'([^']*)'(.*)/) {
push(@value_list, $1);
$thistype = $2;
}
}
if (@value_list) {
# record the enum values found.
$enum_values{$thiscol} = \@value_list;
}
}
}
return \%enum_values;
}
##################################################################### #####################################################################
# MySQL-specific Database-Reading Methods # MySQL-specific Database-Reading Methods
##################################################################### #####################################################################
......
...@@ -773,22 +773,6 @@ my $my_db_name = ${*{$main::{'db_name'}}{SCALAR}}; ...@@ -773,22 +773,6 @@ my $my_db_name = ${*{$main::{'db_name'}}{SCALAR}};
my $my_index_html = ${*{$main::{'index_html'}}{SCALAR}}; my $my_index_html = ${*{$main::{'index_html'}}{SCALAR}};
my $my_create_htaccess = ${*{$main::{'create_htaccess'}}{SCALAR}}; my $my_create_htaccess = ${*{$main::{'create_htaccess'}}{SCALAR}};
my $my_webservergroup = ${*{$main::{'webservergroup'}}{SCALAR}}; my $my_webservergroup = ${*{$main::{'webservergroup'}}{SCALAR}};
# mkanat@bugzilla.org - bug 17453
# The following values have been removed from localconfig.
# However, if we are upgrading from a Bugzilla with enums to a
# Bugzilla without enums, we use these values one more time so
# that we correctly populate the tables.
my @my_severities;
@my_severities = @{*{$main::{'severities'}}{ARRAY}}
if exists($main::{'severities'});
my @my_priorities;
@my_priorities = @{*{$main::{'priorities'}}{ARRAY}}
if exists($main::{'priorities'});
my @my_platforms;
@my_platforms = @{*{$main::{'platforms'}}{ARRAY}}
if exists($main::{'platforms'});
my @my_opsys;
@my_opsys = @{*{$main::{'opsys'}}{ARRAY}} if exists($main::{'opsys'});
if ($my_webservergroup && !$silent) { if ($my_webservergroup && !$silent) {
if ($^O !~ /MSWin32/i) { if ($^O !~ /MSWin32/i) {
...@@ -1809,9 +1793,12 @@ AddFDef($new_field_name, $field_description, 0); ...@@ -1809,9 +1793,12 @@ AddFDef($new_field_name, $field_description, 0);
# Detect changed local settings # Detect changed local settings
########################################################################### ###########################################################################
# mkanat@bugzilla.org - bug 17453 # Nick Barnes nb+bz@ravenbrook.com 2005-10-05
# Create the values for the tables that hold what used to be enum types. #
# Don't populate the tables if the table isn't empty. # 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 { sub PopulateEnumTable {
my ($table, @valuelist) = @_; my ($table, @valuelist) = @_;
...@@ -1840,37 +1827,36 @@ sub PopulateEnumTable { ...@@ -1840,37 +1827,36 @@ sub PopulateEnumTable {
} }
} }
# mkanat@bugzilla.org - bug 17453 # Set default values for what used to be the enum types. These values
# Set default values for what used to be the enum types. # are no longer stored in localconfig. If we are upgrading from a
# These values are no longer stored in localconfig. # Bugzilla with enums to a Bugzilla without enums, we use the
# However, if we are upgrading from a Bugzilla with enums to a # enum values.
# Bugzilla without enums, we use the localconfig values one more time. #
# The values that you see here are ONLY DEFAULTS. They are only used # The values that you see here are ONLY DEFAULTS. They are only used
# the FIRST time you run checksetup. After that, they are either # the FIRST time you run checksetup, IF you are NOT upgrading from a
# controlled through the Bugzilla UI or through the DB. # Bugzilla with enums. After that, they are either controlled through
@my_severities = ('blocker','critical','major','normal','minor', # the Bugzilla UI or through the DB.
'trivial','enhancement') if !@my_severities;
@my_priorities = ("P1","P2","P3","P4","P5") if !@my_priorities; my $enum_defaults = {
@my_opsys = ("All","Windows","Mac OS","Linux","Other") if !@my_opsys; bug_severity => ['blocker', 'critical', 'major', 'normal',
@my_platforms = ("All","PC","Macintosh","Other") if !@my_platforms; 'minor', 'trivial', 'enhancement'],
priority => ["P1","P2","P3","P4","P5"],
PopulateEnumTable('bug_severity', @my_severities); op_sys => ["All","Windows","Mac OS","Linux","Other"],
PopulateEnumTable('priority', @my_priorities); rep_platform => ["All","PC","Macintosh","Other"],
PopulateEnumTable('op_sys', @my_opsys); bug_status => ["UNCONFIRMED","NEW","ASSIGNED","REOPENED","RESOLVED",
PopulateEnumTable('rep_platform', @my_platforms); "VERIFIED","CLOSED"],
resolution => ["","FIXED","INVALID","WONTFIX","LATER","REMIND",
# The resolution and bug_status lists are absolute. On an upgrade from "DUPLICATE","WORKSFORME","MOVED"],
# a Bugzilla with enums, whatever is in the enum will be replaced with };
# this. This is because Bugzilla depends on the exact names of these
# resolutions in order to function properly. # Get all the enum column values for the existing database, or the
my @states = ("UNCONFIRMED","NEW","ASSIGNED","REOPENED","RESOLVED", # defaults if the columns are not enums.
"VERIFIED","CLOSED"); my $enum_values = $dbh->bz_enum_initial_values($enum_defaults);
my @resolutions = ("","FIXED","INVALID","WONTFIX","LATER","REMIND",
"DUPLICATE","WORKSFORME","MOVED"); # Populate the enum tables.
PopulateEnumTable('bug_status', @states); while (my ($table, $values) = each %$enum_values) {
PopulateEnumTable('resolution', @resolutions); PopulateEnumTable($table, @$values);
}
########################################################################### ###########################################################################
# Create initial test product if there are no products present. # Create initial test product if there are no products present.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment