From: Simon Brandhof Date: Fri, 19 Oct 2012 13:01:43 +0000 (+0200) Subject: SONAR-3889 Some rows in the table AUTHORS are duplicated X-Git-Tag: 3.4~464 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b2775c92005761a61dc161a26b26afefbdf1886d;p=sonarqube.git SONAR-3889 Some rows in the table AUTHORS are duplicated --- 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 4ab9a14c89e..91c13431ca1 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 @@ -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 diff --git a/sonar-core/src/main/java/org/sonar/core/user/AuthorDao.java b/sonar-core/src/main/java/org/sonar/core/user/AuthorDao.java index ebdfd593a64..104d8b90905 100644 --- a/sonar-core/src/main/java/org/sonar/core/user/AuthorDao.java +++ b/sonar-core/src/main/java/org/sonar/core/user/AuthorDao.java @@ -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); } 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 355032ca39c..207f9270e83 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 @@ -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; diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl b/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl index 59b0d51ff62..91b2f75a0eb 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl @@ -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 index 00000000000..a9c7c1ed756 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/db/migrate/351_add_unique_index_to_authors.rb @@ -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