From 20dcbb0d34ffb5317cf303ab9eb7caa9ea2f77ee Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Fri, 21 Feb 2014 11:51:02 +0100 Subject: [PATCH] SONAR-5067 Duplicate entries can exist in active_rules table whereas it should not --- .../core/persistence/DatabaseVersion.java | 2 +- .../org/sonar/core/persistence/rows-h2.sql | 1 + .../498_remove_duplicate_active_rules.rb | 66 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 sonar-server/src/main/webapp/WEB-INF/db/migrate/498_remove_duplicate_active_rules.rb diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java index 25a6abf2ff3..5eed5bf7842 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java @@ -33,7 +33,7 @@ import java.util.List; */ public class DatabaseVersion implements BatchComponent, ServerComponent { - public static final int LAST_VERSION = 497; + public static final int LAST_VERSION = 498; public static enum Status { UP_TO_DATE, REQUIRES_UPGRADE, REQUIRES_DOWNGRADE, FRESH_INSTALL diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql index 8a82cd13684..ae1e4976b74 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql @@ -207,6 +207,7 @@ INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('494'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('495'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('496'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('497'); +INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('498'); INSERT INTO USERS(ID, LOGIN, NAME, EMAIL, CRYPTED_PASSWORD, SALT, CREATED_AT, UPDATED_AT, REMEMBER_TOKEN, REMEMBER_TOKEN_EXPIRES_AT) VALUES (1, 'admin', 'Administrator', '', 'a373a0e667abb2604c1fd571eb4ad47fe8cc0878', '48bc4b0d93179b5103fd3885ea9119498e9d161b', '2011-09-26 22:27:48.0', '2011-09-26 22:27:48.0', null, null); ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 2; diff --git a/sonar-server/src/main/webapp/WEB-INF/db/migrate/498_remove_duplicate_active_rules.rb b/sonar-server/src/main/webapp/WEB-INF/db/migrate/498_remove_duplicate_active_rules.rb new file mode 100644 index 00000000000..a86b47982c3 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/db/migrate/498_remove_duplicate_active_rules.rb @@ -0,0 +1,66 @@ +# +# SonarQube, open source software quality management tool. +# Copyright (C) 2008-2013 SonarSource +# mailto:contact AT sonarsource DOT com +# +# SonarQube is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# SonarQube is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# + +# +# Sonar 4.2 +# SONAR-5067 +# +class RemoveDuplicateActiveRules < ActiveRecord::Migration + + class ActiveRuleParameters < ActiveRecord::Base + end + + class ActiveRule < ActiveRecord::Base + end + + def self.up + remove_active_rules_duplication + add_unique_index_on_active_rule + end + + def self.remove_active_rules_duplication + # Search for all rules activated many times on a same profile + rule_actived_many_times_on_same_profile = ActiveRule.all( + :select => 'rule_id,profile_id', + :group => 'rule_id,profile_id', + :having => 'COUNT(*) > 1' + ) + + rule_actived_many_times_on_same_profile.each do |duplicate_active_rule| + # Search for all duplication on current rule and profile + active_rules = ActiveRule.all( + :conditions => {:rule_id => duplicate_active_rule.rule_id, :profile_id => duplicate_active_rule.profile_id} + ) + # Remove duplication, keep only one active rule (first one) + active_rules.drop(1).each do |active_rule| + ActiveRuleParameters.delete_all(:active_rule_id => active_rule.id) + active_rule.delete + end + end + end + + def self.add_unique_index_on_active_rule + begin + add_index :active_rules, [:rule_id, :profile_id], :unique => true, :name => 'active_rules_unique' + rescue + # already exists + end + end +end -- 2.39.5