]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5067 Duplicate entries can exist in active_rules table whereas it should not
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 21 Feb 2014 10:51:02 +0000 (11:51 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 21 Feb 2014 10:51:11 +0000 (11:51 +0100)
sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java
sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql
sonar-server/src/main/webapp/WEB-INF/db/migrate/498_remove_duplicate_active_rules.rb [new file with mode: 0644]

index 25a6abf2ff3adb9f8cb239199b40be5a65111485..5eed5bf784298e8aa6f27bb7253aeb8e138175db 100644 (file)
@@ -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
index 8a82cd13684d9c9bfb5ee30afe4179cf359f79a3..ae1e4976b74f3f1b452c46d07fc014f74354cd3d 100644 (file)
@@ -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 (file)
index 0000000..a86b479
--- /dev/null
@@ -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