]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 373869: Custom field names must be all lowercase or buglist.cgi sorting throws...
authorjustdave%bugzilla.org <>
Sun, 15 Apr 2007 06:34:57 +0000 (06:34 +0000)
committerjustdave%bugzilla.org <>
Sun, 15 Apr 2007 06:34:57 +0000 (06:34 +0000)
Patch by mkanat and justdave
r=LpSolit,mkanat; a=mkanat

Bugzilla/DB.pm
Bugzilla/DB/Schema.pm
Bugzilla/DB/Schema/Pg.pm
Bugzilla/Field.pm
Bugzilla/Install/DB.pm
template/en/default/global/code-error.html.tmpl
template/en/default/global/messages.html.tmpl

index 9f517a8e750dd56e08ad7c33aaf562feabe9f8d9..c903594ff8b8887596348536f0b81b2bad6a42a7 100644 (file)
@@ -702,7 +702,7 @@ sub bz_rename_column {
 
     if ($old_col_exists) {
         my $already_renamed = $self->bz_column_info($table, $new_name);
-            ThrowCodeError('column_rename_conflict',
+            ThrowCodeError('db_rename_conflict',
                            { old => "$table.$old_name", 
                              new => "$table.$new_name" }) if $already_renamed;
         my @statements = $self->_bz_real_schema->get_rename_column_ddl(
@@ -720,6 +720,23 @@ sub bz_rename_column {
     }
 }
 
+sub bz_rename_table {
+    my ($self, $old_name, $new_name) = @_;
+    my $old_table = $self->bz_table_info($old_name);
+    return if !$old_table;
+
+    my $new = $self->bz_table_info($new_name);
+    ThrowCodeError('db_rename_conflict', { old => $old_name,
+                                           new => $new_name }) if $new;
+    my @sql = $self->_bz_real_schema->get_rename_table_sql($old_name, $new_name);
+    print get_text('install_table_rename', 
+                   { old => $old_name, new => $new_name }) . "\n"
+        if Bugzilla->usage_mode == USAGE_MODE_CMDLINE;
+    $self->do($_) foreach @sql;
+    $self->_bz_real_schema->rename_table($old_name, $new_name);
+    $self->_bz_store_real_schema;
+}
+
 #####################################################################
 # Schema Information Methods
 #####################################################################
@@ -2055,6 +2072,31 @@ that you want to rename
 
 =back
 
+=item C<bz_rename_table>
+
+=over
+
+=item B<Description>
+
+Renames a table in the database. Does nothing if the table doesn't exist.
+
+Throws an error if the old table exists and there is already a table 
+with the new name.
+
+=item B<Params>
+
+=over
+
+=item C<$old_name> - The current name of the table.
+
+=item C<$new_name> - What you're renaming the table to.
+
+=back
+
+=item B<Returns> (nothing)
+
+=back
+
 =back
 
 =head2 Schema Information Methods
index 66167731902d1a9d84448f6795ffae8c6f18a9e2..69ac18f56d89d76b22eebe8a573f092d18d1a1f6 100644 (file)
@@ -1721,6 +1721,37 @@ sub get_rename_column_ddl {
         . " has not implemented a method.";
 }
 
+
+sub get_rename_table_sql {
+
+=item C<get_rename_table_sql>
+
+=over
+
+=item B<Description>
+
+Gets SQL to rename a table in the database.
+
+=item B<Params>
+
+=over
+
+=item C<$old_name> - The current name of the table.
+
+=item C<$new_name> - The new name of the table.
+
+=back
+
+=item B<Returns>: An array of SQL statements to rename a table.
+
+=back
+
+=cut
+
+    my ($self, $old_name, $new_name) = @_;
+    return ("ALTER TABLE $old_name RENAME TO $new_name");
+}
+
 =item C<delete_table($name)>
 
  Description: Deletes a table from this Schema object.
@@ -1872,6 +1903,23 @@ sub add_table {
     }
 }
 
+
+
+sub rename_table {
+
+=item C<rename_table>
+
+Renames a table from C<$old_name> to C<$new_name> in this Schema object.
+
+=cut
+
+
+    my ($self, $old_name, $new_name) = @_;
+    my $table = $self->get_table_abstract($old_name);
+    $self->delete_table($old_name);
+    $self->add_table($new_name, $table);
+}
+
 sub delete_column {
 
 =item C<delete_column($table, $column)>
index 0101a1e4374c7d82a8183c57aba312bbce723330..7a951e2dbf30f524cb85fc020d2acfc8337e87e2 100644 (file)
@@ -92,6 +92,11 @@ sub _initialize {
 
 sub get_rename_column_ddl {
     my ($self, $table, $old_name, $new_name) = @_;
+    if (lc($old_name) eq lc($new_name)) {
+        # if the only change is a case change, return an empty list, since Pg
+        # is case-insensitive and will return an error about a duplicate name
+        return ();
+    }
     my @sql = ("ALTER TABLE $table RENAME COLUMN $old_name TO $new_name");
     my $def = $self->get_column_abstract($table, $old_name);
     if ($def->{TYPE} =~ /SERIAL/i) {
@@ -104,6 +109,16 @@ sub get_rename_column_ddl {
     return @sql;
 }
 
+sub get_rename_table_sql {
+    my ($self, $old_name, $new_name) = @_;
+    if (lc($old_name) eq lc($new_name)) {
+        # if the only change is a case change, return an empty list, since Pg
+        # is case-insensitive and will return an error about a duplicate name
+        return ();
+    }
+    return ("ALTER TABLE $old_name RENAME TO $new_name");
+}
+
 sub _get_alter_type_sql {
     my ($self, $table, $column, $new_def, $old_def) = @_;
     my @statements;
index dd885cd55b9d2a9c8baddec42c7ce122ff20f6ad..9177ae4238855d99f90e10d42085c557feed6ddb 100644 (file)
@@ -208,7 +208,7 @@ sub _check_mailhead { return $_[1] ? 1 : 0; }
 
 sub _check_name {
     my ($invocant, $name, $is_custom) = @_;
-    $name = clean_text($name);
+    $name = lc(clean_text($name));
     $name || ThrowUserError('field_missing_name');
 
     # Don't want to allow a name that might mess up SQL.
index 00032d15b399dc94ddfcc66cc0e137016b40d85c..20a6e1f673248c7423332967968c1f12362acb41 100644 (file)
@@ -519,6 +519,8 @@ sub update_table_definitions {
     $dbh->bz_add_column('milestones', 'id',
         {TYPE => 'MEDIUMSERIAL', NOTNULL => 1, PRIMARYKEY => 1});
 
+    _fix_uppercase_custom_field_names();
+
     ################################################################
     # New --TABLE-- changes should go *** A B O V E *** this point #
     ################################################################
@@ -2742,6 +2744,25 @@ sub _update_longdescs_who_index {
     }
 }
 
+sub _fix_uppercase_custom_field_names {
+    # Before the final release of 3.0, custom fields could be
+    # created with mixed-case names.
+    my $dbh = Bugzilla->dbh;
+    my $fields = $dbh->selectall_arrayref(
+        'SELECT name, type FROM fielddefs WHERE custom = 1');
+    foreach my $row (@$fields) {
+        my ($name, $type) = @$row;
+        if ($name ne lc($name)) {
+            $dbh->bz_rename_column('bugs', $name, lc($name));
+            $dbh->bz_rename_table($name, lc($name))
+                if $type == FIELD_TYPE_SINGLE_SELECT;
+            $dbh->do('UPDATE fielddefs SET name = ? WHERE name = ?',
+                     undef, lc($name), $name);
+        }
+    }
+    
+}
+
 1;
 
 __END__
index 2de8bd6a26c152dcdc2286a4af4ea8897a2267ec..a4a9df9b9a252407453d6d8b0f96393028fb1296 100644 (file)
     without specifying a default or something for $set_nulls_to, because
     there are NULL values currently in it.
 
-  [% ELSIF error == "column_rename_conflict" %]
+  [% ELSIF error == "db_rename_conflict" %]
     Name conflict: Cannot rename [% old FILTER html %] to
     [% new FILTER html %] because [% new FILTER html %] already exists.
 
index 5027585f688431b478e16fba7b5f37f61e18d8f9..ad56a35564cba42709d5f9a7ec8e21a7e2275d6b 100644 (file)
   [% ELSIF message_tag == "install_table_drop" %]
     Dropping the '[% name FILTER html %]' table...
 
+  [% ELSIF message_tag == "install_table_rename" %]
+    Renaming the '[% old FILTER html %]' table to '[% new FILTER html %]'...
+
   [% ELSIF message_tag == "install_urlbase_default" %]
     Now that you have installed [% terms.Bugzilla %], you should visit the
     'Parameters' page (linked in the footer of the Administrator