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);
}
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;
--- /dev/null
+#
+# 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