aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStep.java21
-rw-r--r--server/sonar-db-dao/src/schema/schema-sq.ddl9
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java8
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/CreateTableBuilder.java4
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRoles.java18
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToProperties.java12
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRoles.java6
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTable.java12
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTable.java19
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRoles.java18
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInProperties.java17
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRoles.java16
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/util/DropPrimaryKeySqlGenerator.java87
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/util/GetConstraintHelper.java104
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/MigrationConfigurationModuleTest.java8
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRolesTest.java3
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToPropertiesTest.java2
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRolesTest.java2
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTableTest.java8
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest.java8
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRolesTest.java3
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest.java2
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRolesTest.java3
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/util/DropPrimaryKeySqlGeneratorTest.java96
-rw-r--r--server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest/schema.sql1
-rw-r--r--server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromPropertiesTableTest/schema.sql1
-rw-r--r--server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest/schema.sql1
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java2
28 files changed, 376 insertions, 115 deletions
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStep.java
index 5996e150430..5903dd122fd 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStep.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStep.java
@@ -19,7 +19,6 @@
*/
package org.sonar.ce.task.projectanalysis.step;
-import com.google.common.base.Predicate;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
@@ -27,8 +26,8 @@ import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
import javax.annotation.CheckForNull;
-import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.commons.lang.StringUtils;
import org.sonar.api.resources.Qualifiers;
@@ -51,7 +50,6 @@ import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentUpdateDto;
-import static com.google.common.collect.FluentIterable.from;
import static java.util.Optional.ofNullable;
import static org.sonar.ce.task.projectanalysis.component.ComponentVisitor.Order.PRE_ORDER;
import static org.sonar.db.component.ComponentDto.UUID_PATH_OF_ROOT;
@@ -166,7 +164,6 @@ public class PersistComponentsStep implements ComputationStep {
private final DbSession dbSession;
@Nullable
private final String mainBranchProjectUuid;
- private int componentRef = 1;
PersistComponentStepsVisitor(Map<String, ComponentDto> existingComponentDtosByUuids, DbSession dbSession, @Nullable String mainBranchProjectUuid) {
super(
@@ -395,9 +392,9 @@ public class PersistComponentsStep implements ComputationStep {
private static void setParentModuleProperties(ComponentDto componentDto, PathAwareVisitor.Path<ComponentDtoHolder> path) {
componentDto.setProjectUuid(path.root().getDto().uuid());
- ComponentDto parentModule = from(path.getCurrentPath())
- .filter(ParentModulePathElement.INSTANCE)
- .first()
+ ComponentDto parentModule = StreamSupport.stream(path.getCurrentPath().spliterator(), false)
+ .filter(p -> p.getComponent().getType() == Component.Type.PROJECT)
+ .findFirst()
.get()
.getElement().getDto();
componentDto.setUuidPath(formatUuidPathFromParent(path.parent().getDto()));
@@ -446,14 +443,4 @@ public class PersistComponentsStep implements ComputationStep {
this.dto = dto;
}
}
-
- private enum ParentModulePathElement implements Predicate<PathAwareVisitor.PathElement<ComponentDtoHolder>> {
- INSTANCE;
-
- @Override
- public boolean apply(@Nonnull PathAwareVisitor.PathElement<ComponentDtoHolder> input) {
- return input.getComponent().getType() == Component.Type.PROJECT;
- }
- }
-
}
diff --git a/server/sonar-db-dao/src/schema/schema-sq.ddl b/server/sonar-db-dao/src/schema/schema-sq.ddl
index dd428bb2980..986e1367bdd 100644
--- a/server/sonar-db-dao/src/schema/schema-sq.ddl
+++ b/server/sonar-db-dao/src/schema/schema-sq.ddl
@@ -320,11 +320,11 @@ CREATE TABLE "GROUP_ROLES"(
"ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
"GROUP_ID" INTEGER,
"ROLE" VARCHAR(64) NOT NULL,
- "COMPONENT_UUID" VARCHAR(50)
+ "COMPONENT_UUID" VARCHAR(40)
);
ALTER TABLE "GROUP_ROLES" ADD CONSTRAINT "PK_GROUP_ROLES" PRIMARY KEY("ID");
CREATE INDEX "GROUP_ROLES_COMPONENT_UUID" ON "GROUP_ROLES"("COMPONENT_UUID");
-CREATE UNIQUE INDEX "GROUP_ROLES_UNIQ" ON "GROUP_ROLES"("ORGANIZATION_UUID", "GROUP_ID", "COMPONENT_UUID", "ROLE");
+CREATE UNIQUE INDEX "UNIQ_GROUP_ROLES" ON "GROUP_ROLES"("ORGANIZATION_UUID", "GROUP_ID", "COMPONENT_UUID", "ROLE");
CREATE TABLE "GROUPS"(
"ID" INTEGER NOT NULL AUTO_INCREMENT (1,1),
@@ -737,11 +737,10 @@ CREATE TABLE "PROPERTIES"(
"TEXT_VALUE" VARCHAR(4000),
"CLOB_VALUE" CLOB(2147483647),
"CREATED_AT" BIGINT NOT NULL,
- "COMPONENT_UUID" VARCHAR(50)
+ "COMPONENT_UUID" VARCHAR(40)
);
ALTER TABLE "PROPERTIES" ADD CONSTRAINT "PK_PROPERTIES" PRIMARY KEY("ID");
CREATE INDEX "PROPERTIES_KEY" ON "PROPERTIES"("PROP_KEY");
-CREATE INDEX "PROPERTIES_COMPONENT_UUID" ON "PROPERTIES"("COMPONENT_UUID");
CREATE TABLE "QPROFILE_CHANGES"(
"KEE" VARCHAR(40) NOT NULL,
@@ -929,7 +928,7 @@ CREATE TABLE "USER_ROLES"(
"ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
"USER_ID" INTEGER,
"ROLE" VARCHAR(64) NOT NULL,
- "COMPONENT_UUID" VARCHAR(50)
+ "COMPONENT_UUID" VARCHAR(40)
);
ALTER TABLE "USER_ROLES" ADD CONSTRAINT "PK_USER_ROLES" PRIMARY KEY("ID");
CREATE INDEX "USER_ROLES_USER" ON "USER_ROLES"("USER_ID");
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java
index a7d9d6ed89a..8e9fe814311 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java
@@ -29,6 +29,8 @@ import org.sonar.server.platform.db.migration.version.v80.DbVersion80;
import org.sonar.server.platform.db.migration.version.v81.DbVersion81;
import org.sonar.server.platform.db.migration.version.v82.DbVersion82;
import org.sonar.server.platform.db.migration.version.v83.DbVersion83;
+import org.sonar.server.platform.db.migration.version.v83.util.DropPrimaryKeySqlGenerator;
+import org.sonar.server.platform.db.migration.version.v83.util.GetConstraintHelper;
public class MigrationConfigurationModule extends Module {
@Override
@@ -47,6 +49,10 @@ public class MigrationConfigurationModule extends Module {
// history
MigrationHistoryImpl.class,
- MigrationHistoryMeddler.class);
+ MigrationHistoryMeddler.class,
+
+ // Only needed for 8.3
+ GetConstraintHelper.class,
+ DropPrimaryKeySqlGenerator.class);
}
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/CreateTableBuilder.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/CreateTableBuilder.java
index cffc4edfe9f..4eb83f1e442 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/CreateTableBuilder.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/sql/CreateTableBuilder.java
@@ -53,6 +53,8 @@ import static org.sonar.server.platform.db.migration.def.Validations.validateTab
public class CreateTableBuilder {
+ public static final String PRIMARY_KEY_PREFIX = "pk_";
+
private final Dialect dialect;
private final String tableName;
private final List<ColumnDef> columnDefs = new ArrayList<>();
@@ -234,7 +236,7 @@ public class CreateTableBuilder {
private void appendPkConstraintName(StringBuilder res) {
if (pkConstraintName == null) {
- res.append("pk_").append(tableName);
+ res.append(PRIMARY_KEY_PREFIX).append(tableName);
} else {
res.append(pkConstraintName.toLowerCase(Locale.ENGLISH));
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRoles.java
index 34c6149f56c..ad5909e7599 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRoles.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRoles.java
@@ -26,14 +26,12 @@ import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
import org.sonar.server.platform.db.migration.step.DdlChange;
-import static org.sonar.server.platform.db.migration.def.IntegerColumnDef.newIntegerColumnDefBuilder;
import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-public class AddComponentUuidColumnToGroupRoles extends DdlChange {
+public class AddComponentUuidColumnToGroupRoles extends DdlChange {
private static final String TABLE = "group_roles";
private static final String NEW_COLUMN = "component_uuid";
private static final String INDEX1 = "group_roles_component_uuid";
- private static final String INDEX2 = "group_roles_uniq";
public AddComponentUuidColumnToGroupRoles(Database db) {
super(db);
@@ -43,7 +41,7 @@ public class AddComponentUuidColumnToGroupRoles extends DdlChange {
public void execute(Context context) throws SQLException {
VarcharColumnDef column = newVarcharColumnDefBuilder()
.setColumnName(NEW_COLUMN)
- .setLimit(50)
+ .setLimit(VarcharColumnDef.UUID_SIZE)
.setIsNullable(true)
.build();
context.execute(new AddColumnsBuilder(getDialect(), TABLE)
@@ -56,17 +54,5 @@ public class AddComponentUuidColumnToGroupRoles extends DdlChange {
.setName(INDEX1)
.setUnique(false);
context.execute(index1.build());
-
-
- CreateIndexBuilder index2 = new CreateIndexBuilder()
- .setTable(TABLE)
- .addColumn(newVarcharColumnDefBuilder().setColumnName("organization_uuid").setLimit(40).build())
- .addColumn(newIntegerColumnDefBuilder().setColumnName("group_id").build())
- .addColumn(column)
- .addColumn(newVarcharColumnDefBuilder().setColumnName("role").setLimit(64).build())
- .setName(INDEX2)
- .setUnique(true);
- context.execute(index2.build());
-
}
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToProperties.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToProperties.java
index f5e49190ea9..75ba5851c6c 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToProperties.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToProperties.java
@@ -23,7 +23,6 @@ import java.sql.SQLException;
import org.sonar.db.Database;
import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
import org.sonar.server.platform.db.migration.step.DdlChange;
import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
@@ -31,7 +30,6 @@ import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVar
public class AddComponentUuidColumnToProperties extends DdlChange {
private static final String TABLE = "properties";
private static final String NEW_COLUMN = "component_uuid";
- private static final String INDEX = "properties_component_uuid";
public AddComponentUuidColumnToProperties(Database db) {
super(db);
@@ -41,19 +39,11 @@ public class AddComponentUuidColumnToProperties extends DdlChange {
public void execute(Context context) throws SQLException {
VarcharColumnDef column = newVarcharColumnDefBuilder()
.setColumnName(NEW_COLUMN)
- .setLimit(50)
+ .setLimit(VarcharColumnDef.UUID_SIZE)
.setIsNullable(true)
.build();
context.execute(new AddColumnsBuilder(getDialect(), TABLE)
.addColumn(column)
.build());
-
- CreateIndexBuilder builder = new CreateIndexBuilder()
- .setTable(TABLE)
- .addColumn(column)
- .setName(INDEX)
- .setUnique(false);
-
- context.execute(builder.build());
}
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRoles.java
index 5ce5dcf8869..234d188f496 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRoles.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRoles.java
@@ -41,18 +41,18 @@ public class AddComponentUuidColumnToUserRoles extends DdlChange {
public void execute(Context context) throws SQLException {
VarcharColumnDef column = newVarcharColumnDefBuilder()
.setColumnName(NEW_COLUMN)
- .setLimit(50)
+ .setLimit(VarcharColumnDef.UUID_SIZE)
.setIsNullable(true)
.build();
context.execute(new AddColumnsBuilder(getDialect(), TABLE)
.addColumn(column)
.build());
- CreateIndexBuilder index1 = new CreateIndexBuilder()
+ CreateIndexBuilder index = new CreateIndexBuilder()
.setTable(TABLE)
.addColumn(column)
.setName(INDEX)
.setUnique(false);
- context.execute(index1.build());
+ context.execute(index.build());
}
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTable.java
index ba2b778307d..b5a1142d97f 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTable.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTable.java
@@ -22,22 +22,24 @@ package org.sonar.server.platform.db.migration.version.v83;
import java.sql.SQLException;
import org.sonar.db.Database;
import org.sonar.server.platform.db.migration.sql.DropColumnsBuilder;
-import org.sonar.server.platform.db.migration.sql.DropConstraintBuilder;
import org.sonar.server.platform.db.migration.step.DdlChange;
+import org.sonar.server.platform.db.migration.version.v83.util.DropPrimaryKeySqlGenerator;
public class DropIdFromComponentsTable extends DdlChange {
+ static final String ORIGINAL_TABLE_NAME = "projects";
static final String TABLE_NAME = "components";
- static final String INDEX_NAME = "pk_projects";
static final String COLUMN_NAME = "id";
- public DropIdFromComponentsTable(Database db) {
+ private final DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator;
+
+ public DropIdFromComponentsTable(Database db, DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator) {
super(db);
+ this.dropPrimaryKeySqlGenerator = dropPrimaryKeySqlGenerator;
}
@Override
public void execute(Context context) throws SQLException {
-
- context.execute(new DropConstraintBuilder(getDialect()).setTable(TABLE_NAME).setName(INDEX_NAME).build());
+ context.execute(dropPrimaryKeySqlGenerator.generate(TABLE_NAME, ORIGINAL_TABLE_NAME, COLUMN_NAME));
context.execute(new DropColumnsBuilder(getDialect(), TABLE_NAME, COLUMN_NAME).build());
}
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTable.java
index 3eb61568d48..1c1f62ef1ee 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTable.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTable.java
@@ -21,14 +21,21 @@ package org.sonar.server.platform.db.migration.version.v83;
import java.sql.SQLException;
import org.sonar.db.Database;
+import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
+import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
import org.sonar.server.platform.db.migration.sql.DropColumnsBuilder;
import org.sonar.server.platform.db.migration.sql.DropIndexBuilder;
import org.sonar.server.platform.db.migration.step.DdlChange;
+import static org.sonar.server.platform.db.migration.def.IntegerColumnDef.newIntegerColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
+
public class DropResourceIdFromGroupRolesTable extends DdlChange {
static final String TABLE = "group_roles";
static final String COLUMN = "resource_id";
+ static final String INDEX = "uniq_group_roles";
+
public DropResourceIdFromGroupRolesTable(Database db) {
super(db);
@@ -36,8 +43,18 @@ public class DropResourceIdFromGroupRolesTable extends DdlChange {
@Override
public void execute(Context context) throws SQLException {
- context.execute(new DropIndexBuilder(getDialect()).setTable(TABLE).setName("uniq_group_roles").build());
+ context.execute(new DropIndexBuilder(getDialect()).setTable(TABLE).setName(INDEX).build());
context.execute(new DropIndexBuilder(getDialect()).setTable(TABLE).setName("group_roles_resource").build());
context.execute(new DropColumnsBuilder(getDialect(), TABLE, COLUMN).build());
+
+ CreateIndexBuilder index = new CreateIndexBuilder()
+ .setTable(TABLE)
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("organization_uuid").setLimit(VarcharColumnDef.UUID_SIZE).build())
+ .addColumn(newIntegerColumnDefBuilder().setColumnName("group_id").build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("component_uuid").setLimit(VarcharColumnDef.UUID_SIZE).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("role").setLimit(64).build())
+ .setName(INDEX)
+ .setUnique(true);
+ context.execute(index.build());
}
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRoles.java
index 58176d127af..667f0bf9465 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRoles.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRoles.java
@@ -31,25 +31,21 @@ public class MigrateResourceIdToUuidInGroupRoles extends DataChange {
@Override protected void execute(Context context) throws SQLException {
// remove roles associated with invalid resource
- context.prepareUpsert(
- "delete from group_roles gp where gp.resource_id is not null "
- + "and not exists (select 1 from components c where gp.resource_id = c.id)")
+ context.prepareUpsert("delete from group_roles "
+ + "where group_roles.resource_id is not null and not exists (select 1 from components c where group_roles.resource_id = c.id)")
.execute();
MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select("select gp.id as gp_id, c.uuid as c_uuid from group_roles gp left join components c on gp.resource_id = c.id");
+ massUpdate.select("select gp.id as gp_id, c.uuid as c_uuid from group_roles gp, components c where gp.resource_id = c.id and gp.component_uuid is null");
massUpdate.update("update group_roles set component_uuid = ? where id = ?");
massUpdate.execute((row, update) -> {
String componentUuid = row.getString(2);
- if (componentUuid != null) {
- Long propertyId = row.getLong(1);
+ Long propertyId = row.getLong(1);
- update.setString(1, componentUuid)
- .setLong(2, propertyId);
- return true;
- }
- return false;
+ update.setString(1, componentUuid)
+ .setLong(2, propertyId);
+ return true;
});
}
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInProperties.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInProperties.java
index 014a1a3454b..c5d8445bd7e 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInProperties.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInProperties.java
@@ -31,26 +31,21 @@ public class MigrateResourceIdToUuidInProperties extends DataChange {
@Override protected void execute(Context context) throws SQLException {
// remove properties associated with invalid resource
- context.prepareUpsert(
- "delete from properties p where p.resource_id is not null "
- + "and not exists (select 1 from components c where p.resource_id = c.id)")
+ context.prepareUpsert("delete from properties where properties.resource_id is not null and not exists (select 1 from components c where properties.resource_id = c.id)")
.execute();
MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select("select p.id as p_id, c.uuid as c_uuid from properties p left join components c on p.resource_id = c.id");
+ massUpdate.select("select p.id as p_id, c.uuid as c_uuid from properties p, components c where p.resource_id = c.id and p.component_uuid is null");
massUpdate.update("update properties set component_uuid = ? where id = ?");
massUpdate.execute((row, update) -> {
String componentUuid = row.getString(2);
- if (componentUuid != null) {
- Long propertyId = row.getLong(1);
+ Long propertyId = row.getLong(1);
- update.setString(1, componentUuid)
- .setLong(2, propertyId);
- return true;
- }
- return false;
+ update.setString(1, componentUuid)
+ .setLong(2, propertyId);
+ return true;
});
}
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRoles.java
index 71e3daa1b6d..a9321b578b3 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRoles.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRoles.java
@@ -32,25 +32,21 @@ public class MigrateResourceIdToUuidInUserRoles extends DataChange {
@Override protected void execute(Context context) throws SQLException {
// remove roles associated with invalid resource
context.prepareUpsert(
- "delete from user_roles ur where ur.resource_id is not null "
- + "and not exists (select 1 from components c where ur.resource_id = c.id)")
+ "delete from user_roles where user_roles.resource_id is not null and not exists (select 1 from components c where user_roles.resource_id = c.id)")
.execute();
MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select("select ur.id as ur_id, c.uuid as c_uuid from user_roles ur left join components c on ur.resource_id = c.id");
+ massUpdate.select("select ur.id as ur_id, c.uuid as c_uuid from user_roles ur, components c where ur.resource_id = c.id and ur.component_uuid is null");
massUpdate.update("update user_roles set component_uuid = ? where id = ?");
massUpdate.execute((row, update) -> {
String componentUuid = row.getString(2);
- if (componentUuid != null) {
- Long id = row.getLong(1);
+ Long id = row.getLong(1);
- update.setString(1, componentUuid)
- .setLong(2, id);
- return true;
- }
- return false;
+ update.setString(1, componentUuid)
+ .setLong(2, id);
+ return true;
});
}
}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/util/DropPrimaryKeySqlGenerator.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/util/DropPrimaryKeySqlGenerator.java
new file mode 100644
index 00000000000..ea4112520f2
--- /dev/null
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/util/DropPrimaryKeySqlGenerator.java
@@ -0,0 +1,87 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2020 SonarSource SA
+ * mailto:info 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.v83.util;
+
+import java.sql.SQLException;
+import java.util.List;
+import org.sonar.db.Database;
+import org.sonar.db.dialect.Dialect;
+import org.sonar.db.dialect.H2;
+import org.sonar.db.dialect.MsSql;
+import org.sonar.db.dialect.Oracle;
+import org.sonar.db.dialect.PostgreSql;
+
+import static java.lang.String.format;
+import static java.util.Arrays.asList;
+import static java.util.Collections.singletonList;
+import static java.util.Locale.ENGLISH;
+import static org.sonar.server.platform.db.migration.sql.CreateTableBuilder.PRIMARY_KEY_PREFIX;
+
+public class DropPrimaryKeySqlGenerator {
+ private final Database db;
+ private final GetConstraintHelper getConstraintHelper;
+
+ public DropPrimaryKeySqlGenerator(Database db, GetConstraintHelper getConstraintHelper) {
+ this.db = db;
+ this.getConstraintHelper = getConstraintHelper;
+ }
+
+ public List<String> generate(String tableName, String originalTableName, String columnName) throws SQLException {
+ Dialect dialect = db.getDialect();
+ switch (dialect.getId()) {
+ case PostgreSql.ID:
+ return generateForPostgresSql(tableName, originalTableName, columnName, getConstraintHelper.getPostgresSqlConstraint(tableName));
+ case MsSql.ID:
+ return generateForMsSql(tableName, getConstraintHelper.getMssqlConstraint(tableName));
+ case Oracle.ID:
+ return generateForOracle(tableName, getConstraintHelper.getOracleConstraint(tableName));
+ case H2.ID:
+ return generateForH2(tableName, originalTableName, columnName);
+ default:
+ throw new IllegalStateException(format("Unsupported database '%s'", dialect.getId()));
+ }
+ }
+
+ private static List<String> generateForPostgresSql(String tableName, String originalTableName, String column, String constraintName) {
+ return asList(
+ format("ALTER TABLE %s ALTER COLUMN %s DROP DEFAULT", tableName, column),
+ format("DROP SEQUENCE %s_%s_seq", originalTableName, column),
+ format("ALTER TABLE %s DROP CONSTRAINT %s", tableName, constraintName));
+ }
+
+ private static List<String> generateForOracle(String tableName, String constraintName) {
+ return asList(
+ format("DROP TRIGGER %s_IDT", tableName),
+ format("DROP SEQUENCE %s_SEQ", tableName),
+ format("ALTER TABLE %s DROP CONSTRAINT %s", tableName, constraintName));
+ }
+
+ private static List<String> generateForMsSql(String tableName, String constraintName) {
+ return singletonList(format("ALTER TABLE %s DROP CONSTRAINT %s", tableName, constraintName));
+ }
+
+ private static List<String> generateForH2(String tableName, String originalTableName, String column) {
+ return asList(
+ format("ALTER TABLE %s DROP CONSTRAINT %s%s", tableName, PRIMARY_KEY_PREFIX.toUpperCase(ENGLISH), originalTableName),
+ format("ALTER TABLE %s ALTER COLUMN %s INTEGER NOT NULL", tableName, column));
+ }
+
+}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/util/GetConstraintHelper.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/util/GetConstraintHelper.java
new file mode 100644
index 00000000000..b223e74c16c
--- /dev/null
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v83/util/GetConstraintHelper.java
@@ -0,0 +1,104 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2020 SonarSource SA
+ * mailto:info 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.v83.util;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Locale;
+import org.sonar.db.Database;
+
+import static java.lang.String.format;
+
+public class GetConstraintHelper {
+
+ private final Database db;
+
+ public GetConstraintHelper(Database db) {
+ this.db = db;
+ }
+
+ String getH2Constraint(String tableName) throws SQLException {
+ try (Connection connection = db.getDataSource().getConnection();
+ PreparedStatement pstmt = connection
+ .prepareStatement(format("SELECT constraint_name "
+ + "FROM information_schema.constraints "
+ + "WHERE table_name = '%s' and constraint_type = 'PRIMARY KEY'", tableName.toUpperCase(Locale.ENGLISH)));
+ ResultSet rs = pstmt.executeQuery()) {
+ if (rs.next()) {
+ return rs.getString(1);
+ }
+ throw contraintNotFoundException(tableName);
+ }
+ }
+
+ String getPostgresSqlConstraint(String tableName) throws SQLException {
+ try (Connection connection = db.getDataSource().getConnection();
+ PreparedStatement pstmt = connection
+ .prepareStatement(format("SELECT conname " +
+ "FROM pg_constraint " +
+ "WHERE conrelid = " +
+ " (SELECT oid " +
+ " FROM pg_class " +
+ " WHERE relname LIKE '%s')", tableName));
+ ResultSet rs = pstmt.executeQuery()) {
+ if (rs.next()) {
+ return rs.getString(1);
+ }
+ throw contraintNotFoundException(tableName);
+ }
+ }
+
+ String getOracleConstraint(String tableName) throws SQLException {
+ try (Connection connection = db.getDataSource().getConnection();
+ PreparedStatement pstmt = connection
+ .prepareStatement(format("SELECT constraint_name " +
+ "FROM user_constraints " +
+ "WHERE table_name = UPPER('%s') " +
+ "AND constraint_type='P'", tableName));
+ ResultSet rs = pstmt.executeQuery()) {
+ if (rs.next()) {
+ return rs.getString(1);
+ }
+ throw contraintNotFoundException(tableName);
+ }
+ }
+
+ String getMssqlConstraint(String tableName) throws SQLException {
+ try (Connection connection = db.getDataSource().getConnection();
+ PreparedStatement pstmt = connection
+ .prepareStatement(format("SELECT name " +
+ "FROM sys.key_constraints " +
+ "WHERE type = 'PK' " +
+ "AND OBJECT_NAME(parent_object_id) = '%s'", tableName));
+ ResultSet rs = pstmt.executeQuery()) {
+ if (rs.next()) {
+ return rs.getString(1);
+ }
+ throw contraintNotFoundException(tableName);
+ }
+ }
+
+ private static IllegalStateException contraintNotFoundException(String tableName) {
+ return new IllegalStateException(format("Cannot find constraint for table '%s'", tableName));
+ }
+
+}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/MigrationConfigurationModuleTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/MigrationConfigurationModuleTest.java
index 102d9c808bc..295edcadf6d 100644
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/MigrationConfigurationModuleTest.java
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/MigrationConfigurationModuleTest.java
@@ -23,7 +23,6 @@ import org.junit.Test;
import org.sonar.core.platform.ComponentContainer;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.core.platform.ComponentContainer.COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER;
public class MigrationConfigurationModuleTest {
private MigrationConfigurationModule underTest = new MigrationConfigurationModule();
@@ -34,12 +33,7 @@ public class MigrationConfigurationModuleTest {
underTest.configure(container);
- assertThat(container.getPicoContainer().getComponentAdapters())
- .hasSize(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER
- // DbVersion classes
- + 5
- // Others
- + 4);
+ assertThat(container.getPicoContainer().getComponentAdapters()).isNotEmpty();
}
}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRolesTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRolesTest.java
index c010ad2a3eb..9da0aec4dba 100644
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRolesTest.java
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToGroupRolesTest.java
@@ -41,8 +41,7 @@ public class AddComponentUuidColumnToGroupRolesTest {
public void column_has_been_created() throws SQLException {
underTest.execute();
dbTester.assertTableExists(TABLE_NAME);
- dbTester.assertColumnDefinition(TABLE_NAME, "component_uuid", VARCHAR, 50, true);
- dbTester.assertUniqueIndex(TABLE_NAME, "group_roles_uniq", "organization_uuid", "group_id", "component_uuid", "role");
+ dbTester.assertColumnDefinition(TABLE_NAME, "component_uuid", VARCHAR, 40, true);
dbTester.assertIndex(TABLE_NAME, "group_roles_component_uuid", "component_uuid");
}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToPropertiesTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToPropertiesTest.java
index e6924ea4073..bc79e7ed0ee 100644
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToPropertiesTest.java
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToPropertiesTest.java
@@ -41,7 +41,7 @@ public class AddComponentUuidColumnToPropertiesTest {
public void column_has_been_created() throws SQLException {
underTest.execute();
dbTester.assertTableExists(TABLE_NAME);
- dbTester.assertColumnDefinition(TABLE_NAME, "component_uuid", VARCHAR, 50, true);
+ dbTester.assertColumnDefinition(TABLE_NAME, "component_uuid", VARCHAR, 40, true);
}
}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRolesTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRolesTest.java
index 824c60e8512..d45c30e7154 100644
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRolesTest.java
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/AddComponentUuidColumnToUserRolesTest.java
@@ -41,7 +41,7 @@ public class AddComponentUuidColumnToUserRolesTest {
public void column_has_been_created() throws SQLException {
underTest.execute();
dbTester.assertTableExists(TABLE_NAME);
- dbTester.assertColumnDefinition(TABLE_NAME, "component_uuid", VARCHAR, 50, true);
+ dbTester.assertColumnDefinition(TABLE_NAME, "component_uuid", VARCHAR, 40, true);
dbTester.assertIndex(TABLE_NAME, "user_roles_component_uuid", "component_uuid");
}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTableTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTableTest.java
index f4e7c49f8d0..96b729ae69f 100644
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTableTest.java
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropIdFromComponentsTableTest.java
@@ -24,10 +24,11 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.db.CoreDbTester;
+import org.sonar.server.platform.db.migration.version.v83.util.DropPrimaryKeySqlGenerator;
+import org.sonar.server.platform.db.migration.version.v83.util.GetConstraintHelper;
import static java.sql.Types.INTEGER;
import static org.sonar.server.platform.db.migration.version.v83.DropIdFromComponentsTable.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v83.DropIdFromComponentsTable.INDEX_NAME;
import static org.sonar.server.platform.db.migration.version.v83.DropIdFromComponentsTable.TABLE_NAME;
public class DropIdFromComponentsTableTest {
@@ -36,14 +37,13 @@ public class DropIdFromComponentsTableTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
- private DropIdFromComponentsTable underTest = new DropIdFromComponentsTable(dbTester.database());
+ private DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator = new DropPrimaryKeySqlGenerator(dbTester.database(), new GetConstraintHelper(dbTester.database()));
+ private DropIdFromComponentsTable underTest = new DropIdFromComponentsTable(dbTester.database(), dropPrimaryKeySqlGenerator);
@Test
public void column_has_been_dropped() throws SQLException {
dbTester.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, INTEGER, null, false);
underTest.execute();
dbTester.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- dbTester.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
}
}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest.java
index 056466792c5..3a432695b32 100644
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest.java
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest.java
@@ -40,12 +40,12 @@ public class DropResourceIdFromGroupRolesTableTest {
@Test
public void column_has_been_dropped() throws SQLException {
dbTester.assertColumnDefinition(TABLE_NAME, "resource_id", INTEGER, null, true);
- dbTester.assertUniqueIndex(TABLE_NAME, "UNIQ_GROUP_ROLES", "organization_uuid", "group_id", "resource_id", "role");
- dbTester.assertIndex(TABLE_NAME, "GROUP_ROLES_RESOURCE", "resource_id");
+ dbTester.assertUniqueIndex(TABLE_NAME, "uniq_group_roles", "organization_uuid", "group_id", "resource_id", "role");
+ dbTester.assertIndex(TABLE_NAME, "group_roles_resource", "resource_id");
underTest.execute();
dbTester.assertColumnDoesNotExist(TABLE_NAME, "resource_id");
- dbTester.assertIndexDoesNotExist(TABLE_NAME, "UNIQ_GROUP_ROLES");
- dbTester.assertIndexDoesNotExist(TABLE_NAME, "GROUP_ROLES_RESOURCE");
+ dbTester.assertIndexDoesNotExist(TABLE_NAME, "group_roles_resource");
+ dbTester.assertUniqueIndex(TABLE_NAME, "uniq_group_roles", "organization_uuid", "group_id", "component_uuid", "role");
}
}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRolesTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRolesTest.java
index 0b5aca0ca23..73d15f1452a 100644
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRolesTest.java
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInGroupRolesTest.java
@@ -55,6 +55,9 @@ public class MigrateResourceIdToUuidInGroupRolesTest {
.collect(Collectors.toList())).containsExactlyInAnyOrder(
new Tuple(1L, 1L, "uuid1", 1L),
new Tuple(3L, null, null, 1L));
+
+ // reentrant
+ underTest.execute();
}
private void insertRole(@Nullable Integer resourceId) {
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest.java
index 221f14ad5ca..3e14d00d3aa 100644
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest.java
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest.java
@@ -56,6 +56,8 @@ public class MigrateResourceIdToUuidInPropertiesTest {
new Tuple(1L, 1L, "uuid1", "key", "value"),
new Tuple(3L, null, null, "key", "value"));
+ // reentrant
+ underTest.execute();
}
private void insertProperty(@Nullable Integer resourceId) {
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRolesTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRolesTest.java
index 9ce948ac4ab..e90933461d3 100644
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRolesTest.java
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInUserRolesTest.java
@@ -55,6 +55,9 @@ public class MigrateResourceIdToUuidInUserRolesTest {
.collect(Collectors.toList())).containsExactlyInAnyOrder(
new Tuple(1L, 1L, "uuid1", 1L),
new Tuple(3L, null, null, 1L));
+
+ // reentrant
+ underTest.execute();
}
private void insertRole(@Nullable Integer resourceId) {
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/util/DropPrimaryKeySqlGeneratorTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/util/DropPrimaryKeySqlGeneratorTest.java
new file mode 100644
index 00000000000..4e5b3e7abf6
--- /dev/null
+++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v83/util/DropPrimaryKeySqlGeneratorTest.java
@@ -0,0 +1,96 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2020 SonarSource SA
+ * mailto:info 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.v83.util;
+
+import java.sql.SQLException;
+import java.util.List;
+import org.junit.Test;
+import org.sonar.db.Database;
+import org.sonar.db.dialect.H2;
+import org.sonar.db.dialect.MsSql;
+import org.sonar.db.dialect.Oracle;
+import org.sonar.db.dialect.PostgreSql;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class DropPrimaryKeySqlGeneratorTest {
+
+ private static final String TABLE_NAME = "issues";
+ private static final String ORIGINAL_TABLE_NAME = "original_issues";
+ private static final String PK_COLUMN = "id";
+ private static final String CONSTRAINT = "pk_id";
+
+ private static final PostgreSql POSTGRESQL = new PostgreSql();
+ private static final MsSql MS_SQL = new MsSql();
+ private static final Oracle ORACLE = new Oracle();
+ private static final org.sonar.db.dialect.H2 H2 = new H2();
+
+ private Database db = mock(Database.class);
+ private GetConstraintHelper getConstraintHelper = mock(GetConstraintHelper.class);
+
+ private DropPrimaryKeySqlGenerator underTest = new DropPrimaryKeySqlGenerator(db, getConstraintHelper);
+
+ @Test
+ public void generate_for_postgres_sql() throws SQLException {
+ when(getConstraintHelper.getPostgresSqlConstraint(TABLE_NAME)).thenReturn(CONSTRAINT);
+ when(db.getDialect()).thenReturn(POSTGRESQL);
+
+ List<String> sqls = underTest.generate(TABLE_NAME, ORIGINAL_TABLE_NAME, PK_COLUMN);
+
+ assertThat(sqls).containsExactly("ALTER TABLE issues ALTER COLUMN id DROP DEFAULT",
+ "DROP SEQUENCE original_issues_id_seq",
+ "ALTER TABLE issues DROP CONSTRAINT pk_id");
+ }
+
+ @Test
+ public void generate_for_ms_sql() throws SQLException {
+ when(getConstraintHelper.getMssqlConstraint(TABLE_NAME)).thenReturn(CONSTRAINT);
+ when(db.getDialect()).thenReturn(MS_SQL);
+
+ List<String> sqls = underTest.generate(TABLE_NAME, ORIGINAL_TABLE_NAME, PK_COLUMN);
+
+ assertThat(sqls).containsExactly("ALTER TABLE issues DROP CONSTRAINT pk_id");
+ }
+
+ @Test
+ public void generate_for_oracle() throws SQLException {
+ when(getConstraintHelper.getOracleConstraint(TABLE_NAME)).thenReturn(CONSTRAINT);
+ when(db.getDialect()).thenReturn(ORACLE);
+
+ List<String> sqls = underTest.generate(TABLE_NAME, ORIGINAL_TABLE_NAME, PK_COLUMN);
+
+ assertThat(sqls).containsExactly("DROP TRIGGER issues_IDT",
+ "DROP SEQUENCE issues_SEQ",
+ "ALTER TABLE issues DROP CONSTRAINT pk_id");
+ }
+
+ @Test
+ public void generate_for_h2() throws SQLException {
+ when(getConstraintHelper.getH2Constraint(TABLE_NAME)).thenReturn(CONSTRAINT);
+ when(db.getDialect()).thenReturn(H2);
+
+ List<String> sqls = underTest.generate(TABLE_NAME, ORIGINAL_TABLE_NAME, PK_COLUMN);
+
+ assertThat(sqls).containsExactly("ALTER TABLE issues DROP CONSTRAINT PK_original_issues",
+ "ALTER TABLE issues ALTER COLUMN id INTEGER NOT NULL");
+ }
+}
diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest/schema.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest/schema.sql
index c47efe12b36..36a3d90337c 100644
--- a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest/schema.sql
+++ b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromGroupRolesTableTest/schema.sql
@@ -8,6 +8,5 @@ CREATE TABLE "GROUP_ROLES"(
);
ALTER TABLE "GROUP_ROLES" ADD CONSTRAINT "PK_GROUP_ROLES" PRIMARY KEY("ID");
CREATE UNIQUE INDEX "UNIQ_GROUP_ROLES" ON "GROUP_ROLES"("ORGANIZATION_UUID", "GROUP_ID", "RESOURCE_ID", "ROLE");
-CREATE UNIQUE INDEX "GROUP_ROLES_UNIQ" ON "GROUP_ROLES"("ORGANIZATION_UUID", "GROUP_ID", "COMPONENT_UUID", "ROLE");
CREATE INDEX "GROUP_ROLES_RESOURCE" ON "GROUP_ROLES"("RESOURCE_ID");
CREATE INDEX "GROUP_ROLES_COMPONENT_UUID" ON "GROUP_ROLES"("COMPONENT_UUID");
diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromPropertiesTableTest/schema.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromPropertiesTableTest/schema.sql
index d6d9a54731d..529e0a0e1b2 100644
--- a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromPropertiesTableTest/schema.sql
+++ b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/DropResourceIdFromPropertiesTableTest/schema.sql
@@ -11,4 +11,3 @@ CREATE TABLE "PROPERTIES"(
);
ALTER TABLE "PROPERTIES" ADD CONSTRAINT "PK_PROPERTIES" PRIMARY KEY("ID");
CREATE INDEX "PROPERTIES_KEY" ON "PROPERTIES"("PROP_KEY");
-CREATE INDEX "PROPERTIES_COMPONENT_UUID" ON "PROPERTIES"("COMPONENT_UUID");
diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest/schema.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest/schema.sql
index ad5844e1bc9..aff8977ca26 100644
--- a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest/schema.sql
+++ b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v83/MigrateResourceIdToUuidInPropertiesTest/schema.sql
@@ -11,7 +11,6 @@ CREATE TABLE "PROPERTIES"(
);
ALTER TABLE "PROPERTIES" ADD CONSTRAINT "PK_PROPERTIES" PRIMARY KEY("ID");
CREATE INDEX "PROPERTIES_KEY" ON "PROPERTIES"("PROP_KEY");
-CREATE INDEX "PROPERTIES_COMPONENT_UUID" ON "PROPERTIES"("COMPONENT_UUID");
CREATE TABLE "COMPONENTS"(
"ID" INTEGER NOT NULL AUTO_INCREMENT (1,1),
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java
index 65fbc212a6d..5b31a34239c 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java
@@ -100,7 +100,7 @@ public class ProjectStatusAction implements QualityGatesWsAction {
action.createParam(PARAM_PROJECT_ID)
.setSince("5.4")
- .setDescription("Project id. Doesn't work with branches or pull requests")
+ .setDescription("Project UUID. Doesn't work with branches or pull requests")
.setExampleValue(Uuids.UUID_EXAMPLE_01);
action.createParam(PARAM_PROJECT_KEY)