]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3889 Some rows in the table AUTHORS are duplicated
authorSimon Brandhof <simon.brandhof@gmail.com>
Fri, 19 Oct 2012 13:01:43 +0000 (15:01 +0200)
committerSimon Brandhof <simon.brandhof@gmail.com>
Fri, 19 Oct 2012 13:01:43 +0000 (15:01 +0200)
sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java
sonar-core/src/main/java/org/sonar/core/user/AuthorDao.java
sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql
sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl
sonar-server/src/main/webapp/WEB-INF/db/migrate/351_add_unique_index_to_authors.rb [new file with mode: 0644]

index 4ab9a14c89ead9357954be022eeaf6e458ab2cff..91c13431ca18795e2efccf16daae177e2d8366f1 100644 (file)
@@ -35,7 +35,7 @@ import java.util.List;
  */
 public class DatabaseVersion implements BatchComponent, ServerComponent {
 
-  public static final int LAST_VERSION = 350;
+  public static final int LAST_VERSION = 351;
 
   public static enum Status {
     UP_TO_DATE, REQUIRES_UPGRADE, REQUIRES_DOWNGRADE, FRESH_INSTALL
index ebdfd593a6482d28c84053d0e6a6987e5ee30298..104d8b90905e726458062111eff08459ac17ddb3 100644 (file)
@@ -57,10 +57,19 @@ public class AuthorDao implements BatchComponent, ServerComponent {
 
   public void insert(AuthorDto authorDto) {
     SqlSession session = mybatis.openSession();
+    AuthorMapper mapper = session.getMapper(AuthorMapper.class);
     try {
-      AuthorMapper mapper = session.getMapper(AuthorMapper.class);
       mapper.insert(authorDto);
       session.commit();
+    } catch (RuntimeException e) {
+      // break the unique index on LOGIN ?
+      AuthorDto persistedAuthor = mapper.selectByLogin(authorDto.getLogin());
+      if (persistedAuthor != null) {
+        authorDto.setId(persistedAuthor.getId());
+      } else {
+        throw e;
+      }
+
     } finally {
       MyBatis.closeQuietly(session);
     }
index 355032ca39cc51edcf5458d3ae01f47debba7ff9..207f9270e834a99da52924617519266b425608e2 100644 (file)
@@ -178,6 +178,7 @@ INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('333');
 INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('334');
 INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('335');
 INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('350');
+INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('351');
 
 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;
index 59b0d51ff628927c0f0864e7f0ae6d11b055398b..91b2f75a0eb578ac1465b870c988fff1c95588e8 100644 (file)
@@ -613,4 +613,6 @@ CREATE INDEX "INDEX_RULE_NOTES_ON_ACTIVE_RULE_ID" ON "RULE_NOTES" ("RULE_ID");
 
 CREATE INDEX "REVIEWS_RID" ON "REVIEWS" ("RESOURCE_ID");
 
-CREATE UNIQUE INDEX "SEMAPHORES_UNIQUE_NAME" ON "SEMAPHORES" ("NAME");
+CREATE UNIQUE INDEX "uniq_semaphore_names" ON "SEMAPHORES" ("NAME");
+
+CREATE UNIQUE INDEX "uniq_author_logins" ON "AUTHORS" ("LOGIN");
diff --git a/sonar-server/src/main/webapp/WEB-INF/db/migrate/351_add_unique_index_to_authors.rb b/sonar-server/src/main/webapp/WEB-INF/db/migrate/351_add_unique_index_to_authors.rb
new file mode 100644 (file)
index 0000000..a9c7c1e
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# Sonar, open source software quality management tool.
+# Copyright (C) 2008-2012 SonarSource
+# mailto:contact AT sonarsource DOT com
+#
+# Sonar 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.
+#
+# Sonar 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 Sonar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
+#
+
+#
+# Sonar 3.4
+#
+class AddUniqueIndexToAuthors < ActiveRecord::Migration
+
+  class Author < ActiveRecord::Base
+  end
+
+  def self.up
+    delete_duplicated_authors
+    begin
+      add_index :authors, :login, :unique => true, :name => 'uniq_author_logins'
+    rescue
+      # Ignore, already exists
+    end
+  end
+
+  private
+  def self.delete_duplicated_authors
+    say_with_time 'Delete duplicated authors' do
+      authors_by_login={}
+      authors=Author.find(:all, :select => 'id,login', :order => 'id')
+      authors.each do |author|
+        if authors_by_login[author.login]
+          # already exists
+          author.destroy
+        else
+          authors_by_login[author.login]=author
+        end
+      end
+    end
+  end
+end