summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@gmail.com>2012-10-19 15:01:43 +0200
committerSimon Brandhof <simon.brandhof@gmail.com>2012-10-19 15:01:43 +0200
commitb2775c92005761a61dc161a26b26afefbdf1886d (patch)
tree4e4b5e86e2cbebe397fc7bf52001758ec47bfd67
parentb006b8883e0e5f3c852e610158d5ed9b39e9d196 (diff)
downloadsonarqube-b2775c92005761a61dc161a26b26afefbdf1886d.tar.gz
sonarqube-b2775c92005761a61dc161a26b26afefbdf1886d.zip
SONAR-3889 Some rows in the table AUTHORS are duplicated
-rw-r--r--sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java2
-rw-r--r--sonar-core/src/main/java/org/sonar/core/user/AuthorDao.java11
-rw-r--r--sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql1
-rw-r--r--sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl4
-rw-r--r--sonar-server/src/main/webapp/WEB-INF/db/migrate/351_add_unique_index_to_authors.rb53
5 files changed, 68 insertions, 3 deletions
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