package org.sonar.server.platform.db.migration.version;
import org.sonar.core.platform.Module;
+import org.sonar.server.platform.db.migration.version.v561.DbVersion561;
import org.sonar.server.platform.db.migration.version.v60.DbVersion60;
import org.sonar.server.platform.db.migration.version.v61.DbVersion61;
import org.sonar.server.platform.db.migration.version.v62.DbVersion62;
@Override
protected void configureModule() {
add(
+ DbVersion561.class,
DbVersion60.class,
DbVersion61.class,
DbVersion62.class,
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.
+ */
+package org.sonar.server.platform.db.migration.version.v561;
+
+import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
+import org.sonar.server.platform.db.migration.version.DbVersion;
+
+public class DbVersion561 implements DbVersion {
+ @Override
+ public void addSteps(MigrationStepRegistry registry) {
+ registry.add(1153, "Populate columns USERS.EXTERNAL_IDENTITY_*", UpdateUsersExternalIdentityWhenEmpty.class);
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.
+ */
+package org.sonar.server.platform.db.migration.version.v561;
+
+import java.sql.SQLException;
+import org.sonar.api.utils.System2;
+import org.sonar.db.Database;
+import org.sonar.db.version.MassUpdate;
+import org.sonar.db.version.Select;
+import org.sonar.db.version.SqlStatement;
+import org.sonar.server.platform.db.migration.step.DataChange;
+
+/**
+ * Update USERS.EXTERNAL_IDENTITY_PROVIDER to 'sonarqube' and USERS.EXTERNAL_IDENTITY to user's login when one of this 2 columns is null
+ */
+public class UpdateUsersExternalIdentityWhenEmpty extends DataChange {
+
+ private final System2 system2;
+
+ public UpdateUsersExternalIdentityWhenEmpty(Database db, System2 system2) {
+ super(db);
+ this.system2 = system2;
+ }
+
+ @Override
+ public void execute(Context context) throws SQLException {
+ MassUpdate massUpdate = context.prepareMassUpdate();
+ massUpdate.select("SELECT u.id, u.login FROM users u WHERE external_identity_provider IS NULL OR external_identity IS NULL");
+ massUpdate.update("UPDATE users SET external_identity_provider=?, external_identity=?, updated_at=? WHERE id=?");
+ massUpdate.rowPluralName("users");
+ massUpdate.execute(new MigrationHandler(system2.now()));
+ }
+
+ private static class MigrationHandler implements MassUpdate.Handler {
+
+ private final long now;
+
+ public MigrationHandler(long now) {
+ this.now = now;
+ }
+
+ @Override
+ public boolean handle(Select.Row row, SqlStatement update) throws SQLException {
+ update.setString(1, "sonarqube");
+ update.setString(2, row.getString(2));
+ update.setLong(3, now);
+ update.setLong(4, row.getLong(1));
+ return true;
+ }
+ }
+
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.
+ */
+@ParametersAreNonnullByDefault
+package org.sonar.server.platform.db.migration.version.v561;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
underTest.configure(container);
assertThat(container.getPicoContainer().getComponentAdapters())
- .hasSize(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 4);
+ .hasSize(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 5);
}
}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.
+ */
+package org.sonar.server.platform.db.migration.version.v561;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationCount;
+import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
+
+public class DbVersion561Test {
+ private DbVersion561 underTest = new DbVersion561();
+
+ @Test
+ public void verify_no_support_component() {
+ assertThat(underTest.getSupportComponents()).isEmpty();
+ }
+
+ @Test
+ public void migrationNumber_starts_at_1153() {
+ verifyMinimumMigrationNumber(underTest, 1153);
+ }
+
+ @Test
+ public void verify_migration_count() {
+ verifyMigrationCount(underTest, 1);
+ }
+
+
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program 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.
+ *
+ * This program 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.
+ */
+package org.sonar.server.platform.db.migration.version.v561;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.annotation.Nullable;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.sonar.api.utils.System2;
+import org.sonar.db.DbTester;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class UpdateUsersExternalIdentityWhenEmptyTest {
+
+ private static final long PAST = 1_000_000_000_000L;
+ private static final long NOW = 1_500_000_000_000L;
+
+ @Rule
+ public DbTester db = DbTester.createForSchema(System2.INSTANCE, UpdateUsersExternalIdentityWhenEmptyTest.class, "schema.sql");
+
+ private System2 system = mock(System2.class);
+
+ private UpdateUsersExternalIdentityWhenEmpty underTest = new UpdateUsersExternalIdentityWhenEmpty(db.database(), system);
+
+ @Before
+ public void setUp() throws Exception {
+ when(system.now()).thenReturn(NOW);
+ }
+
+ @Test
+ public void migrate_users() throws Exception {
+ insertUser("user-without-eternal-identity", null, null, PAST);
+ insertUser("user-with-only-eternal-identity-provider", "github", null, PAST);
+ insertUser("user-with-only-eternal-identity", null, "login1", PAST);
+ insertUser("user-with-both-eternal-identity", "github", "login2", PAST);
+
+ underTest.execute();
+
+ checkUserIsUpdated("user-without-eternal-identity");
+ checkUserIsUpdated("user-with-only-eternal-identity-provider");
+ checkUserIsUpdated("user-with-only-eternal-identity");
+
+ checkUserIsNotUpdated("user-with-both-eternal-identity");
+ }
+
+ @Test
+ public void doest_not_fail_when_no_user() throws Exception {
+ underTest.execute();
+ }
+
+ private void insertUser(String login, @Nullable String externalIdentity, @Nullable String externalIdentityProvider, long updatedAt) {
+ Map<String, Object> params = new HashMap<>();
+ params.put("LOGIN", login);
+ params.put("CREATED_AT", Long.toString(PAST));
+ params.put("UPDATED_AT", Long.toString(updatedAt));
+ if (externalIdentity != null) {
+ params.put("EXTERNAL_IDENTITY", externalIdentity);
+ }
+ if (externalIdentityProvider != null) {
+ params.put("EXTERNAL_IDENTITY_PROVIDER", externalIdentityProvider);
+ }
+
+ db.executeInsert("users", params);
+ }
+
+ private void checkUserIsUpdated(String login) {
+ Map<String, Object> row = db.selectFirst("select EXTERNAL_IDENTITY, EXTERNAL_IDENTITY_PROVIDER, UPDATED_AT from users where LOGIN='" + login + "'");
+ assertThat((String) row.get("EXTERNAL_IDENTITY_PROVIDER")).isEqualTo("sonarqube");
+ assertThat((String) row.get("EXTERNAL_IDENTITY")).isEqualTo(login);
+ assertThat(row.get("UPDATED_AT")).isEqualTo(NOW);
+ }
+
+ private void checkUserIsNotUpdated(String login) {
+ Map<String, Object> row = db.selectFirst("select EXTERNAL_IDENTITY, EXTERNAL_IDENTITY_PROVIDER, UPDATED_AT from users where LOGIN='" + login + "'");
+ assertThat((String) row.get("EXTERNAL_IDENTITY_PROVIDER")).isNotEmpty();
+ assertThat((String) row.get("EXTERNAL_IDENTITY")).isNotEmpty();
+ assertThat(row.get("UPDATED_AT")).isEqualTo(PAST);
+ }
+
+}
--- /dev/null
+CREATE TABLE "USERS" (
+ "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ "LOGIN" VARCHAR(255),
+ "NAME" VARCHAR(200),
+ "EMAIL" VARCHAR(100),
+ "CRYPTED_PASSWORD" VARCHAR(40),
+ "SALT" VARCHAR(40),
+ "REMEMBER_TOKEN" VARCHAR(500),
+ "REMEMBER_TOKEN_EXPIRES_AT" TIMESTAMP,
+ "ACTIVE" BOOLEAN DEFAULT TRUE,
+ "SCM_ACCOUNTS" VARCHAR(4000),
+ "EXTERNAL_IDENTITY" VARCHAR(255),
+ "EXTERNAL_IDENTITY_PROVIDER" VARCHAR(100),
+ "USER_LOCAL" BOOLEAN,
+ "CREATED_AT" BIGINT,
+ "UPDATED_AT" BIGINT
+);
+++ /dev/null
-#
-# SonarQube, open source software quality management tool.
-# Copyright (C) 2008-2016 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.
-#
-
-#
-# SonarQube 5.6.1
-# SONAR-7686
-#
-class UpdateUsersExternalIdentityWhenEmpty < ActiveRecord::Migration
-
- def self.up
- execute_java_migration('org.sonar.db.version.v561.UpdateUsersExternalIdentityWhenEmpty')
- end
-
-end
import org.sonar.core.platform.Module;
import org.sonar.db.version.v56.CreateInitialSchema;
import org.sonar.db.version.v56.PopulateInitialSchema;
-import org.sonar.db.version.v561.UpdateUsersExternalIdentityWhenEmpty;
public class MigrationStepModule extends Module {
@Override
add(
// 5.6
CreateInitialSchema.class,
- PopulateInitialSchema.class,
-
- // 5.6.1
- UpdateUsersExternalIdentityWhenEmpty.class);
+ PopulateInitialSchema.class);
}
}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * This program 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.
- *
- * This program 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.
- */
-package org.sonar.db.version.v561;
-
-import java.sql.SQLException;
-import org.sonar.api.utils.System2;
-import org.sonar.db.Database;
-import org.sonar.db.version.BaseDataChange;
-import org.sonar.db.version.MassUpdate;
-import org.sonar.db.version.Select;
-import org.sonar.db.version.SqlStatement;
-
-/**
- * Update USERS.EXTERNAL_IDENTITY_PROVIDER to 'sonarqube' and USERS.EXTERNAL_IDENTITY to user's login when one of this 2 columns is null
- */
-public class UpdateUsersExternalIdentityWhenEmpty extends BaseDataChange {
-
- private final System2 system2;
-
- public UpdateUsersExternalIdentityWhenEmpty(Database db, System2 system2) {
- super(db);
- this.system2 = system2;
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select("SELECT u.id, u.login FROM users u WHERE external_identity_provider IS NULL OR external_identity IS NULL");
- massUpdate.update("UPDATE users SET external_identity_provider=?, external_identity=?, updated_at=? WHERE id=?");
- massUpdate.rowPluralName("users");
- massUpdate.execute(new MigrationHandler(system2.now()));
- }
-
- private static class MigrationHandler implements MassUpdate.Handler {
-
- private final long now;
-
- public MigrationHandler(long now) {
- this.now = now;
- }
-
- @Override
- public boolean handle(Select.Row row, SqlStatement update) throws SQLException {
- update.setString(1, "sonarqube");
- update.setString(2, row.getString(2));
- update.setLong(3, now);
- update.setLong(4, row.getLong(1));
- return true;
- }
- }
-
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * This program 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.
- *
- * This program 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.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.db.version.v561;
-
-import javax.annotation.ParametersAreNonnullByDefault;
-
public void verify_count_of_added_MigrationStep_types() {
ComponentContainer container = new ComponentContainer();
new MigrationStepModule().configure(container);
- assertThat(container.size()).isEqualTo(5);
+ assertThat(container.size()).isEqualTo(4);
}
}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * This program 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.
- *
- * This program 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.
- */
-package org.sonar.db.version.v561;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.annotation.Nullable;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-import org.sonar.db.version.MigrationStep;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class UpdateUsersExternalIdentityWhenEmptyTest {
-
- @Rule
- public DbTester db = DbTester.createForSchema(System2.INSTANCE, UpdateUsersExternalIdentityWhenEmptyTest.class, "schema.sql");
-
- static final long PAST = 1_000_000_000_000L;
- static final long NOW = 1_500_000_000_000L;
-
- System2 system = mock(System2.class);
-
- MigrationStep underTest = new UpdateUsersExternalIdentityWhenEmpty(db.database(), system);
-
- @Before
- public void setUp() throws Exception {
- when(system.now()).thenReturn(NOW);
- }
-
- @Test
- public void migrate_users() throws Exception {
- insertUser("user-without-eternal-identity", null, null, PAST);
- insertUser("user-with-only-eternal-identity-provider", "github", null, PAST);
- insertUser("user-with-only-eternal-identity", null, "login1", PAST);
- insertUser("user-with-both-eternal-identity", "github", "login2", PAST);
-
- underTest.execute();
-
- checkUserIsUpdated("user-without-eternal-identity");
- checkUserIsUpdated("user-with-only-eternal-identity-provider");
- checkUserIsUpdated("user-with-only-eternal-identity");
-
- checkUserIsNotUpdated("user-with-both-eternal-identity");
- }
-
- @Test
- public void doest_not_fail_when_no_user() throws Exception {
- underTest.execute();
- }
-
- private void insertUser(String login, @Nullable String externalIdentity, @Nullable String externalIdentityProvider, long updatedAt) {
- Map<String, Object> params = new HashMap<>();
- params.put("LOGIN", login);
- params.put("CREATED_AT", Long.toString(PAST));
- params.put("UPDATED_AT", Long.toString(updatedAt));
- if (externalIdentity != null) {
- params.put("EXTERNAL_IDENTITY", externalIdentity);
- }
- if (externalIdentityProvider != null) {
- params.put("EXTERNAL_IDENTITY_PROVIDER", externalIdentityProvider);
- }
-
- db.executeInsert("users", params);
- }
-
- private void checkUserIsUpdated(String login) {
- Map<String, Object> row = db.selectFirst("select EXTERNAL_IDENTITY, EXTERNAL_IDENTITY_PROVIDER, UPDATED_AT from users where LOGIN='" + login + "'");
- assertThat((String) row.get("EXTERNAL_IDENTITY_PROVIDER")).isEqualTo("sonarqube");
- assertThat((String) row.get("EXTERNAL_IDENTITY")).isEqualTo(login);
- assertThat(row.get("UPDATED_AT")).isEqualTo(NOW);
- }
-
- private void checkUserIsNotUpdated(String login) {
- Map<String, Object> row = db.selectFirst("select EXTERNAL_IDENTITY, EXTERNAL_IDENTITY_PROVIDER, UPDATED_AT from users where LOGIN='" + login + "'");
- assertThat((String) row.get("EXTERNAL_IDENTITY_PROVIDER")).isNotEmpty();
- assertThat((String) row.get("EXTERNAL_IDENTITY")).isNotEmpty();
- assertThat(row.get("UPDATED_AT")).isEqualTo(PAST);
- }
-
-}
+++ /dev/null
-CREATE TABLE "USERS" (
- "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
- "LOGIN" VARCHAR(255),
- "NAME" VARCHAR(200),
- "EMAIL" VARCHAR(100),
- "CRYPTED_PASSWORD" VARCHAR(40),
- "SALT" VARCHAR(40),
- "REMEMBER_TOKEN" VARCHAR(500),
- "REMEMBER_TOKEN_EXPIRES_AT" TIMESTAMP,
- "ACTIVE" BOOLEAN DEFAULT TRUE,
- "SCM_ACCOUNTS" VARCHAR(4000),
- "EXTERNAL_IDENTITY" VARCHAR(255),
- "EXTERNAL_IDENTITY_PROVIDER" VARCHAR(100),
- "USER_LOCAL" BOOLEAN,
- "CREATED_AT" BIGINT,
- "UPDATED_AT" BIGINT
-);