summaryrefslogtreecommitdiffstats
path: root/Bugzilla
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla')
-rw-r--r--Bugzilla/DB.pm27
-rw-r--r--Bugzilla/DB/Mysql.pm32
2 files changed, 59 insertions, 0 deletions
diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm
index 1da845942..a36ca909d 100644
--- a/Bugzilla/DB.pm
+++ b/Bugzilla/DB.pm
@@ -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
#####################################################################
@@ -1283,6 +1290,26 @@ These methods return information about data in the database.
=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
These methods modify the current Bugzilla Schema.
diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm
index e2e0e840f..e03fbc910 100644
--- a/Bugzilla/DB/Mysql.pm
+++ b/Bugzilla/DB/Mysql.pm
@@ -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
#####################################################################