@@ -38,7 +38,6 @@ import org.sonar.api.utils.log.Logger; | |||
import org.sonar.api.utils.log.Loggers; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.DialectUtils; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.profiling.NullConnectionInterceptor; | |||
import org.sonar.db.profiling.ProfiledConnectionInterceptor; | |||
import org.sonar.db.profiling.ProfiledDataSource; | |||
@@ -81,7 +80,6 @@ public class DefaultDatabase implements Database { | |||
@Override | |||
public void start() { | |||
initSettings(); | |||
failIfMySql(); | |||
try { | |||
initDataSource(); | |||
checkConnection(); | |||
@@ -98,21 +96,22 @@ public class DefaultDatabase implements Database { | |||
completeDefaultProperty(properties, JDBC_URL.getKey(), DEFAULT_URL); | |||
doCompleteProperties(properties); | |||
dialect = DialectUtils.find(properties.getProperty(SONAR_JDBC_DIALECT), properties.getProperty(JDBC_URL.getKey())); | |||
String jdbcUrl = properties.getProperty(JDBC_URL.getKey()); | |||
failIfMySql(jdbcUrl); | |||
dialect = DialectUtils.find(properties.getProperty(SONAR_JDBC_DIALECT), jdbcUrl); | |||
properties.setProperty(SONAR_JDBC_DRIVER, dialect.getDefaultDriverClassName()); | |||
} | |||
private void failIfMySql() { | |||
if (!MySql.ID.equals(dialect.getId())) { | |||
return; | |||
private static void failIfMySql(String jdbcUrl) { | |||
if (StringUtils.startsWithIgnoreCase(jdbcUrl, "jdbc:mysql")) { | |||
throw MessageException.of("\n" + | |||
"#############################################################################################################\n" + | |||
"# End of Life of MySQL Support : SonarQube 7.9 and future versions do not support MySQL. #\n" + | |||
"# Please migrate to a supported database. Get more details at #\n" + | |||
"# https://community.sonarsource.com/t/end-of-life-of-mysql-support #\n" + | |||
"# and https://github.com/SonarSource/mysql-migrator #\n" + | |||
"#############################################################################################################\n"); | |||
} | |||
throw MessageException.of("\n" + | |||
"#############################################################################################################\n" + | |||
"# End of Life of MySQL Support : SonarQube 7.9 and future versions do not support MySQL. #\n" + | |||
"# Please migrate to a supported database. Get more details at #\n" + | |||
"# https://community.sonarsource.com/t/end-of-life-of-mysql-support #\n" + | |||
"# and https://github.com/SonarSource/mysql-migrator #\n" + | |||
"#############################################################################################################\n"); | |||
} | |||
private void initDataSource() throws Exception { |
@@ -77,16 +77,6 @@ abstract class AbstractDialect implements Dialect { | |||
return Collections.emptyList(); | |||
} | |||
@Override | |||
public int getScrollDefaultFetchSize() { | |||
return 200; | |||
} | |||
@Override | |||
public int getScrollSingleRowFetchSize() { | |||
return 1; | |||
} | |||
@Override | |||
public boolean supportsUpsert() { | |||
return false; |
@@ -51,13 +51,9 @@ public interface Dialect { | |||
/** | |||
* Fetch size to be used when scrolling large result sets. | |||
*/ | |||
int getScrollDefaultFetchSize(); | |||
/** | |||
* Fetch size to scroll one row at a time. It sounds strange because obviously value is 1 in most cases, | |||
* but it's different on MySQL... | |||
*/ | |||
int getScrollSingleRowFetchSize(); | |||
default int getScrollDefaultFetchSize() { | |||
return 200; | |||
} | |||
/** | |||
* Indicates whether DB migration can be perform on the DB vendor implementation associated with the current dialect. |
@@ -29,7 +29,7 @@ import org.sonar.api.utils.MessageException; | |||
public final class DialectUtils { | |||
private static final Set<Supplier<Dialect>> DIALECTS = ImmutableSet.of(H2::new, MySql::new, Oracle::new, PostgreSql::new, MsSql::new); | |||
private static final Set<Supplier<Dialect>> DIALECTS = ImmutableSet.of(H2::new, Oracle::new, PostgreSql::new, MsSql::new); | |||
private DialectUtils() { | |||
// only static stuff |
@@ -1,65 +0,0 @@ | |||
/* | |||
* SonarQube | |||
* Copyright (C) 2009-2019 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.db.dialect; | |||
import java.sql.DatabaseMetaData; | |||
import java.sql.SQLException; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.sonar.api.utils.Version; | |||
public class MySql extends AbstractDialect { | |||
public static final String ID = "mysql"; | |||
private static final Version MIN_SUPPORTED_VERSION = Version.create(5, 6, 0); | |||
public MySql() { | |||
super(ID, "com.mysql.jdbc.Driver", "true", "false", "SELECT 1"); | |||
} | |||
@Override | |||
public boolean matchesJdbcUrl(String jdbcConnectionURL) { | |||
return StringUtils.startsWithIgnoreCase(jdbcConnectionURL, "jdbc:mysql:"); | |||
} | |||
@Override | |||
public int getScrollDefaultFetchSize() { | |||
return Integer.MIN_VALUE; | |||
} | |||
@Override | |||
public int getScrollSingleRowFetchSize() { | |||
return Integer.MIN_VALUE; | |||
} | |||
@Override | |||
public boolean supportsMigration() { | |||
return true; | |||
} | |||
@Override | |||
public String getSqlFromDual() { | |||
return "from dual"; | |||
} | |||
@Override | |||
public void init(DatabaseMetaData metaData) throws SQLException { | |||
checkDbVersion(metaData, MIN_SUPPORTED_VERSION); | |||
} | |||
} |
@@ -35,12 +35,10 @@ import org.dbunit.dataset.datatype.IDataTypeFactory; | |||
import org.dbunit.dataset.datatype.ToleratedDeltaMap; | |||
import org.dbunit.ext.h2.H2DataTypeFactory; | |||
import org.dbunit.ext.mssql.MsSqlDataTypeFactory; | |||
import org.dbunit.ext.mysql.MySqlDataTypeFactory; | |||
import org.dbunit.ext.oracle.Oracle10DataTypeFactory; | |||
import org.dbunit.ext.postgresql.PostgresqlDataTypeFactory; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
import org.sonar.db.version.SqTables; | |||
@@ -74,7 +72,6 @@ public abstract class DatabaseCommands { | |||
DatabaseCommands command = ImmutableMap.of( | |||
org.sonar.db.dialect.H2.ID, H2, | |||
MsSql.ID, MSSQL, | |||
MySql.ID, MYSQL, | |||
Oracle.ID, ORACLE, | |||
PostgreSql.ID, POSTGRESQL).get(dialect.getId()); | |||
@@ -132,17 +129,6 @@ public abstract class DatabaseCommands { | |||
} | |||
}; | |||
private static final DatabaseCommands MYSQL = new DatabaseCommands(new MySqlDataTypeFactory()) { | |||
@Override | |||
public void resetPrimaryKeys(DataSource dataSource) { | |||
} | |||
@Override | |||
List<String> resetSequenceSql(String table, int minSequenceValue) { | |||
return null; | |||
} | |||
}; | |||
public void truncateDatabase(DataSource dataSource) throws SQLException { | |||
Connection connection = dataSource.getConnection(); | |||
Statement statement = null; |
@@ -39,7 +39,7 @@ public class DdlUtilsTest { | |||
@Test | |||
public void shouldSupportOnlyH2() { | |||
Assertions.assertThat(DdlUtils.supportsDialect("h2")).isTrue(); | |||
assertThat(DdlUtils.supportsDialect("mysql")).isFalse(); | |||
assertThat(DdlUtils.supportsDialect("postgresql")).isFalse(); | |||
assertThat(DdlUtils.supportsDialect("oracle")).isFalse(); | |||
assertThat(DdlUtils.supportsDialect("mssql")).isFalse(); | |||
} |
@@ -28,14 +28,14 @@ public class DialectUtilsTest { | |||
@Test | |||
public void testFindById() { | |||
Dialect d = DialectUtils.find("mysql", null); | |||
assertThat(d).isInstanceOf(MySql.class); | |||
Dialect d = DialectUtils.find("postgresql", null); | |||
assertThat(d).isInstanceOf(PostgreSql.class); | |||
} | |||
@Test | |||
public void testFindByJdbcUrl() { | |||
Dialect d = DialectUtils.find(null, "jdbc:mysql:foo:bar"); | |||
assertThat(d).isInstanceOf(MySql.class); | |||
Dialect d = DialectUtils.find(null, "jdbc:postgresql:foo:bar"); | |||
assertThat(d).isInstanceOf(PostgreSql.class); | |||
} | |||
@Test(expected = MessageException.class) |
@@ -43,7 +43,6 @@ public class MsSqlTest { | |||
assertThat(underTest.matchesJdbcUrl("jdbc:sqlserver://localhost:1433;databasename=sonar")).isTrue(); | |||
assertThat(underTest.matchesJdbcUrl("jdbc:hsql:foo")).isFalse(); | |||
assertThat(underTest.matchesJdbcUrl("jdbc:mysql:foo")).isFalse(); | |||
} | |||
@Test |
@@ -1,108 +0,0 @@ | |||
/* | |||
* SonarQube | |||
* Copyright (C) 2009-2019 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.db.dialect; | |||
import java.sql.DatabaseMetaData; | |||
import java.sql.SQLException; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.mockito.Mockito; | |||
import org.sonar.api.utils.MessageException; | |||
import org.sonar.api.utils.log.LogTester; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Mockito.mock; | |||
import static org.mockito.Mockito.when; | |||
public class MySqlTest { | |||
@Rule | |||
public ExpectedException expectedException = ExpectedException.none(); | |||
@Rule | |||
public LogTester logs = new LogTester(); | |||
private MySql underTest = new MySql(); | |||
@Test | |||
public void matchesJdbcURL() { | |||
assertThat(underTest.matchesJdbcUrl("jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8")).isTrue(); | |||
assertThat(underTest.matchesJdbcUrl("JDBC:MYSQL://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8")).isTrue(); | |||
assertThat(underTest.matchesJdbcUrl("jdbc:hsql:foo")).isFalse(); | |||
assertThat(underTest.matchesJdbcUrl("jdbc:oracle:foo")).isFalse(); | |||
} | |||
@Test | |||
public void testBooleanSqlValues() { | |||
assertThat(underTest.getTrueSqlValue()).isEqualTo("true"); | |||
assertThat(underTest.getFalseSqlValue()).isEqualTo("false"); | |||
} | |||
@Test | |||
public void should_configure() { | |||
assertThat(underTest.getId()).isEqualTo("mysql"); | |||
assertThat(underTest.getDefaultDriverClassName()).isEqualTo("com.mysql.jdbc.Driver"); | |||
assertThat(underTest.getValidationQuery()).isEqualTo("SELECT 1"); | |||
} | |||
@Test | |||
public void testFetchSizeForScrolling() { | |||
assertThat(underTest.getScrollDefaultFetchSize()).isEqualTo(Integer.MIN_VALUE); | |||
assertThat(underTest.getScrollSingleRowFetchSize()).isEqualTo(Integer.MIN_VALUE); | |||
} | |||
@Test | |||
public void mysql_does_supportMigration() { | |||
assertThat(underTest.supportsMigration()).isTrue(); | |||
} | |||
@Test | |||
public void getSqlFromDual() { | |||
assertThat(underTest.getSqlFromDual()).isEqualTo("from dual"); | |||
} | |||
@Test | |||
public void init_throws_MessageException_if_mysql_5_5() throws Exception { | |||
expectedException.expect(MessageException.class); | |||
expectedException.expectMessage("Unsupported mysql version: 5.5. Minimal supported version is 5.6."); | |||
DatabaseMetaData metadata = newMetadata(5, 5); | |||
underTest.init(metadata); | |||
} | |||
@Test | |||
public void init_does_not_fail_if_mysql_5_6() throws Exception { | |||
DatabaseMetaData metadata = newMetadata(5, 6); | |||
underTest.init(metadata); | |||
} | |||
@Test | |||
public void supportsUpsert_returns_false() { | |||
assertThat(underTest.supportsUpsert()).isFalse(); | |||
} | |||
private DatabaseMetaData newMetadata(int dbMajorVersion, int dbMinorVersion) throws SQLException { | |||
DatabaseMetaData metadata = mock(DatabaseMetaData.class, Mockito.RETURNS_DEEP_STUBS); | |||
when(metadata.getDatabaseMajorVersion()).thenReturn(dbMajorVersion); | |||
when(metadata.getDatabaseMinorVersion()).thenReturn(dbMinorVersion); | |||
return metadata; | |||
} | |||
} |
@@ -56,7 +56,6 @@ public class OracleTest { | |||
@Test | |||
public void testFetchSizeForScrolling() { | |||
assertThat(underTest.getScrollDefaultFetchSize()).isEqualTo(200); | |||
assertThat(underTest.getScrollSingleRowFetchSize()).isEqualTo(1); | |||
} | |||
@Test |
@@ -318,14 +318,6 @@ public class MyBatis implements Startable { | |||
return newScrollingSelectStatement(session, sql, fetchSize); | |||
} | |||
/** | |||
* Create a PreparedStatement for SELECT requests with scrolling of results row by row (only one row | |||
* in memory at a time) | |||
*/ | |||
public PreparedStatement newScrollingSingleRowSelectStatement(DbSession session, String sql) { | |||
int fetchSize = database.getDialect().getScrollSingleRowFetchSize(); | |||
return newScrollingSelectStatement(session, sql, fetchSize); | |||
} | |||
private static PreparedStatement newScrollingSelectStatement(DbSession session, String sql, int fetchSize) { | |||
try { |
@@ -226,10 +226,6 @@ public class ComponentDao implements Dao { | |||
return executeLargeInputs(allKeys, subKeys -> mapper(session).selectByKeysAndBranch(subKeys, pullRequestId)); | |||
} | |||
public List<ComponentDto> selectComponentsHavingSameKeyOrderedById(DbSession session, String key) { | |||
return mapper(session).selectComponentsHavingSameKeyOrderedById(key); | |||
} | |||
/** | |||
* List of ancestors, ordered from root to parent. The list is empty | |||
* if the component is a tree root. Disabled components are excluded by design |
@@ -142,8 +142,6 @@ public interface ComponentMapper { | |||
long countGhostProjects(@Param("organizationUuid") String organizationUuid, @Nullable @Param("query") String query); | |||
List<ComponentDto> selectComponentsHavingSameKeyOrderedById(String key); | |||
List<ComponentDto> selectProjectsByNameQuery(@Param("nameQuery") @Nullable String nameQuery, @Param("includeModules") boolean includeModules); | |||
void scrollForIndexing(@Param("projectUuid") @Nullable String projectUuid, ResultHandler<ComponentDto> handler); |
@@ -57,14 +57,6 @@ | |||
and pb.branch_type='PULL_REQUEST' | |||
</select> | |||
<select id="selectComponentsHavingSameKeyOrderedById" parameterType="String" resultType="Component"> | |||
select | |||
<include refid="componentColumns"/> | |||
from projects p | |||
where p.kee=#{key,jdbcType=VARCHAR} | |||
order BY p.id ASC | |||
</select> | |||
<select id="selectById" parameterType="long" resultType="Component"> | |||
SELECT | |||
<include refid="componentColumns"/> |
@@ -1,70 +0,0 @@ | |||
/* | |||
* SonarQube | |||
* Copyright (C) 2009-2019 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.db.component; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.DbTester; | |||
import org.sonar.db.organization.OrganizationDto; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
/** | |||
* On H2, the index on PROJECTS.KEE is unique. In order to simulate the MySQL behaviour where the index is not unique, | |||
* we need to create a schema where there's no unique index on PROJECTS.KEE | |||
*/ | |||
public class ComponentDaoWithDuplicatedKeysTest { | |||
private static final String PROJECT_KEY = "PROJECT_KEY"; | |||
@Rule | |||
public DbTester db = DbTester.createForSchema(System2.INSTANCE, ComponentDaoWithDuplicatedKeysTest.class, "schema.sql"); | |||
private DbClient dbClient = db.getDbClient(); | |||
private DbSession dbSession = db.getSession(); | |||
private ComponentDao underTest = new ComponentDao(); | |||
@Test | |||
public void select_components_having_same_key() { | |||
OrganizationDto organizationDto = db.organizations().insert(); | |||
insertProject(ComponentTesting.newPrivateProjectDto(organizationDto).setDbKey(PROJECT_KEY)); | |||
insertProject(ComponentTesting.newPrivateProjectDto(organizationDto).setDbKey(PROJECT_KEY)); | |||
insertProject(ComponentTesting.newPrivateProjectDto(organizationDto).setDbKey(PROJECT_KEY)); | |||
insertProject(ComponentTesting.newPrivateProjectDto(organizationDto).setDbKey("ANOTHER_PROJECT_KEY")); | |||
assertThat(underTest.selectComponentsHavingSameKeyOrderedById(db.getSession(), PROJECT_KEY)).hasSize(3); | |||
} | |||
@Test | |||
public void return_nothing() { | |||
assertThat(underTest.selectComponentsHavingSameKeyOrderedById(db.getSession(), PROJECT_KEY)).isEmpty(); | |||
} | |||
private ComponentDto insertProject(ComponentDto project) { | |||
dbClient.componentDao().insert(dbSession, project); | |||
dbSession.commit(); | |||
return project; | |||
} | |||
} |
@@ -1,63 +0,0 @@ | |||
CREATE TABLE "ORGANIZATIONS" ( | |||
"UUID" VARCHAR(40) NOT NULL PRIMARY KEY, | |||
"KEE" VARCHAR(32) NOT NULL, | |||
"NAME" VARCHAR(64) NOT NULL, | |||
"DESCRIPTION" VARCHAR(256), | |||
"URL" VARCHAR(256), | |||
"AVATAR_URL" VARCHAR(256), | |||
"NEW_PROJECT_PRIVATE" BOOLEAN, | |||
"USER_ID" BIGINT, | |||
"GUARDED" BOOLEAN NOT NULL, | |||
"DEFAULT_QUALITY_GATE_UUID" VARCHAR(40) NOT NULL, | |||
"SUBSCRIPTION" VARCHAR(40), | |||
"CREATED_AT" BIGINT NOT NULL, | |||
"UPDATED_AT" BIGINT NOT NULL | |||
); | |||
CREATE UNIQUE INDEX "PK_ORGANIZATIONS" ON "ORGANIZATIONS" ("UUID"); | |||
CREATE UNIQUE INDEX "ORGANIZATION_KEY" ON "ORGANIZATIONS" ("KEE"); | |||
CREATE TABLE "PROJECTS" ( | |||
"ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), | |||
"KEE" VARCHAR(400), | |||
"ORGANIZATION_UUID" VARCHAR(40) NOT NULL, | |||
"UUID" VARCHAR(50) NOT NULL, | |||
"UUID_PATH" VARCHAR(1500) NOT NULL, | |||
"ROOT_UUID" VARCHAR(50) NOT NULL, | |||
"PROJECT_UUID" VARCHAR(50), | |||
"MODULE_UUID" VARCHAR(50), | |||
"MODULE_UUID_PATH" VARCHAR(1500), | |||
"MAIN_BRANCH_PROJECT_UUID" VARCHAR(50), | |||
"NAME" VARCHAR(2000), | |||
"DESCRIPTION" VARCHAR(2000), | |||
"PRIVATE" BOOLEAN NOT NULL, | |||
"TAGS" VARCHAR(4000), | |||
"ENABLED" BOOLEAN NOT NULL DEFAULT TRUE, | |||
"SCOPE" VARCHAR(3), | |||
"QUALIFIER" VARCHAR(10), | |||
"DEPRECATED_KEE" VARCHAR(400), | |||
"PATH" VARCHAR(2000), | |||
"LANGUAGE" VARCHAR(20), | |||
"COPY_COMPONENT_UUID" VARCHAR(50), | |||
"LONG_NAME" VARCHAR(2000), | |||
"DEVELOPER_UUID" VARCHAR(50), | |||
"CREATED_AT" TIMESTAMP, | |||
"AUTHORIZATION_UPDATED_AT" BIGINT, | |||
"B_CHANGED" BOOLEAN, | |||
"B_COPY_COMPONENT_UUID" VARCHAR(50), | |||
"B_DESCRIPTION" VARCHAR(2000), | |||
"B_ENABLED" BOOLEAN, | |||
"B_UUID_PATH" VARCHAR(1500), | |||
"B_LANGUAGE" VARCHAR(20), | |||
"B_LONG_NAME" VARCHAR(500), | |||
"B_MODULE_UUID" VARCHAR(50), | |||
"B_MODULE_UUID_PATH" VARCHAR(1500), | |||
"B_NAME" VARCHAR(500), | |||
"B_PATH" VARCHAR(2000), | |||
"B_QUALIFIER" VARCHAR(10) | |||
); | |||
CREATE INDEX "PROJECTS_KEE" ON "PROJECTS" ("KEE"); | |||
CREATE INDEX "PROJECTS_ROOT_UUID" ON "PROJECTS" ("ROOT_UUID"); | |||
CREATE UNIQUE INDEX "PROJECTS_UUID" ON "PROJECTS" ("UUID"); | |||
CREATE INDEX "PROJECTS_PROJECT_UUID" ON "PROJECTS" ("PROJECT_UUID"); | |||
CREATE INDEX "PROJECTS_MODULE_UUID" ON "PROJECTS" ("MODULE_UUID"); | |||
CREATE INDEX "PROJECTS_QUALIFIER" ON "PROJECTS" ("QUALIFIER"); |
@@ -27,15 +27,14 @@ 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.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
/** | |||
* On fresh installations, checks that all db columns are UTF8. On all installations on MySQL or MSSQL, | |||
* On fresh installations, checks that all db columns are UTF8. On MSSQL, | |||
* whatever fresh or upgrade, fixes case-insensitive columns by converting them to | |||
* case-sensitive. | |||
* | |||
* <p> | |||
* See SONAR-6171 and SONAR-7549 | |||
*/ | |||
public class DatabaseCharsetChecker { | |||
@@ -79,8 +78,6 @@ public class DatabaseCharsetChecker { | |||
return new OracleCharsetHandler(sqlExecutor); | |||
case PostgreSql.ID: | |||
return new PostgresCharsetHandler(sqlExecutor, new PostgresMetadataReader(sqlExecutor)); | |||
case MySql.ID: | |||
return new MysqlCharsetHandler(sqlExecutor); | |||
case MsSql.ID: | |||
return new MssqlCharsetHandler(sqlExecutor, new MssqlMetadataReader(sqlExecutor)); | |||
default: |
@@ -1,91 +0,0 @@ | |||
/* | |||
* SonarQube | |||
* Copyright (C) 2009-2019 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.charset; | |||
import java.sql.Connection; | |||
import java.sql.SQLException; | |||
import java.util.List; | |||
import java.util.stream.Collectors; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.sonar.api.utils.log.Logger; | |||
import org.sonar.api.utils.log.Loggers; | |||
import static java.lang.String.format; | |||
import static org.apache.commons.lang.StringUtils.endsWithIgnoreCase; | |||
class MysqlCharsetHandler extends CharsetHandler { | |||
private static final Logger LOGGER = Loggers.get(MysqlCharsetHandler.class); | |||
private static final String TYPE_LONGTEXT = "longtext"; | |||
MysqlCharsetHandler(SqlExecutor selectExecutor) { | |||
super(selectExecutor); | |||
} | |||
@Override | |||
void handle(Connection connection, DatabaseCharsetChecker.State state) throws SQLException { | |||
// all the VARCHAR columns have always been created with UTF8 charset on mysql | |||
// (since SonarQube 2.12 to be precise). The default charset does not require | |||
// to be UTF8. It is not used. No need to verify it. | |||
// Still if a column has been accidentally created with a case-insensitive collation, | |||
// then we can repair it by moving to the same case-sensitive collation. That should | |||
// never occur. | |||
if (state == DatabaseCharsetChecker.State.UPGRADE) { | |||
repairCaseInsensitiveColumns(connection); | |||
} | |||
} | |||
private void repairCaseInsensitiveColumns(Connection connection) throws SQLException { | |||
// All VARCHAR columns are returned. No need to check database general collation. | |||
// Example of row: | |||
// issues | kee | utf8 | utf8_bin | |||
List<ColumnDef> columns = getSqlExecutor().select(connection, | |||
ColumnDef.SELECT_COLUMNS + | |||
"FROM INFORMATION_SCHEMA.columns " + | |||
"WHERE table_schema=database() and character_set_name is not null and collation_name is not null", | |||
ColumnDef.ColumnDefRowConverter.INSTANCE); | |||
List<ColumnDef> invalidColumns = columns.stream() | |||
.filter(ColumnDef::isInSonarQubeTable) | |||
.filter(column -> endsWithIgnoreCase(column.getCollation(), "_ci")) | |||
.collect(Collectors.toList()); | |||
for (ColumnDef column : invalidColumns) { | |||
repairCaseInsensitiveColumn(connection, column); | |||
} | |||
} | |||
private void repairCaseInsensitiveColumn(Connection connection, ColumnDef column) | |||
throws SQLException { | |||
String csCollation = toCaseSensitive(column.getCollation()); | |||
String nullability = column.isNullable() ? "NULL" : "NOT NULL"; | |||
String type = column.getDataType().equalsIgnoreCase(TYPE_LONGTEXT) ? TYPE_LONGTEXT : format("%s(%d)", column.getDataType(), column.getSize()); | |||
String alterSql = format("ALTER TABLE %s MODIFY %s %s CHARACTER SET '%s' COLLATE '%s' %s", | |||
column.getTable(), column.getColumn(), type, column.getCharset(), csCollation, nullability); | |||
LOGGER.info("Changing collation of column [{}.{}] from {} to {} | sql={}", column.getTable(), column.getColumn(), column.getCollation(), csCollation, alterSql); | |||
getSqlExecutor().executeDdl(connection, alterSql); | |||
} | |||
private static String toCaseSensitive(String caseInsensitiveCollation) { | |||
// Example: big5_chinese_ci becomes big5_bin | |||
// Full list of collations is available with SQL request "show collation" | |||
return StringUtils.substringBefore(caseInsensitiveCollation, "_") + "_bin"; | |||
} | |||
} |
@@ -24,7 +24,6 @@ import javax.annotation.concurrent.Immutable; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -41,8 +40,6 @@ public class BlobColumnDef extends AbstractColumnDef { | |||
switch (dialect.getId()) { | |||
case MsSql.ID: | |||
return "VARBINARY(MAX)"; | |||
case MySql.ID: | |||
return "LONGBLOB"; | |||
case Oracle.ID: | |||
case H2.ID: | |||
return "BLOB"; |
@@ -24,7 +24,6 @@ import javax.annotation.concurrent.Immutable; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -54,8 +53,6 @@ public class BooleanColumnDef extends AbstractColumnDef { | |||
return "NUMBER(1)"; | |||
case MsSql.ID: | |||
return "BIT"; | |||
case MySql.ID: | |||
return "TINYINT(1)"; | |||
default: | |||
throw new UnsupportedOperationException(String.format("Unknown dialect '%s'", dialect.getId())); | |||
} |
@@ -23,7 +23,6 @@ import javax.annotation.concurrent.Immutable; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -48,8 +47,6 @@ public class ClobColumnDef extends AbstractColumnDef { | |||
switch (dialect.getId()) { | |||
case MsSql.ID: | |||
return "NVARCHAR (MAX)"; | |||
case MySql.ID: | |||
return "LONGTEXT"; | |||
case Oracle.ID: | |||
return "CLOB"; | |||
case H2.ID: |
@@ -24,7 +24,6 @@ import javax.annotation.concurrent.Immutable; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -63,7 +62,6 @@ public class DecimalColumnDef extends AbstractColumnDef { | |||
case PostgreSql.ID: | |||
case Oracle.ID: | |||
return String.format("NUMERIC (%s,%s)", precision, scale); | |||
case MySql.ID: | |||
case MsSql.ID: | |||
return String.format("DECIMAL (%s,%s)", precision, scale); | |||
case H2.ID: |
@@ -25,7 +25,6 @@ import javax.annotation.concurrent.Immutable; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -46,7 +45,6 @@ public class IntegerColumnDef extends AbstractColumnDef { | |||
public String generateSqlType(Dialect dialect) { | |||
switch (dialect.getId()) { | |||
case PostgreSql.ID: | |||
case MySql.ID: | |||
case H2.ID: | |||
return "INTEGER"; | |||
case MsSql.ID: |
@@ -23,7 +23,6 @@ import javax.annotation.concurrent.Immutable; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -33,8 +32,7 @@ import static org.sonar.server.platform.db.migration.def.Validations.validateCol | |||
* Used to define TIMESTAMP columns. | |||
* | |||
* @deprecated implemented for compatibility with old tables, but {@link BigIntegerColumnDef} | |||
* must be used for storing datetimes as bigints (no problems regarding timezone | |||
* nor MySQL precision). | |||
* must be used for storing datetimes as bigints (no problems regarding timezone). | |||
*/ | |||
@Immutable | |||
@Deprecated | |||
@@ -52,7 +50,6 @@ public class TimestampColumnDef extends AbstractColumnDef { | |||
public String generateSqlType(Dialect dialect) { | |||
switch (dialect.getId()) { | |||
case MsSql.ID: | |||
case MySql.ID: | |||
return "DATETIME"; | |||
case Oracle.ID: | |||
return "TIMESTAMP (6)"; |
@@ -24,7 +24,6 @@ import javax.annotation.concurrent.Immutable; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -51,9 +50,6 @@ public class TinyIntColumnDef extends AbstractColumnDef { | |||
return "SMALLINT"; | |||
case Oracle.ID: | |||
return "NUMBER(3)"; | |||
case MySql.ID: | |||
// do not use TINYINT(1) as it's considered as booleans by connector/J. | |||
return "TINYINT(2)"; | |||
case MsSql.ID: | |||
case H2.ID: | |||
return "TINYINT"; |
@@ -24,7 +24,6 @@ import java.util.Collections; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
import org.sonar.server.platform.db.migration.def.ColumnDef; | |||
@@ -70,8 +69,6 @@ public class AlterColumnsBuilder { | |||
switch (dialect.getId()) { | |||
case PostgreSql.ID: | |||
return createPostgresQuery(); | |||
case MySql.ID: | |||
return createMySqlQuery(); | |||
case Oracle.ID: | |||
return createOracleQuery(); | |||
default: | |||
@@ -96,12 +93,6 @@ public class AlterColumnsBuilder { | |||
return Collections.singletonList(sql.toString()); | |||
} | |||
private List<String> createMySqlQuery() { | |||
StringBuilder sql = new StringBuilder(ALTER_TABLE + tableName + " "); | |||
addColumns(sql, "MODIFY COLUMN ", "", true); | |||
return Collections.singletonList(sql.toString()); | |||
} | |||
private List<String> createOracleQuery() { | |||
List<String> sqls = new ArrayList<>(); | |||
for (ColumnDef columnDef : columnDefs) { |
@@ -22,10 +22,7 @@ package org.sonar.server.platform.db.migration.sql; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.stream.Collectors; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.server.platform.db.migration.def.ColumnDef; | |||
import org.sonar.server.platform.db.migration.def.VarcharColumnDef; | |||
import static com.google.common.base.Preconditions.checkArgument; | |||
import static java.util.Collections.singletonList; | |||
@@ -35,18 +32,11 @@ import static org.sonar.server.platform.db.migration.def.Validations.validateTab | |||
public class CreateIndexBuilder { | |||
private static final int MAX_LENGTH_ON_MYSQL = 255; | |||
private final Dialect dialect; | |||
private final List<ColumnDef> columns = new ArrayList<>(); | |||
private String tableName; | |||
private String indexName; | |||
private boolean unique = false; | |||
public CreateIndexBuilder(Dialect dialect) { | |||
this.dialect = dialect; | |||
} | |||
/** | |||
* Required name of table on which index is created | |||
*/ | |||
@@ -100,22 +90,8 @@ public class CreateIndexBuilder { | |||
sql.append(" ON "); | |||
sql.append(tableName); | |||
sql.append(" ("); | |||
sql.append(columns.stream().map(this::columnSql).collect(Collectors.joining(", "))); | |||
sql.append(columns.stream().map(ColumnDef::getName).collect(Collectors.joining(", "))); | |||
sql.append(")"); | |||
return sql.toString(); | |||
} | |||
private String columnSql(ColumnDef column) { | |||
String length = ""; | |||
// Index of varchar column is limited to 767 bytes on mysql (<= 255 UTF-8 characters) | |||
// See http://jira.sonarsource.com/browse/SONAR-4137 and | |||
// http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html | |||
if (dialect.getId().equals(MySql.ID) && column instanceof VarcharColumnDef) { | |||
VarcharColumnDef varcharColumn = (VarcharColumnDef) column; | |||
if (varcharColumn.getColumnSize() > MAX_LENGTH_ON_MYSQL) { | |||
length = "(" + MAX_LENGTH_ON_MYSQL + ")"; | |||
} | |||
} | |||
return column.getName() + length; | |||
} | |||
} |
@@ -37,7 +37,6 @@ import org.sonar.db.DatabaseUtils; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
import org.sonar.server.platform.db.migration.def.BigIntegerColumnDef; | |||
@@ -127,7 +126,6 @@ public class CreateTableBuilder { | |||
appendColumns(res, dialect, columnDefs); | |||
appendPkConstraint(res); | |||
res.append(')'); | |||
appendCollationClause(res, dialect); | |||
return res.toString(); | |||
} | |||
@@ -212,9 +210,6 @@ public class CreateTableBuilder { | |||
case MsSql.ID: | |||
res.append(" IDENTITY (1,1)"); | |||
break; | |||
case MySql.ID: | |||
res.append(" AUTO_INCREMENT"); | |||
break; | |||
case H2.ID: | |||
res.append(" AUTO_INCREMENT (1,1)"); | |||
break; | |||
@@ -255,12 +250,6 @@ public class CreateTableBuilder { | |||
} | |||
} | |||
private static void appendCollationClause(StringBuilder res, Dialect dialect) { | |||
if (MySql.ID.equals(dialect.getId())) { | |||
res.append(" ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin"); | |||
} | |||
} | |||
private Stream<String> createOracleAutoIncrementStatements() { | |||
if (!Oracle.ID.equals(dialect.getId())) { | |||
return Stream.empty(); |
@@ -27,7 +27,6 @@ import org.sonar.core.util.stream.MoreCollectors; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -51,7 +50,6 @@ public class DropColumnsBuilder { | |||
public List<String> build() { | |||
switch (dialect.getId()) { | |||
case PostgreSql.ID: | |||
case MySql.ID: | |||
StringBuilder sql = new StringBuilder().append(ALTER_TABLE).append(tableName).append(" "); | |||
dropColumns(sql, "DROP COLUMN ", columns); | |||
return Collections.singletonList(sql.toString()); |
@@ -27,7 +27,6 @@ import org.sonar.db.DatabaseUtils; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -64,7 +63,6 @@ public class DropIndexBuilder { | |||
private String createSqlStatement() { | |||
switch (dialect.getId()) { | |||
case MsSql.ID: | |||
case MySql.ID: | |||
return "DROP INDEX " + indexName + " ON " + tableName; | |||
case Oracle.ID: | |||
return "DROP INDEX " + indexName; |
@@ -23,7 +23,6 @@ import java.util.List; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -47,7 +46,6 @@ public class DropTableBuilder { | |||
case Oracle.ID: | |||
return forOracle(tableName); | |||
case H2.ID: | |||
case MySql.ID: | |||
case PostgreSql.ID: | |||
return singletonList("drop table if exists " + tableName); | |||
case MsSql.ID: |
@@ -26,7 +26,6 @@ import javax.annotation.CheckForNull; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
import org.sonar.server.platform.db.migration.def.ColumnDef; | |||
@@ -37,9 +36,7 @@ import static org.sonar.server.platform.db.migration.def.Validations.validateTab | |||
/** | |||
* This builder have the main goal to change the name column. | |||
* | |||
* For MySQL the column definition is mandatory, however the change of column | |||
* is not supported on this class. | |||
* <p> | |||
* In case of renaming and changing a column, this must be done in two separate steps, | |||
* first rename the column then update the types of this column with @see {@link AlterColumnsBuilder} | |||
*/ | |||
@@ -79,8 +76,6 @@ public class RenameColumnsBuilder { | |||
case Oracle.ID: | |||
case PostgreSql.ID: | |||
return "ALTER TABLE " + tableName + " RENAME COLUMN " + r.getOldColumnName() + " TO " + r.getNewColumnName(); | |||
case MySql.ID: | |||
return "ALTER TABLE " + tableName + " CHANGE " + r.getOldColumnName() + " " + r.getNewColumnName() + " " + r.generateSqlType(dialect); | |||
case MsSql.ID: | |||
return "EXEC sp_rename '" + tableName + "." + r.getOldColumnName() + "', '" + r.getNewColumnName() + "', 'COLUMN'"; | |||
default: |
@@ -23,7 +23,6 @@ import java.util.List; | |||
import org.sonar.db.dialect.Dialect; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
@@ -75,7 +74,6 @@ public class RenameTableBuilder { | |||
private List<String> createSqlStatement() { | |||
switch (dialect.getId()) { | |||
case H2.ID: | |||
case MySql.ID: | |||
case PostgreSql.ID: | |||
return singletonList("ALTER TABLE " + name + " RENAME TO " + newName); | |||
case MsSql.ID: |
@@ -904,7 +904,7 @@ public class CreateInitialSchema extends DdlChange { | |||
} | |||
private void addIndex(Context context, String table, String index, boolean unique, ColumnDef... columns) throws SQLException { | |||
CreateIndexBuilder builder = new CreateIndexBuilder(getDialect()) | |||
CreateIndexBuilder builder = new CreateIndexBuilder() | |||
.setTable(table) | |||
.setName(index) | |||
.setUnique(unique); |
@@ -36,7 +36,7 @@ public class AddIndexOnAnalysisUuidOfMeasures extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
// this index must be present for the performance of next migration | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("project_measures") | |||
.setName("measures_analysis_metric") | |||
.addColumn(newVarcharColumnDefBuilder().setColumnName("analysis_uuid").setLimit(50).setIgnoreOracleUnit(true).build()) |
@@ -34,7 +34,7 @@ public class AddIndexOnComponentUuidOfMeasures extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("project_measures") | |||
.setName("measures_component_uuid") | |||
.addColumn(newVarcharColumnDefBuilder().setColumnName("component_uuid").setLimit(50).setIgnoreOracleUnit(true).build()) |
@@ -34,7 +34,7 @@ public class AddUniqueIndexOnUuidOfSnapshots extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("snapshots") | |||
.setName("analyses_uuid") | |||
.addColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setLimit(50).setIgnoreOracleUnit(true).build()) |
@@ -55,7 +55,7 @@ public class CreatePermTemplatesCharacteristics extends DdlChange { | |||
.addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build()) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("uniq_perm_tpl_charac") | |||
.setUnique(true) |
@@ -37,12 +37,12 @@ public class CreateTemporaryIndicesFor1211 extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("ce_activity") | |||
.setName(INDEX_ON_CE_ACTIVITY) | |||
.addColumn(newIntegerColumnDefBuilder().setColumnName("snapshot_id").build()) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("duplications_index") | |||
.setName(INDEX_ON_DUPLICATIONS_INDEX) | |||
.addColumn(newIntegerColumnDefBuilder().setColumnName("project_snapshot_id").build()) |
@@ -49,7 +49,7 @@ public class MakeAnalysisUuidNotNullOnEvents extends DdlChange { | |||
.updateColumn(analysisUuidColumn) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_EVENTS) | |||
.setName("events_analysis") | |||
.addColumn(analysisUuidColumn) |
@@ -46,7 +46,7 @@ public class MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndex extends | |||
.updateColumn(analysisUuid) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_DUPLICATIONS_INDEX) | |||
.setName("duplication_analysis_component") | |||
.addColumn(analysisUuid) |
@@ -46,12 +46,12 @@ public class MakeComponentUuidColumnsNotNullOnSnapshots extends DdlChange { | |||
.updateColumn(rootComponentUuid) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_SNAPSHOTS) | |||
.setName("snapshot_component") | |||
.addColumn(componentUuid) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_SNAPSHOTS) | |||
.setName("snapshot_root_component") | |||
.addColumn(rootComponentUuid) |
@@ -45,7 +45,7 @@ public class MakeUuidColumnsNotNullOnProjects extends DdlChange { | |||
.updateColumn(rootUuid) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_PROJECTS) | |||
.setName("projects_root_uuid") | |||
.addColumn(rootUuid) |
@@ -34,7 +34,7 @@ public class RecreateIndexProjectsUuidFromProjects extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("projects") | |||
.setName("projects_uuid") | |||
.addColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setLimit(50).setIgnoreOracleUnit(true).build()) |
@@ -60,7 +60,7 @@ public class CreateTableProperties2 extends DdlChange { | |||
.build(); | |||
context.execute(stmts); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("properties2_key") | |||
.addColumn(propKey) |
@@ -46,7 +46,7 @@ public class RenameTableProperties2ToProperties extends DdlChange { | |||
.setNewName("properties") | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("properties") | |||
.setName("properties_key") | |||
.addColumn(newVarcharColumnDefBuilder().setColumnName("prop_key").setLimit(512).setIsNullable(false).setIgnoreOracleUnit(true).build()) |
@@ -53,7 +53,7 @@ public class CreateTableOrganizations extends DdlChange { | |||
.addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build()) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("organization_key") | |||
.addColumn(keeColumn) |
@@ -62,13 +62,13 @@ public class CreateTableWebhookDeliveries extends DdlChange { | |||
.build()); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("component_uuid") | |||
.addColumn(componentUuidColumn) | |||
.build()); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("ce_task_uuid") | |||
.addColumn(ceTaskUuidColumn) |
@@ -43,7 +43,7 @@ public class IncludeOrganizationUuidInUniqueIndexOfGroupRoles extends DdlChange | |||
.setName("uniq_group_roles") | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_GROUP_ROLES) | |||
.setName("uniq_group_roles") | |||
.setUnique(true) |
@@ -34,7 +34,7 @@ public class AddIndexOnOrganizationUuidOfProjects extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("projects") | |||
.setName("projects_organization") | |||
.addColumn(newVarcharColumnDefBuilder() |
@@ -50,7 +50,7 @@ public class DropTableResourceIndex extends DdlChange { | |||
// introduced in 6.0, has been dropped in 6.7 for performance reasons. There was no need to | |||
// alter the table resource_index while it's dropped later in 6.3. | |||
// As a consequence this index may not exist when upgrading from 6.1+. | |||
// Note that the "delete index if exists" is still not supported by MySQL, Oracle and MSSQL < 2016, | |||
// Note that the "delete index if exists" is still not supported by Oracle and MSSQL < 2016, | |||
// that's why an exception is raised if the index does not exist. | |||
} | |||
@@ -43,7 +43,7 @@ public class MakeIndexOnOrganizationsKeeUnique extends DdlChange { | |||
.setName(INDEX_NAME) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_ORGANIZATIONS) | |||
.setName(INDEX_NAME) | |||
.addColumn(newVarcharColumnDefBuilder() |
@@ -44,7 +44,7 @@ public class MakeUuidNotNullOnEvents extends DdlChange { | |||
.updateColumn(uuidColumn) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE) | |||
.setName("events_uuid") | |||
.setUnique(true) |
@@ -33,7 +33,7 @@ public class AddIndexLoadedTemplatesType extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable("loaded_templates") | |||
.setName("ix_loaded_templates_type") | |||
.addColumn(VarcharColumnDef.newVarcharColumnDefBuilder() |
@@ -34,7 +34,7 @@ public class AddIndexOnActiveRuleParameters extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable("active_rule_parameters") | |||
.setName("ix_arp_on_active_rule_id") | |||
.addColumn(newIntegerColumnDefBuilder().setColumnName("active_rule_id").setIsNullable(false).build()) |
@@ -55,7 +55,7 @@ public class MakeProjectUuidNotNullable extends DdlChange { | |||
.updateColumn(projectUuidCol) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_PROJECTS) | |||
.setName(INDEX_PROJECTS_PROJECT_UUID) | |||
.setUnique(false).addColumn(projectUuidCol) |
@@ -36,7 +36,7 @@ public class MakeQualityProfileKeyUnique extends DdlChange { | |||
@Override | |||
public void execute(DdlChange.Context context) throws SQLException { | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable("rules_profiles") | |||
.setName("uniq_qprof_key") | |||
.addColumn( |
@@ -36,7 +36,7 @@ public class MakeQualityProfileOrganizationUuidAndKeyUnique extends DdlChange { | |||
@Override | |||
public void execute(DdlChange.Context context) throws SQLException { | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable("rules_profiles") | |||
.setName("uniq_qprof_org_and_key") | |||
.addColumn( |
@@ -38,7 +38,7 @@ public class AddIndexOnEsQueueCreatedAt extends DdlChange { | |||
.setIsNullable(false) | |||
.build(); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setName("es_queue_created_at") | |||
.setTable("es_queue") | |||
.addColumn(column) |
@@ -43,7 +43,7 @@ public class AddIndexRulesProfileUuidOnQProfileChanges extends DdlChange { | |||
.setIsNullable(false) | |||
.build(); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setName(NEW_INDEX_NAME) | |||
.setTable(TABLE_NAME) | |||
.addColumn(rulesProfileUuid) |
@@ -71,7 +71,7 @@ public class CreateTableDefaultQProfiles extends DdlChange { | |||
.build()); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable("default_qprofiles") | |||
.setName("uniq_default_qprofiles_uuid") | |||
.addColumn(profileUuidColumn) |
@@ -87,14 +87,14 @@ public class CreateTableOrgQProfiles extends DdlChange { | |||
.build()); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("qprofiles_org_uuid") | |||
.addColumn(organizationColumn) | |||
.build()); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("qprofiles_rp_uuid") | |||
.addColumn(rulesProfileUuid) |
@@ -35,7 +35,7 @@ public class RecreateIndexEventsComponentUuid extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("events") | |||
.setName("events_component_uuid") | |||
.setUnique(false) |
@@ -35,7 +35,7 @@ public class RecreateIndexManualMeasuresComponentUuid extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("manual_measures") | |||
.setName("manual_measures_component_uuid") | |||
.setUnique(false) |
@@ -33,7 +33,7 @@ public class AddIndexOnProjectBranchesKey extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable("project_branches") | |||
.setName("project_branches_kee") | |||
.setUnique(true) |
@@ -19,17 +19,16 @@ | |||
*/ | |||
package org.sonar.server.platform.db.migration.version.v66; | |||
import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE; | |||
import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder; | |||
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.CreateTableBuilder; | |||
import org.sonar.server.platform.db.migration.step.DdlChange; | |||
import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE; | |||
import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder; | |||
public class CreateTableCeTaskCharacteristics extends DdlChange { | |||
private static final String TABLE_NAME = "ce_task_characteristics"; | |||
@@ -73,7 +72,7 @@ public class CreateTableCeTaskCharacteristics extends DdlChange { | |||
.build()); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("ce_characteristics_" + ceTaskUuidColumn.getName()) | |||
.addColumn(ceTaskUuidColumn) |
@@ -71,7 +71,7 @@ public class CreateTablePlugins extends DdlChange { | |||
.build()); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("plugins_key") | |||
.addColumn(keyColumn) |
@@ -64,14 +64,14 @@ public class CreateTableQProfileEditGroups extends DdlChange { | |||
); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_qprofile") | |||
.addColumn(qProfileUuidColumn) | |||
.setUnique(false) | |||
.build()); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_unique") | |||
.addColumn(groupColumn) |
@@ -64,14 +64,14 @@ public class CreateTableQProfileEditUsers extends DdlChange { | |||
); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_qprofile") | |||
.addColumn(qProfileUuidColumn) | |||
.setUnique(false) | |||
.build()); | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_unique") | |||
.addColumn(userLoginColumn) |
@@ -76,7 +76,7 @@ public class CreateTableAnalysisProperties extends DdlChange { | |||
.build() | |||
); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(SNAPSHOT_UUID_COLUMN) | |||
.setUnique(false) | |||
.setTable(TABLE_NAME) |
@@ -41,7 +41,7 @@ public class AddLiveMeasuresMetricIndex extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(newVarcharColumnDefBuilder() | |||
.setColumnName("component_uuid") | |||
.setIsNullable(false) |
@@ -37,7 +37,7 @@ public class AddSnapshotIsLastIndex extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(INDEX_NAME) | |||
.setUnique(false) |
@@ -63,7 +63,7 @@ public class CreateOrgQualityGatesTable extends DdlChange { | |||
.build() | |||
); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(ORGANIZATION_UUID_COLUMN) | |||
.addColumn(QUALITY_GATE_UUID_COLUMN) | |||
.setUnique(true) |
@@ -99,7 +99,7 @@ public class CreateTableLiveMeasures extends DdlChange { | |||
.build()) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(projectUuidCol) | |||
.setUnique(false) | |||
.setTable(TABLE_NAME) |
@@ -23,7 +23,6 @@ import java.sql.SQLException; | |||
import org.sonar.db.Database; | |||
import org.sonar.db.dialect.H2; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.db.dialect.Oracle; | |||
import org.sonar.db.dialect.PostgreSql; | |||
import org.sonar.server.platform.db.migration.step.DataChange; | |||
@@ -54,7 +53,6 @@ public class DeletePersonMeasures extends DataChange { | |||
private String getDeleteSql() { | |||
switch (getDialect().getId()) { | |||
case MySql.ID: | |||
case MsSql.ID: | |||
return "delete pm from project_measures pm " + | |||
"inner join projects c on c.uuid = pm.component_uuid " + |
@@ -45,7 +45,7 @@ public class MakeUuidNotNullableOnQualityGates extends DdlChange { | |||
.updateColumn(UUID_COLUMN) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(UUID_COLUMN) | |||
.setUnique(true) | |||
.setTable(TABLE_NAME) |
@@ -76,7 +76,7 @@ public class CreateDeprecatedRuleKeysTable extends DdlChange { | |||
.build() | |||
); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(DEPRECATED_RULE_KEYS) | |||
.addColumn(OLD_REPOSITORY_KEY_COLUMN) | |||
.addColumn(OLD_RULE_KEY_COLUMN) | |||
@@ -85,7 +85,7 @@ public class CreateDeprecatedRuleKeysTable extends DdlChange { | |||
.build() | |||
); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(DEPRECATED_RULE_KEYS) | |||
.addColumn(RULE_ID_COLUMN) | |||
.setUnique(true) |
@@ -93,7 +93,7 @@ public class CreateWebhooksTable extends DdlChange { | |||
.build() | |||
); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(ORGANIZATION_UUID_COLUMN) | |||
.setUnique(false) | |||
.setTable(TABLE_NAME) | |||
@@ -101,7 +101,7 @@ public class CreateWebhooksTable extends DdlChange { | |||
.build() | |||
); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(PROJECT_UUID_COLUMN) | |||
.setUnique(false) | |||
.setTable(TABLE_NAME) |
@@ -42,7 +42,7 @@ public class RenameTableProjectLinks2ToProjectLinks extends DdlChange { | |||
.setAutoGeneratedId(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("project_links") | |||
.setName("project_links_project") | |||
.addColumn(newVarcharColumnDefBuilder() |
@@ -61,7 +61,7 @@ public class ReplaceIndexInProjectBranches extends DdlChange { | |||
.setName(OLD_INDEX_NAME) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(PROJECT_UUID_COLUMN) | |||
.addColumn(KEE_COLUMN) | |||
.addColumn(KEY_TYPE_COLUMN) |
@@ -41,7 +41,7 @@ public class AddUniqueIndexOnRulesParameters extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("rules_parameters") | |||
.setName("rules_parameters_unique") | |||
.setUnique(true) |
@@ -35,14 +35,14 @@ public class AddUniqueIndexesOnUsers extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("users") | |||
.setName("users_uuid") | |||
.setUnique(true) | |||
.addColumn(notNullableColumn("uuid", 255)) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable("users") | |||
.setName("uniq_external_id") | |||
.setUnique(true) |
@@ -84,14 +84,14 @@ public class CreateAlmAppInstallsTable extends DdlChange { | |||
.addColumn(UPDATED_AT_COLUMN) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(ALM_ID_COLUMN) | |||
.addColumn(OWNER_COLUMN) | |||
.setUnique(true) | |||
.setTable(TABLE_NAME) | |||
.setName("alm_app_installs_owner") | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(ALM_ID_COLUMN) | |||
.addColumn(INSTALL_COLUMN) | |||
.setUnique(true) |
@@ -78,7 +78,7 @@ public class CreateProjectMappingsTable extends DdlChange { | |||
.addColumn(CREATED_AT_COLUMN) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(KEY_TYPE_COLUMN) | |||
.addColumn(KEE_COLUMN) | |||
.setUnique(true) | |||
@@ -86,7 +86,7 @@ public class CreateProjectMappingsTable extends DdlChange { | |||
.setName("key_type_kee") | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(PROJECT_UUID) | |||
.setUnique(false) | |||
.setTable(TABLE_NAME) |
@@ -53,7 +53,7 @@ public class MakeSomeColumnsOfUsersNotNullable extends DdlChange { | |||
.updateColumn(notNullableColumn("external_identity_provider", 100)) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(USERS_TABLE) | |||
.setName(USERS_LOGIN_INDEX) | |||
.addColumn(notNullableColumn("login", 255)) |
@@ -40,10 +40,10 @@ public class PurgeDuplicateRulesParameters extends DataChange { | |||
private static final String REMOVE_DUPLICATE_ACTIVE_RULE_PARAMS_SQL_FOR_GENERIC = | |||
"DELETE FROM active_rule_parameters arp WHERE arp.rules_parameter_id NOT IN (SELECT * FROM (SELECT MIN(id) FROM rules_parameters GROUP BY rule_id, name) temp)"; | |||
private static final String REMOVE_DUPLICATE_RULES_PARAMS_SQL_FOR_MYSQL_MSSQL = | |||
private static final String REMOVE_DUPLICATE_RULES_PARAMS_SQL_FOR_MSSQL = | |||
"DELETE p1 FROM rules_parameters as p1 WHERE id NOT IN (SELECT id FROM (SELECT MIN(id) as id FROM rules_parameters GROUP BY rule_id, name) temp)"; | |||
private static final String REMOVE_DUPLICATE_ACTIVE_RULE_PARAMS_SQL_FOR_MYSQL_MSSQL = | |||
private static final String REMOVE_DUPLICATE_ACTIVE_RULE_PARAMS_SQL_FOR_MSSQL = | |||
"DELETE arp FROM active_rule_parameters as arp WHERE arp.rules_parameter_id NOT IN (SELECT id FROM (SELECT MIN(id) as id FROM rules_parameters GROUP BY rule_id, name) temp)"; | |||
public PurgeDuplicateRulesParameters(Database db) { | |||
@@ -56,9 +56,8 @@ public class PurgeDuplicateRulesParameters extends DataChange { | |||
String removeDuplicateActiveRuleParamsSql; | |||
switch (getDialect().getId()) { | |||
case "mssql": | |||
case "mysql": | |||
removeDuplicateRulesParamsSql = REMOVE_DUPLICATE_RULES_PARAMS_SQL_FOR_MYSQL_MSSQL; | |||
removeDuplicateActiveRuleParamsSql = REMOVE_DUPLICATE_ACTIVE_RULE_PARAMS_SQL_FOR_MYSQL_MSSQL; | |||
removeDuplicateRulesParamsSql = REMOVE_DUPLICATE_RULES_PARAMS_SQL_FOR_MSSQL; | |||
removeDuplicateActiveRuleParamsSql = REMOVE_DUPLICATE_ACTIVE_RULE_PARAMS_SQL_FOR_MSSQL; | |||
break; | |||
default: | |||
removeDuplicateRulesParamsSql = REMOVE_DUPLICATE_RULES_PARAMS_SQL_FOR_GENERIC; |
@@ -56,7 +56,7 @@ public class PurgeOrphansForCE extends DataChange { | |||
private String buildDeleteFromQuery(String tableName, String alias, String whereClause) { | |||
String dialectId = getDialect().getId(); | |||
if ("mssql".equals(dialectId) || "mysql".equals(dialectId)) { | |||
if ("mssql".equals(dialectId)) { | |||
return "delete " + alias + " from " + tableName + " as " + alias + " where " + whereClause; | |||
} | |||
return "delete from " + tableName + " " + alias + " where " + whereClause; |
@@ -54,7 +54,7 @@ public class RenameLoginToUserUuidOnTableUserTokens extends DdlChange { | |||
userUuidColumn) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(USER_TOKENS_TABLE) | |||
.setName("user_tokens_user_uuid_name") | |||
.setUnique(true) |
@@ -35,7 +35,7 @@ public class AddIndexOnOrganizationMembers extends DdlChange { | |||
@Override | |||
public void execute(Context context) throws SQLException { | |||
context.execute( | |||
new CreateIndexBuilder(getDialect()) | |||
new CreateIndexBuilder() | |||
.setTable("organization_members") | |||
.setName("ix_org_members_on_user_id") | |||
.addColumn(IntegerColumnDef.newIntegerColumnDefBuilder() |
@@ -97,14 +97,14 @@ public class CreateProjectAlmBindingsTable extends DdlChange { | |||
.addColumn(UPDATED_AT_COLUMN) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(ALM_ID_COLUMN) | |||
.addColumn(REPO_ID_COLUMN) | |||
.setUnique(true) | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_alm_repo") | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.addColumn(PROJECT_UUID_COLUMN) | |||
.setUnique(true) | |||
.setTable(TABLE_NAME) |
@@ -28,7 +28,6 @@ import org.sonar.api.utils.System2; | |||
import org.sonar.core.util.UuidFactory; | |||
import org.sonar.db.Database; | |||
import org.sonar.db.dialect.MsSql; | |||
import org.sonar.db.dialect.MySql; | |||
import org.sonar.server.platform.db.migration.SupportsBlueGreen; | |||
import org.sonar.server.platform.db.migration.step.DataChange; | |||
import org.sonar.server.platform.db.migration.step.MassUpdate; | |||
@@ -49,7 +48,7 @@ public class FixMissingQualityProfilesOnOrganizations extends DataChange { | |||
this.system2 = system2; | |||
this.uuidFactory = uuidFactory; | |||
this.configuration = configuration; | |||
if (db.getDialect().getId().equals(MySql.ID) || db.getDialect().getId().equals(MsSql.ID)) { | |||
if (db.getDialect().getId().equals(MsSql.ID)) { | |||
as = " AS "; | |||
} else { | |||
as = ""; |
@@ -54,13 +54,13 @@ abstract class AddTmpColumnsToCeTable extends DdlChange { | |||
.build()); | |||
// create indexes | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(tableName) | |||
.setName(tableName + "_tmp_cpnt_uuid") | |||
.addColumn(COLUMN_TMP_COMPONENT_UUID) | |||
.setUnique(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(tableName) | |||
.setName(tableName + "_tmp_main_cpnt_uuid") | |||
.addColumn(COLUMN_TMP_MAIN_COMPONENT_UUID) |
@@ -74,26 +74,26 @@ public class AddTmpLastKeyColumnsToCeActivity extends DdlChange { | |||
.build()); | |||
// create indexes | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_t_islast_key") | |||
.addColumn(COLUMN_TMP_IS_LAST_KEY) | |||
.setUnique(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_t_islast") | |||
.addColumn(COLUMN_TMP_IS_LAST) | |||
.addColumn(COLUMN_STATUS) | |||
.setUnique(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_t_main_islast_key") | |||
.addColumn(COLUMN_TMP_MAIN_IS_LAST_KEY) | |||
.setUnique(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_t_main_islast") | |||
.addColumn(COLUMN_TMP_MAIN_IS_LAST) |
@@ -72,7 +72,7 @@ public class CreateCeTaskMessage extends DdlChange { | |||
.addColumn(COLUMN_CREATED_AT) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_task") | |||
.addColumn(COLUMN_TASK_UUID) |
@@ -75,13 +75,13 @@ public abstract class FinalizeMainComponentUuidColumnsToCeTable extends DdlChang | |||
.build()); | |||
// recreate indexes on renamed columns | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(tableName) | |||
.setName(tableName + "_component") | |||
.addColumn(COLUMN_COMPONENT_UUID) | |||
.setUnique(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(tableName) | |||
.setName(tableName + "_main_component") | |||
.addColumn(COLUMN_MAIN_COMPONENT_UUID) |
@@ -116,26 +116,26 @@ public class FinalizeMainLastKeyColumnsToCeActivity extends DdlChange { | |||
.build()); | |||
// create indexes | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_islast_key") | |||
.addColumn(COLUMN_IS_LAST_KEY) | |||
.setUnique(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_islast") | |||
.addColumn(COLUMN_IS_LAST) | |||
.addColumn(COLUMN_STATUS) | |||
.setUnique(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_main_islast_key") | |||
.addColumn(COLUMN_MAIN_IS_LAST_KEY) | |||
.setUnique(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_main_islast") | |||
.addColumn(COLUMN_MAIN_IS_LAST) |
@@ -107,7 +107,7 @@ public class AddEventComponentChanges extends DdlChange { | |||
.addColumn(COLUMN_CREATED_AT) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName(TABLE_NAME + "_unique") | |||
.addColumn(COLUMN_EVENT_UUID) | |||
@@ -115,13 +115,13 @@ public class AddEventComponentChanges extends DdlChange { | |||
.addColumn(COLUMN_COMPONENT_UUID) | |||
.setUnique(true) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("event_cpnt_changes_cpnt") | |||
.addColumn(COLUMN_EVENT_COMPONENT_UUID) | |||
.setUnique(false) | |||
.build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(TABLE_NAME) | |||
.setName("event_cpnt_changes_analysis") | |||
.addColumn(COLUMN_EVENT_ANALYSIS_UUID) |
@@ -48,7 +48,7 @@ public class AddUserExternalIdColumnInAlmAppInstall extends DdlChange { | |||
.build(); | |||
context.execute(new AddColumnsBuilder(getDialect(), ALM_APP_INSTALLS_TABLE) | |||
.addColumn(userExternalIdDef).build()); | |||
context.execute(new CreateIndexBuilder(getDialect()) | |||
context.execute(new CreateIndexBuilder() | |||
.setTable(ALM_APP_INSTALLS_TABLE) | |||
.addColumn(userExternalIdDef) | |||
.setUnique(false) |