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;
@Override
public void start() {
initSettings();
- failIfMySql();
try {
initDataSource();
checkConnection();
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 {
return Collections.emptyList();
}
- @Override
- public int getScrollDefaultFetchSize() {
- return 200;
- }
-
- @Override
- public int getScrollSingleRowFetchSize() {
- return 1;
- }
-
@Override
public boolean supportsUpsert() {
return false;
/**
* 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.
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
+++ /dev/null
-/*
- * 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);
- }
-}
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;
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());
}
};
- 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;
@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();
}
@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)
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
+++ /dev/null
-/*
- * 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;
- }
-}
@Test
public void testFetchSizeForScrolling() {
assertThat(underTest.getScrollDefaultFetchSize()).isEqualTo(200);
- assertThat(underTest.getScrollSingleRowFetchSize()).isEqualTo(1);
}
@Test
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 {
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
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);
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"/>
+++ /dev/null
-/*
- * 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;
- }
-}
+++ /dev/null
-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");
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 {
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:
+++ /dev/null
-/*
- * 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";
- }
-}
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;
switch (dialect.getId()) {
case MsSql.ID:
return "VARBINARY(MAX)";
- case MySql.ID:
- return "LONGBLOB";
case Oracle.ID:
case H2.ID:
return "BLOB";
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;
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()));
}
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;
switch (dialect.getId()) {
case MsSql.ID:
return "NVARCHAR (MAX)";
- case MySql.ID:
- return "LONGTEXT";
case Oracle.ID:
return "CLOB";
case H2.ID:
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;
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:
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;
public String generateSqlType(Dialect dialect) {
switch (dialect.getId()) {
case PostgreSql.ID:
- case MySql.ID:
case H2.ID:
return "INTEGER";
case MsSql.ID:
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;
* 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
public String generateSqlType(Dialect dialect) {
switch (dialect.getId()) {
case MsSql.ID:
- case MySql.ID:
return "DATETIME";
case Oracle.ID:
return "TIMESTAMP (6)";
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;
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";
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;
switch (dialect.getId()) {
case PostgreSql.ID:
return createPostgresQuery();
- case MySql.ID:
- return createMySqlQuery();
case Oracle.ID:
return createOracleQuery();
default:
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) {
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;
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
*/
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;
- }
}
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;
appendColumns(res, dialect, columnDefs);
appendPkConstraint(res);
res.append(')');
- appendCollationClause(res, dialect);
return res.toString();
}
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;
}
}
- 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();
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;
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());
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;
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;
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;
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:
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;
/**
* 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}
*/
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:
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;
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:
}
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);
@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())
@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())
@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())
.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)
@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())
.updateColumn(analysisUuidColumn)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(TABLE_EVENTS)
.setName("events_analysis")
.addColumn(analysisUuidColumn)
.updateColumn(analysisUuid)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(TABLE_DUPLICATIONS_INDEX)
.setName("duplication_analysis_component")
.addColumn(analysisUuid)
.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)
.updateColumn(rootUuid)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(TABLE_PROJECTS)
.setName("projects_root_uuid")
.addColumn(rootUuid)
@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())
.build();
context.execute(stmts);
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(TABLE_NAME)
.setName("properties2_key")
.addColumn(propKey)
.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())
.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)
.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)
.setName("uniq_group_roles")
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(TABLE_GROUP_ROLES)
.setName("uniq_group_roles")
.setUnique(true)
@Override
public void execute(Context context) throws SQLException {
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable("projects")
.setName("projects_organization")
.addColumn(newVarcharColumnDefBuilder()
// 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.
}
.setName(INDEX_NAME)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(TABLE_ORGANIZATIONS)
.setName(INDEX_NAME)
.addColumn(newVarcharColumnDefBuilder()
.updateColumn(uuidColumn)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(TABLE)
.setName("events_uuid")
.setUnique(true)
@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()
@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())
.updateColumn(projectUuidCol)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(TABLE_PROJECTS)
.setName(INDEX_PROJECTS_PROJECT_UUID)
.setUnique(false).addColumn(projectUuidCol)
@Override
public void execute(DdlChange.Context context) throws SQLException {
context.execute(
- new CreateIndexBuilder(getDialect())
+ new CreateIndexBuilder()
.setTable("rules_profiles")
.setName("uniq_qprof_key")
.addColumn(
@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(
.setIsNullable(false)
.build();
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setName("es_queue_created_at")
.setTable("es_queue")
.addColumn(column)
.setIsNullable(false)
.build();
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setName(NEW_INDEX_NAME)
.setTable(TABLE_NAME)
.addColumn(rulesProfileUuid)
.build());
context.execute(
- new CreateIndexBuilder(getDialect())
+ new CreateIndexBuilder()
.setTable("default_qprofiles")
.setName("uniq_default_qprofiles_uuid")
.addColumn(profileUuidColumn)
.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)
@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)
@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)
@Override
public void execute(Context context) throws SQLException {
context.execute(
- new CreateIndexBuilder(getDialect())
+ new CreateIndexBuilder()
.setTable("project_branches")
.setName("project_branches_kee")
.setUnique(true)
*/
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";
.build());
context.execute(
- new CreateIndexBuilder(getDialect())
+ new CreateIndexBuilder()
.setTable(TABLE_NAME)
.setName("ce_characteristics_" + ceTaskUuidColumn.getName())
.addColumn(ceTaskUuidColumn)
.build());
context.execute(
- new CreateIndexBuilder(getDialect())
+ new CreateIndexBuilder()
.setTable(TABLE_NAME)
.setName("plugins_key")
.addColumn(keyColumn)
);
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)
);
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)
.build()
);
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(SNAPSHOT_UUID_COLUMN)
.setUnique(false)
.setTable(TABLE_NAME)
@Override
public void execute(Context context) throws SQLException {
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(newVarcharColumnDefBuilder()
.setColumnName("component_uuid")
.setIsNullable(false)
@Override
public void execute(Context context) throws SQLException {
context.execute(
- new CreateIndexBuilder(getDialect())
+ new CreateIndexBuilder()
.setTable(TABLE_NAME)
.setName(INDEX_NAME)
.setUnique(false)
.build()
);
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(ORGANIZATION_UUID_COLUMN)
.addColumn(QUALITY_GATE_UUID_COLUMN)
.setUnique(true)
.build())
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(projectUuidCol)
.setUnique(false)
.setTable(TABLE_NAME)
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;
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 " +
.updateColumn(UUID_COLUMN)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(UUID_COLUMN)
.setUnique(true)
.setTable(TABLE_NAME)
.build()
);
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(DEPRECATED_RULE_KEYS)
.addColumn(OLD_REPOSITORY_KEY_COLUMN)
.addColumn(OLD_RULE_KEY_COLUMN)
.build()
);
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(DEPRECATED_RULE_KEYS)
.addColumn(RULE_ID_COLUMN)
.setUnique(true)
.build()
);
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(ORGANIZATION_UUID_COLUMN)
.setUnique(false)
.setTable(TABLE_NAME)
.build()
);
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(PROJECT_UUID_COLUMN)
.setUnique(false)
.setTable(TABLE_NAME)
.setAutoGeneratedId(false)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable("project_links")
.setName("project_links_project")
.addColumn(newVarcharColumnDefBuilder()
.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)
@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)
@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)
.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)
.addColumn(CREATED_AT_COLUMN)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(KEY_TYPE_COLUMN)
.addColumn(KEE_COLUMN)
.setUnique(true)
.setName("key_type_kee")
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(PROJECT_UUID)
.setUnique(false)
.setTable(TABLE_NAME)
.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))
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) {
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;
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;
userUuidColumn)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(USER_TOKENS_TABLE)
.setName("user_tokens_user_uuid_name")
.setUnique(true)
@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()
.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)
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;
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 = "";
.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)
.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)
.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)
.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)
.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)
.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)
.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)
.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)
.addColumn(CREATED_AT_COLUMN)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(ORGANIZATION_UUID_COLUMN)
.setUnique(true)
.setTable(TABLE_NAME)
.setName("org_alm_bindings_org")
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(ALM_APP_INSTALL_UUID_COLUMN)
.setUnique(true)
.setTable(TABLE_NAME)
@Override
public void execute(Context context) throws SQLException {
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(newVarcharColumnDefBuilder()
.setColumnName("user_uuid")
.setIsNullable(false)
@Override
public void execute(Context context) throws SQLException {
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable("users")
.setName("uniq_external_login")
.setUnique(true)
context.execute(new DropColumnsBuilder(getDialect(), TABLE_NAME, "data_type")
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.setTable(TABLE_NAME)
.setName("file_sources_file_uuid")
.setUnique(true)
@Override
public void execute(Context context) throws SQLException {
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(newVarcharColumnDefBuilder()
.setColumnName("parent_uuid")
.setLimit(255)
.addColumn(CREATED_AT_COLUMN)
.build());
- context.execute(new CreateIndexBuilder(getDialect())
+ context.execute(new CreateIndexBuilder()
.addColumn(COMPONENT_UUID_COLUMN)
.addColumn(KEE_COLUMN)
.setUnique(true)
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;
assertThat(underTest.getHandler(new H2())).isNull();
}
- @Test
- public void getHandler_returns_MysqlCharsetHandler_if_mysql() {
- assertThat(underTest.getHandler(new MySql())).isInstanceOf(MysqlCharsetHandler.class);
- }
-
@Test
public void getHandler_returns_MssqlCharsetHandler_if_mssql() {
assertThat(underTest.getHandler(new MsSql())).isInstanceOf(MssqlCharsetHandler.class);
+++ /dev/null
-/*
- * 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 org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-import static java.util.Arrays.asList;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-public class MysqlCharsetHandlerTest {
-
- private static final String TABLE_ISSUES = "issues";
- private static final String TABLE_PROJECTS = "projects";
- private static final String COLUMN_KEE = "kee";
- private static final String COLUMN_NAME = "name";
-
- @Rule
- public ExpectedException expectedException = ExpectedException.none();
-
- private SqlExecutor sqlExecutor = mock(SqlExecutor.class);
- private Connection connection = mock(Connection.class);
- private MysqlCharsetHandler underTest = new MysqlCharsetHandler(sqlExecutor);
-
- @Test
- public void upgrade_verifies_that_columns_are_utf8_and_case_sensitive() throws Exception {
- answerColumnDef(
- new ColumnDef(TABLE_ISSUES, COLUMN_KEE, "utf8", "utf8_bin", "varchar", 10, false),
- new ColumnDef(TABLE_PROJECTS, COLUMN_NAME, "utf8", "utf8_bin", "varchar", 10, false));
-
- // all columns are utf8
- underTest.handle(connection, DatabaseCharsetChecker.State.UPGRADE);
- }
-
- @Test
- public void fresh_install_does_not_verify_anything() throws Exception {
- underTest.handle(connection, DatabaseCharsetChecker.State.FRESH_INSTALL);
- verifyZeroInteractions(sqlExecutor);
- }
-
- @Test
- public void regular_startup_does_not_verify_anything() throws Exception {
- underTest.handle(connection, DatabaseCharsetChecker.State.STARTUP);
- verifyZeroInteractions(sqlExecutor);
- }
-
- @Test
- public void repair_case_insensitive_column() throws Exception {
- answerColumnDef(
- new ColumnDef(TABLE_ISSUES, COLUMN_KEE, "big5_chinese", "big5_chinese_ci", "varchar", 10, false),
- new ColumnDef(TABLE_PROJECTS, COLUMN_NAME, "latin1", "latin1_swedish_ci", "varchar", 10, false));
-
- underTest.handle(connection, DatabaseCharsetChecker.State.UPGRADE);
-
- verify(sqlExecutor).executeDdl(connection, "ALTER TABLE issues MODIFY kee varchar(10) CHARACTER SET 'big5_chinese' COLLATE 'big5_bin' NOT NULL");
- verify(sqlExecutor).executeDdl(connection, "ALTER TABLE projects MODIFY name varchar(10) CHARACTER SET 'latin1' COLLATE 'latin1_bin' NOT NULL");
- }
-
- @Test
- public void size_should_be_ignored_on_longtext_column() throws Exception {
- answerColumnDef(
- new ColumnDef(TABLE_ISSUES, COLUMN_KEE, "latin1", "latin1_german1_ci", "longtext", 4_294_967_295L, false));
-
- underTest.handle(connection, DatabaseCharsetChecker.State.UPGRADE);
-
- verify(sqlExecutor).executeDdl(connection, "ALTER TABLE " + TABLE_ISSUES + " MODIFY " + COLUMN_KEE + " longtext CHARACTER SET 'latin1' COLLATE 'latin1_bin' NOT NULL");
- }
-
- private void answerColumnDef(ColumnDef... columnDefs) throws SQLException {
- when(sqlExecutor.select(any(Connection.class), anyString(), eq(ColumnDef.ColumnDefRowConverter.INSTANCE)))
- .thenReturn(asList(columnDefs));
- }
-}
import org.junit.rules.ExpectedException;
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;
assertThat(def.generateSqlType(new H2())).isEqualTo("BIGINT");
assertThat(def.generateSqlType(new PostgreSql())).isEqualTo("BIGINT");
assertThat(def.generateSqlType(new MsSql())).isEqualTo("BIGINT");
- assertThat(def.generateSqlType(new MySql())).isEqualTo("BIGINT");
assertThat(def.generateSqlType(new Oracle())).isEqualTo("NUMBER (38)");
}
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;
assertThat(underTest.generateSqlType(new MsSql())).isEqualTo("VARBINARY(MAX)");
}
- @Test
- public void generateSqlType_for_MySql() {
- assertThat(underTest.generateSqlType(new MySql())).isEqualTo("LONGBLOB");
- }
-
@Test
public void generateSqlType_for_Oracle() {
assertThat(underTest.generateSqlType(new Oracle())).isEqualTo("BLOB");
import org.junit.rules.ExpectedException;
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;
assertThat(def.generateSqlType(new H2())).isEqualTo("BOOLEAN");
assertThat(def.generateSqlType(new PostgreSql())).isEqualTo("BOOLEAN");
assertThat(def.generateSqlType(new MsSql())).isEqualTo("BIT");
- assertThat(def.generateSqlType(new MySql())).isEqualTo("TINYINT(1)");
assertThat(def.generateSqlType(new Oracle())).isEqualTo("NUMBER(1)");
}
import org.junit.rules.ExpectedException;
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;
assertThat(underTest.generateSqlType(new H2())).isEqualTo("CLOB(2147483647)");
}
- @Test
- public void generate_sql_type_on_mysql() {
- assertThat(underTest.generateSqlType(new MySql())).isEqualTo("LONGTEXT");
- }
-
@Test
public void generate_sql_type_on_oracle() {
assertThat(underTest.generateSqlType(new Oracle())).isEqualTo("CLOB");
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;
assertThat(def.generateSqlType(new H2())).isEqualTo("DOUBLE");
assertThat(def.generateSqlType(new PostgreSql())).isEqualTo("NUMERIC (30,20)");
assertThat(def.generateSqlType(new MsSql())).isEqualTo("DECIMAL (30,20)");
- assertThat(def.generateSqlType(new MySql())).isEqualTo("DECIMAL (30,20)");
assertThat(def.generateSqlType(new Oracle())).isEqualTo("NUMERIC (30,20)");
}
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;
assertThat(underTest.generateSqlType(new MsSql())).isEqualTo("INT");
}
- @Test
- public void generateSqlType_for_MySql() {
- assertThat(underTest.generateSqlType(new MySql())).isEqualTo("INTEGER");
- }
-
@Test
public void generateSqlType_for_Oracle() {
assertThat(underTest.generateSqlType(new Oracle())).isEqualTo("NUMBER(38,0)");
import org.junit.rules.ExpectedException;
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;
assertThat(def.generateSqlType(new H2())).isEqualTo("TIMESTAMP");
assertThat(def.generateSqlType(new PostgreSql())).isEqualTo("TIMESTAMP");
assertThat(def.generateSqlType(new MsSql())).isEqualTo("DATETIME");
- assertThat(def.generateSqlType(new MySql())).isEqualTo("DATETIME");
assertThat(def.generateSqlType(new Oracle())).isEqualTo("TIMESTAMP (6)");
}
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;
assertThat(def.generateSqlType(new H2())).isEqualTo("TINYINT");
assertThat(def.generateSqlType(new PostgreSql())).isEqualTo("SMALLINT");
assertThat(def.generateSqlType(new MsSql())).isEqualTo("TINYINT");
- assertThat(def.generateSqlType(new MySql())).isEqualTo("TINYINT(2)");
assertThat(def.generateSqlType(new Oracle())).isEqualTo("NUMBER(3)");
}
import org.junit.rules.ExpectedException;
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;
assertThat(def.generateSqlType(new H2())).isEqualTo("VARCHAR (10)");
assertThat(def.generateSqlType(new PostgreSql())).isEqualTo("VARCHAR (10)");
- assertThat(def.generateSqlType(new MySql())).isEqualTo("VARCHAR (10)");
assertThat(def.generateSqlType(new MsSql())).isEqualTo("NVARCHAR (10)");
assertThat(def.generateSqlType(new Oracle())).isEqualTo("VARCHAR2 (10 CHAR)");
}
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;
.isEqualTo("ALTER TABLE issues ADD (date_in_ms BIGINT NULL, name VARCHAR (10) NOT NULL, col_with_default BOOLEAN DEFAULT false NOT NULL, varchar_col_with_default VARCHAR (3) DEFAULT 'foo' NOT NULL)");
}
- @Test
- public void add_columns_on_mysql() {
- assertThat(createSampleBuilder(new MySql()).build())
- .isEqualTo("ALTER TABLE issues ADD (date_in_ms BIGINT NULL, name VARCHAR (10) NOT NULL, col_with_default TINYINT(1) DEFAULT false NOT NULL, varchar_col_with_default VARCHAR (3) DEFAULT 'foo' NOT NULL)");
- }
-
@Test
public void add_columns_on_oracle() {
assertThat(createSampleBuilder(new Oracle()).build())
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.BooleanColumnDef;
.containsOnly("ALTER TABLE issues ALTER COLUMN name TYPE VARCHAR (10), ALTER COLUMN name SET NOT NULL");
}
- @Test
- public void update_columns_on_mysql() {
- assertThat(createSampleBuilder(new MySql()).build())
- .containsOnly("ALTER TABLE issues MODIFY COLUMN value DECIMAL (30,20) NULL, MODIFY COLUMN name VARCHAR (10) NULL");
- }
-
- @Test
- public void update_not_nullable_column_on_mysql() {
- assertThat(createNotNullableBuilder(new MySql()).build())
- .containsOnly("ALTER TABLE issues MODIFY COLUMN name VARCHAR (10) NOT NULL");
- }
-
@Test
public void update_columns_on_oracle() {
assertThat(createSampleBuilder(new Oracle()).build())
*/
package org.sonar.server.platform.db.migration.sql;
-import java.util.Arrays;
import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
-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 static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
@Test
public void create_index_on_single_column() {
- verifySql(new CreateIndexBuilder(new H2())
+ verifySql(new CreateIndexBuilder()
.setTable("issues")
.setName("issues_key")
.addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build()),
@Test
public void create_unique_index_on_single_column() {
- verifySql(new CreateIndexBuilder(new H2())
+ verifySql(new CreateIndexBuilder()
.setTable("issues")
.setName("issues_key")
.addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build())
@Test
public void create_index_on_multiple_columns() {
- verifySql(new CreateIndexBuilder(new H2())
+ verifySql(new CreateIndexBuilder()
.setTable("rules")
.setName("rules_key")
.addColumn(newVarcharColumnDefBuilder().setColumnName("repository").setLimit(10).build())
@Test
public void create_unique_index_on_multiple_columns() {
- verifySql(new CreateIndexBuilder(new H2())
+ verifySql(new CreateIndexBuilder()
.setTable("rules")
.setName("rules_key")
.addColumn(newVarcharColumnDefBuilder().setColumnName("repository").setLimit(10).build())
}
@Test
- public void index_length_is_not_specified_on_big_varchar_columns_if_not_mysql() {
- Arrays.<Dialect>asList(new H2(), new MsSql(), new PostgreSql(), new Oracle())
- .forEach(dialect -> verifySql(new CreateIndexBuilder(dialect)
- .setTable("issues")
- .setName("issues_key")
- .addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(4000).build()),
- "CREATE INDEX issues_key ON issues (kee)"));
- }
-
- @Test
- public void index_length_is_limited_to_255_on_big_varchar_columns_if_mysql() {
- verifySql(new CreateIndexBuilder(new MySql())
+ public void index_length_is_not_specified_on_big_varchar_columns() {
+ verifySql(new CreateIndexBuilder()
.setTable("issues")
.setName("issues_key")
.addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(4000).build()),
- "CREATE INDEX issues_key ON issues (kee(255))");
+ "CREATE INDEX issues_key ON issues (kee)");
}
@Test
expectedException.expect(NullPointerException.class);
expectedException.expectMessage("Table name cannot be null");
- new CreateIndexBuilder(new H2())
+ new CreateIndexBuilder()
.setName("issues_key")
.addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build())
.build();
expectedException.expect(NullPointerException.class);
expectedException.expectMessage("Index name cannot be null");
- new CreateIndexBuilder(new H2())
+ new CreateIndexBuilder()
.setTable("issues")
.addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build())
.build();
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("at least one column must be specified");
- new CreateIndexBuilder(new H2())
+ new CreateIndexBuilder()
.setTable("issues")
.setName("issues_key")
.build();
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Table name must be lower case and contain only alphanumeric chars or '_', got '(not valid)'");
- new CreateIndexBuilder(new H2())
+ new CreateIndexBuilder()
.setTable("(not valid)")
.setName("issues_key")
.addColumn(newVarcharColumnDefBuilder().setColumnName("kee").setLimit(10).build())
expectedException.expect(NullPointerException.class);
expectedException.expectMessage("Column cannot be null");
- new CreateIndexBuilder(new H2())
+ new CreateIndexBuilder()
.setTable("issues")
.setName("issues_key")
.addColumn(null)
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;
private static final Oracle ORACLE = new Oracle();
private static final PostgreSql POSTGRESQL = new PostgreSql();
private static final MsSql MS_SQL = new MsSql();
- private static final MySql MY_SQL = new MySql();
- private static final Dialect[] ALL_DIALECTS = {H2, MY_SQL, MS_SQL, POSTGRESQL, ORACLE};
+ private static final Dialect[] ALL_DIALECTS = {H2, MS_SQL, POSTGRESQL, ORACLE};
private static final String TABLE_NAME = "table_42";
@Rule
@DataProvider
public static Object[][] digitCharsDataProvider() {
- return new Object[][] {
+ return new Object[][]{
{'0'},
{'1'},
{'2'},
"CREATE TABLE table_42 (id INTEGER NOT NULL AUTO_INCREMENT (1,1), CONSTRAINT pk_table_42 PRIMARY KEY (id))");
}
- @Test
- public void build_adds_AUTO_INCREMENT_clause_on_MySql() {
- List<String> stmts = new CreateTableBuilder(MY_SQL, TABLE_NAME)
- .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
- .build();
- assertThat(stmts).hasSize(1);
- assertThat(stmts.iterator().next())
- .startsWith("CREATE TABLE table_42 (id INTEGER NOT NULL AUTO_INCREMENT, CONSTRAINT pk_table_42 PRIMARY KEY (id))");
- }
-
- @Test
- public void builds_adds_hardcoded_collation_clause_on_MySql() {
- List<String> stmts = new CreateTableBuilder(MY_SQL, TABLE_NAME)
- .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
- .build();
- assertThat(stmts).hasSize(1);
- assertThat(stmts.iterator().next())
- .endsWith(" ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin");
-
- }
-
@Test
public void withPkConstraintName_throws_NPE_if_name_is_null() {
expectedException.expect(NullPointerException.class);
verifyDefaultClauseOnVarcharColumn(MS_SQL, "CREATE TABLE table_42 (status NVARCHAR (1) DEFAULT 'P' NOT NULL)");
}
- @Test
- public void build_adds_DEFAULT_clause_on_varchar_column_on_MySQL() {
- verifyDefaultClauseOnVarcharColumn(MY_SQL, "CREATE TABLE table_42 (status VARCHAR (1) DEFAULT 'P' NOT NULL) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin");
- }
-
@Test
public void build_adds_DEFAULT_clause_on_varchar_column_on_Oracle() {
verifyDefaultClauseOnVarcharColumn(ORACLE, "CREATE TABLE table_42 (status VARCHAR2 (1 CHAR) DEFAULT 'P' NOT NULL)");
verifyDefaultClauseOnBooleanColumn(MS_SQL, "CREATE TABLE table_42 (enabled BIT DEFAULT 1 NOT NULL)");
}
- @Test
- public void build_adds_DEFAULT_clause_on_boolean_column_on_MySQL() {
- verifyDefaultClauseOnBooleanColumn(MY_SQL, "CREATE TABLE table_42 (enabled TINYINT(1) DEFAULT true NOT NULL) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin");
- }
-
@Test
public void build_adds_DEFAULT_clause_on_boolean_column_on_Oracle() {
verifyDefaultClauseOnBooleanColumn(ORACLE, "CREATE TABLE table_42 (enabled NUMBER(1) DEFAULT 1 NOT NULL)");
import org.junit.Test;
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;
public class DropColumnsBuilderTest {
- @Test
- public void drop_columns_on_mysql() {
- assertThat(new DropColumnsBuilder(new MySql(), "issues", "date_in_ms", "name").build())
- .containsOnly("ALTER TABLE issues DROP COLUMN date_in_ms, DROP COLUMN name");
- }
-
@Test
public void drop_columns_on_oracle() {
assertThat(new DropColumnsBuilder(new Oracle(), "issues", "date_in_ms", "name").build())
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;
public void drop_index_in_table() {
verifySql(new H2(), "DROP INDEX IF EXISTS issues_key");
verifySql(new MsSql(), "DROP INDEX issues_key ON issues");
- verifySql(new MySql(), "DROP INDEX issues_key ON issues");
verifySql(new Oracle(), "DROP INDEX issues_key");
verifySql(new PostgreSql(), "DROP INDEX IF EXISTS issues_key");
}
import org.junit.rules.ExpectedException;
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;
@Rule
public ExpectedException expectedException = ExpectedException.none();
- @Test
- public void drop_tables_on_mysql() {
- assertThat(new DropTableBuilder(new MySql(), "issues")
- .build()).containsOnly("drop table if exists issues");
- }
-
@Test
public void drop_tables_on_postgresql() {
assertThat(new DropTableBuilder(new PostgreSql(), "issues")
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;
public static final DatabaseAndResult[] DATABASES = {
new DatabaseAndResult(new H2(), "ALTER TABLE ${table_name} ALTER COLUMN ${old_column_name} RENAME TO ${new_column_name}"),
new DatabaseAndResult(new PostgreSql(), "ALTER TABLE ${table_name} RENAME COLUMN ${old_column_name} TO ${new_column_name}"),
- new DatabaseAndResult(new MySql(), "ALTER TABLE ${table_name} CHANGE ${old_column_name} ${new_column_name} ${column_def}"),
new DatabaseAndResult(new MsSql(), "EXEC sp_rename '${table_name}.${old_column_name}', '${new_column_name}', 'COLUMN'"),
new DatabaseAndResult(new Oracle(), "ALTER TABLE ${table_name} RENAME COLUMN ${old_column_name} TO ${new_column_name}")
};
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;
verifySql(new MsSql(), "EXEC sp_rename 'foo', 'bar'");
}
- @Test
- public void rename_table_on_mysql() {
- verifySql(new MySql(), "ALTER TABLE foo RENAME TO bar");
- }
-
@Test
public void rename_table_on_oracle() {
verifySql(new Oracle(),
import org.junit.Test;
import org.mockito.Mockito;
import org.sonar.db.Database;
-import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.MsSql;
import org.sonar.server.platform.db.migration.step.DdlChange;
import static java.util.Arrays.asList;
@Before
public void setUp() {
// Some databases have unique names of indexes, so table name is not declared
- // when dropping an index ("drop index <index name>"). Because of that MySQL is
+ // when dropping an index ("drop index <index name>"). Because of that SQLServer is
// used in the test so that the table name can also be verified
- when(db.getDialect()).thenReturn(new MySql());
+ when(db.getDialect()).thenReturn(new MsSql());
}
@Test
import org.junit.Test;
import org.mockito.Mockito;
import org.sonar.db.Database;
-import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.MsSql;
import org.sonar.server.platform.db.migration.step.DdlChange;
import static java.util.Arrays.asList;
@Before
public void setUp() {
// Some databases have unique names of indexes, so table name is not declared
- // when dropping an index ("drop index <index name>"). Because of that MySQL is
+ // when dropping an index ("drop index <index name>"). Because of that SQLServer is
// used in the test so that the table name can also be verified
- when(db.getDialect()).thenReturn(new MySql());
+ when(db.getDialect()).thenReturn(new MsSql());
}
@Test
import org.junit.Test;
import org.mockito.Mockito;
import org.sonar.db.Database;
-import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.MsSql;
import org.sonar.server.platform.db.migration.step.DdlChange;
import static java.util.Arrays.asList;
@Before
public void setUp() {
// Some databases have unique names of indexes, so table name is not declared
- // when dropping an index ("drop index <index name>"). Because of that MySQL is
+ // when dropping an index ("drop index <index name>"). Because of that SQLServer is
// used in the test so that the table name can also be verified
- when(db.getDialect()).thenReturn(new MySql());
+ when(db.getDialect()).thenReturn(new MsSql());
}
@Test
import org.junit.Test;
import org.mockito.Mockito;
import org.sonar.db.Database;
-import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.MsSql;
import org.sonar.server.platform.db.migration.step.DdlChange;
import static java.util.Arrays.asList;
@Before
public void setUp() {
// Some databases have unique names of indexes, so table name is not declared
- // when dropping an index ("drop index <index name>"). Because of that MySQL is
+ // when dropping an index ("drop index <index name>"). Because of that SQLServer is
// used in the test so that the table name can also be verified
- when(db.getDialect()).thenReturn(new MySql());
+ when(db.getDialect()).thenReturn(new MsSql());
}
@Test
import org.junit.Test;
import org.mockito.Mockito;
import org.sonar.db.Database;
-import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.MsSql;
import org.sonar.server.platform.db.migration.step.DdlChange;
import static java.util.Arrays.asList;
@Before
public void setUp() {
// Some databases have unique names of indexes, so table name is not declared
- // when dropping an index ("drop index <index name>"). Because of that MySQL is
+ // when dropping an index ("drop index <index name>"). Because of that SQLServer is
// used in the test so that the table name can also be verified
- when(db.getDialect()).thenReturn(new MySql());
+ when(db.getDialect()).thenReturn(new MsSql());
}
@Test
import org.junit.Test;
import org.mockito.Mockito;
import org.sonar.db.Database;
-import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.MsSql;
import org.sonar.server.platform.db.migration.step.DdlChange;
import static java.util.Arrays.asList;
@Before
public void setUp() {
// Some databases have unique names of indexes, so table name is not declared
- // when dropping an index ("drop index <index name>"). Because of that MySQL is
+ // when dropping an index ("drop index <index name>"). Because of that SQLServer is
// used in the test so that the table name can also be verified
- when(db.getDialect()).thenReturn(new MySql());
+ when(db.getDialect()).thenReturn(new MsSql());
}
@Test
- `sonar.ce.javaOpts`
- `sonar.search.javaOpts`
-### Cannot connect to MySQL database
-
-By default, remote access to MySQL database server is disabled for security reasons. If you want to remotely access the database server, you need to follow this [quick guide](https://www.cyberciti.biz/tips/how-do-i-enable-remote-access-to-mysql-database-server.html).
-
### Failed to start on Windows Vista
SonarQube seems unable to start when installed under the `Program Files` directory on Windows Vista. It should therefore not be installed there.
private static final int JDBC_EMBEDDED_PORT_DEFAULT_VALUE = 9092;
enum Provider {
- H2("lib/jdbc/h2"), SQLSERVER("lib/jdbc/mssql"), MYSQL("lib/jdbc/mysql"), ORACLE("extensions/jdbc-driver/oracle"),
+ H2("lib/jdbc/h2"), SQLSERVER("lib/jdbc/mssql"), ORACLE("extensions/jdbc-driver/oracle"),
POSTGRESQL("lib/jdbc/postgresql");
final String path;
public void accept(Props props) {
File homeDir = props.nonNullValueAsFile(PATH_HOME.getKey());
Provider provider = resolveProviderAndEnforceNonnullJdbcUrl(props);
- String url = props.value(JDBC_URL.getKey());
- checkUrlParameters(provider, url);
String driverPath = driverPath(homeDir, provider);
props.set(JDBC_DRIVER_PATH.getKey(), driverPath);
}
return format("jdbc:h2:tcp://%s:%d/sonar", host, embeddedDatabasePort);
}
- void checkUrlParameters(Provider provider, String url) {
- if (Provider.MYSQL.equals(provider)) {
- checkRequiredParameter(url, "useUnicode=true");
- checkRequiredParameter(url, "characterEncoding=utf8");
- checkRecommendedParameter(url, "rewriteBatchedStatements=true");
- checkRecommendedParameter(url, "useConfigs=maxPerformance");
- }
- }
-
private static void warnIfUrlIsSet(int port, String existing, String expectedUrl) {
if (isNotEmpty(existing)) {
Logger logger = LoggerFactory.getLogger(JdbcSettings.class);
.set(CLUSTER_HZ_HOSTS.getKey(), nonLoopbackLocal.getHostAddress())
.set(CLUSTER_SEARCH_HOSTS.getKey(), nonLoopbackLocal.getHostAddress())
.set("sonar.auth.jwtBase64Hs256Secret", "abcde")
- .set(JDBC_URL.getKey(), "jdbc:mysql://localhost:3306/sonar");
+ .set(JDBC_URL.getKey(), "jdbc:postgresql://localhost:3306/sonar");
}
private TestAppSettings newSettingsForSearchNode() {
.set(CLUSTER_HZ_HOSTS.getKey(), nonLoopbackLocal.getHostAddress())
.set(CLUSTER_SEARCH_HOSTS.getKey(), nonLoopbackLocal.getHostAddress())
.set("sonar.auth.jwtBase64Hs256Secret", "abcde")
- .set(JDBC_URL.getKey(), "jdbc:mysql://localhost:3306/sonar");
+ .set(JDBC_URL.getKey(), "jdbc:postgresql://localhost/sonar");
}
private TestAppSettings newSettingsForSearchNode() {
checkProviderForUrlAndUnchangedUrl("jdbc:OrAcLe:foo", Provider.ORACLE);
}
- @Test
- public void resolve_MySql_when_jdbc_url_contains_mysql_in_any_case() {
- checkProviderForUrlAndUnchangedUrl("jdbc:mysql:foo", Provider.MYSQL);
-
- checkProviderForUrlAndUnchangedUrl("jdbc:mYsQL:foo", Provider.MYSQL);
- }
-
@Test
public void resolve_SqlServer_when_jdbc_url_contains_sqlserver_in_any_case() {
checkProviderForUrlAndUnchangedUrl("jdbc:sqlserver:foo", Provider.SQLSERVER);
underTest.resolveProviderAndEnforceNonnullJdbcUrl(props);
}
- @Test
- public void check_mysql_parameters() {
- // minimal -> ok
- underTest.checkUrlParameters(Provider.MYSQL,
- "jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8");
-
- // full -> ok
- underTest.checkUrlParameters(Provider.MYSQL,
- "jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance");
-
- // missing required -> ko
- expectedException.expect(MessageException.class);
- expectedException.expectMessage("JDBC URL must have the property 'useUnicode=true'");
-
- underTest.checkUrlParameters(Provider.MYSQL, "jdbc:mysql://localhost:3306/sonar?characterEncoding=utf8");
- }
-
@Test
public void checkAndComplete_sets_driver_path_for_oracle() throws Exception {
File driverFile = new File(homeDir, "extensions/jdbc-driver/oracle/ojdbc6.jar");
verifyJdbcUrl("jdbc:h2:tcp://localhost/mem:TEST", "jdbc:h2:tcp://localhost/mem:test");
}
- @Test
- public void sanitize_mysql_url() {
- verifyJdbcUrl("jdbc:mysql://127.0.0.1:3306/sonarqube?useUnicode=true&characterEncoding=utf8", "jdbc:mysql://127.0.0.1:3306/sonarqube");
- verifyJdbcUrl("jdbc:mysql://127.0.0.1:3306/sonarqube", "jdbc:mysql://127.0.0.1:3306/sonarqube");
- verifyJdbcUrl("jdbc:mysql://127.0.0.1:3306/SONARQUBE", "jdbc:mysql://127.0.0.1:3306/sonarqube");
- }
-
@Test
public void sanitize_oracle_url() {
verifyJdbcUrl("sonar.jdbc.url=jdbc:oracle:thin:@localhost:1521/XE", "sonar.jdbc.url=jdbc:oracle:thin:@localhost:1521/xe");
import com.google.common.collect.ImmutableSet;
import java.util.Date;
-import java.util.List;
import java.util.Locale;
import java.util.Set;
import javax.annotation.Nullable;
private final ProjectIndexers projectIndexers;
public ComponentUpdater(DbClient dbClient, I18n i18n, System2 system2,
- PermissionTemplateService permissionTemplateService, FavoriteUpdater favoriteUpdater,
- ProjectIndexers projectIndexers) {
+ PermissionTemplateService permissionTemplateService, FavoriteUpdater favoriteUpdater,
+ ProjectIndexers projectIndexers) {
this.dbClient = dbClient;
this.i18n = i18n;
this.system2 = system2;
if (isRootProject(componentDto)) {
createMainBranch(dbSession, componentDto.uuid());
}
- removeDuplicatedProjects(dbSession, componentDto.getDbKey());
handlePermissionTemplate(dbSession, componentDto, userId);
return componentDto;
}
dbClient.branchDao().upsert(session, branch);
}
- /**
- * On MySQL, as PROJECTS.KEE is not unique, if the same project is provisioned multiple times, then it will be duplicated in the database.
- * So, after creating a project, we commit, and we search in the db if their are some duplications and we remove them.
- *
- * SONAR-6332
- */
- private void removeDuplicatedProjects(DbSession session, String projectKey) {
- List<ComponentDto> duplicated = dbClient.componentDao().selectComponentsHavingSameKeyOrderedById(session, projectKey);
- for (int i = 1; i < duplicated.size(); i++) {
- dbClient.componentDao().delete(session, duplicated.get(i).getId());
- }
- }
-
private void handlePermissionTemplate(DbSession dbSession, ComponentDto componentDto, @Nullable Integer userId) {
permissionTemplateService.applyDefault(dbSession, componentDto, userId);
if (componentDto.qualifier().equals(PROJECT)
@Test
public void hasSameDbVendor_is_true_if_values_match() {
- prepareDb("mysql");
- prepareEs("mysql");
+ prepareDb("mssql");
+ prepareEs("mssql");
assertThat(underTest.hasSameDbVendor()).isTrue();
}
@Test
public void hasSameDbVendor_is_false_if_values_dont_match() {
- prepareDb("mysql");
+ prepareDb("mssql");
prepareEs("postgres");
assertThat(underTest.hasSameDbVendor()).isFalse();
@Test
public void hasSameDbVendor_is_false_if_value_is_absent_from_es() {
- prepareDb("mysql");
+ prepareDb("mssql");
assertThat(underTest.hasSameDbVendor()).isFalse();
}
@Test
public void markAsCompatible_db_metadata_in_es() {
- prepareDb("mysql");
+ prepareDb("mssql");
underTest.markAsCompatible();
- assertThat(metadataIndex.getDbVendor()).hasValue("mysql");
+ assertThat(metadataIndex.getDbVendor()).hasValue("mssql");
}
@Test
public void markAsCompatible_updates_db_metadata_in_es() {
- prepareEs("mysql");
+ prepareEs("mssql");
prepareDb("postgres");
underTest.markAsCompatible();
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.DefaultServerUpgradeStatus;
verifyInfoLog();
}
- @Test
- public void start_runs_MigrationEngine_on_mysql_if_fresh_install() {
- start_runs_MigrationEngine_for_dialect_if_fresh_install(new MySql());
- }
-
@Test
public void start_runs_MigrationEngine_on_postgre_if_fresh_install() {
start_runs_MigrationEngine_for_dialect_if_fresh_install(new PostgreSql());
import org.sonar.core.platform.PluginRepository;
import org.sonar.db.DbClient;
import org.sonar.db.dialect.H2;
-import org.sonar.db.dialect.MySql;
+import org.sonar.db.dialect.PostgreSql;
import org.sonar.server.branch.BranchFeatureRule;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
@Test
public void return_if_production_database_or_not() {
init();
- when(dbClient.getDatabase().getDialect()).thenReturn(new MySql());
+ when(dbClient.getDatabase().getDialect()).thenReturn(new PostgreSql());
assertJson(call()).isSimilarTo("{" +
" \"productionDatabase\": true" +
.build()
});
when(server.getVersion()).thenReturn("6.2");
- when(dbClient.getDatabase().getDialect()).thenReturn(new MySql());
+ when(dbClient.getDatabase().getDialect()).thenReturn(new PostgreSql());
when(webServer.isStandalone()).thenReturn(true);
when(editionProvider.get()).thenReturn(Optional.of(EditionProvider.Edition.COMMUNITY));