import org.sonar.db.DbClient;
import org.sonar.db.DefaultDatabase;
import org.sonar.db.purge.PurgeProfiler;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import org.sonar.process.Props;
import org.sonar.process.logging.LogbackHelper;
import org.sonar.server.component.ComponentCleanerService;
import java.sql.SQLException;
import java.util.Locale;
import javax.annotation.concurrent.Immutable;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.db.version.SqTables;
/**
* Result of standard SQL command "select * from INFORMATION_SCHEMA" (columns listed in {@link #SELECT_COLUMNS}).
public boolean isInSonarQubeTable() {
String tableName = table.toLowerCase(Locale.ENGLISH);
- return DatabaseVersion.TABLES.contains(tableName) || DatabaseVersion.OLD_DROPPED_TABLES.contains(tableName);
+ return SqTables.TABLES.contains(tableName) || SqTables.OLD_DROPPED_TABLES.contains(tableName);
}
public enum ColumnDefRowConverter implements SqlExecutor.RowConverter<ColumnDef> {
import org.sonar.db.DbSession;
import org.sonar.db.schemamigration.SchemaMigrationMapper;
import org.sonar.server.platform.db.migration.step.RegisteredMigrationStep;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import static com.google.common.base.Preconditions.checkState;
/**
- * TODO make {@link org.sonar.db.version.DatabaseVersion} use this class
+ * TODO make {@link DatabaseVersion} use this class
*/
public class MigrationHistoryImpl implements MigrationHistory {
private final DbClient dbClient;
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.platform.db.migration.version;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.util.Collections;
+import java.util.List;
+import javax.annotation.Nullable;
+import org.sonar.db.DatabaseUtils;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
+
+public class DatabaseVersion {
+
+ public static final int LAST_VERSION = 1_502;
+
+ /**
+ * The minimum supported version which can be upgraded. Lower
+ * versions must be previously upgraded to LTS version.
+ * Note that the value can't be less than current LTS version.
+ */
+ public static final int MIN_UPGRADE_VERSION = 1_152;
+
+ private final DbClient dbClient;
+
+ public DatabaseVersion(DbClient dbClient) {
+ this.dbClient = dbClient;
+ }
+
+ @VisibleForTesting
+ static Status getStatus(@Nullable Integer currentVersion, int lastVersion) {
+ Status status = Status.FRESH_INSTALL;
+ if (currentVersion != null) {
+ if (currentVersion == lastVersion) {
+ status = Status.UP_TO_DATE;
+ } else if (currentVersion > lastVersion) {
+ status = Status.REQUIRES_DOWNGRADE;
+ } else {
+ status = Status.REQUIRES_UPGRADE;
+ }
+ }
+ return status;
+ }
+
+ public Status getStatus() {
+ return getStatus(getVersion(), LAST_VERSION);
+ }
+
+ public Integer getVersion() {
+ try (DbSession dbSession = dbClient.openSession(false)) {
+ if (!DatabaseUtils.tableExists("SCHEMA_MIGRATIONS", dbSession.getConnection())) {
+ return null;
+ }
+
+ List<Integer> versions = dbClient.schemaMigrationDao().selectVersions(dbSession);
+ if (!versions.isEmpty()) {
+ Collections.sort(versions);
+ return versions.get(versions.size() - 1);
+ }
+ return null;
+ }
+ }
+
+ public enum Status {
+ UP_TO_DATE, REQUIRES_UPGRADE, REQUIRES_DOWNGRADE, FRESH_INSTALL
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.platform.db.migration.version;
+
+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 static org.assertj.core.api.Assertions.assertThat;
+
+public class DatabaseVersionTest {
+
+ @Rule
+ public DbTester dbTester = DbTester.create(System2.INSTANCE);
+
+ private DbClient dbClient = dbTester.getDbClient();
+ private DbSession dbSession = dbTester.getSession();
+ private DatabaseVersion underTest = new DatabaseVersion(dbClient);
+
+ @Test
+ public void getVersion() {
+ dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "1");
+ dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "2");
+ dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "4");
+ dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "123");
+ dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "50");
+ dbSession.commit();
+
+ Integer version = underTest.getVersion();
+
+ assertThat(version).isEqualTo(123);
+ }
+
+ @Test
+ public void getVersion_no_rows() {
+ Integer version = underTest.getVersion();
+
+ assertThat(version).isNull();
+ }
+
+ @Test
+ public void getStatus() {
+ assertThat(DatabaseVersion.getStatus(null, 150)).isEqualTo(DatabaseVersion.Status.FRESH_INSTALL);
+ assertThat(DatabaseVersion.getStatus(123, 150)).isEqualTo(DatabaseVersion.Status.REQUIRES_UPGRADE);
+ assertThat(DatabaseVersion.getStatus(150, 150)).isEqualTo(DatabaseVersion.Status.UP_TO_DATE);
+ assertThat(DatabaseVersion.getStatus(200, 150)).isEqualTo(DatabaseVersion.Status.REQUIRES_DOWNGRADE);
+ }
+}
import org.sonar.api.utils.log.Loggers;
import org.sonar.db.DbSession;
import org.sonar.db.MyBatis;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.db.version.SqTables;
import org.sonar.server.component.es.ProjectMeasuresIndexDefinition;
import org.sonar.server.es.BulkIndexer;
import org.sonar.server.es.EsClient;
try (DbSession dbSession = myBatis.openSession(false);
Connection connection = dbSession.getConnection();
Statement ddlStatement = connection.createStatement()) {
- for (String tableName : DatabaseVersion.TABLES) {
+ for (String tableName : SqTables.TABLES) {
Optional.ofNullable(TABLE_CLEANERS.get(tableName))
.orElse(BackendCleanup::truncateDefault)
.clean(tableName, ddlStatement, connection);
import org.picocontainer.Startable;
import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.log.Loggers;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import static org.sonar.server.app.ServerProcessLogging.STARTUP_LOGGER_NAME;
import org.apache.commons.lang.builder.ToStringStyle;
import org.picocontainer.Startable;
import org.sonar.api.platform.ServerUpgradeStatus;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
/**
* @since 2.5
import org.sonar.api.utils.log.Loggers;
import org.sonar.api.utils.log.Profiler;
import org.sonar.core.platform.ComponentContainer;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import org.sonar.server.platform.platformlevel.PlatformLevel;
import org.sonar.server.platform.platformlevel.PlatformLevel1;
import org.sonar.server.platform.platformlevel.PlatformLevel2;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.MyBatis;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
/**
* Information about database and connection pool
import org.sonar.core.i18n.RuleI18nManager;
import org.sonar.core.platform.PluginClassloaderFactory;
import org.sonar.core.platform.PluginLoader;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import org.sonar.server.platform.DatabaseServerCompatibility;
import org.sonar.server.platform.DefaultServerUpgradeStatus;
import org.sonar.server.platform.StartupMetadataProvider;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.db.Database;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import org.sonar.server.platform.db.migration.DatabaseMigrationState;
import static com.google.common.base.Preconditions.checkState;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.db.Database;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import org.sonar.server.platform.db.migration.DatabaseMigration;
import org.sonar.server.platform.db.migration.DatabaseMigrationState;
import org.sonar.db.property.PropertiesDao;
import org.sonar.db.property.PropertyDto;
import org.sonar.db.rule.RuleRepositoryDto;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import org.sonar.process.ProcessProperties;
import org.sonar.server.authentication.IdentityProviderRepository;
import org.sonar.server.component.ComponentCleanerService;
import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
package org.sonar.server.platform;
import org.junit.Test;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import org.junit.Test;
import org.sonar.api.utils.System2;
import org.sonar.db.DbTester;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import static org.assertj.core.api.Assertions.assertThat;
import org.sonar.db.Database;
import org.sonar.db.dialect.Dialect;
import org.sonar.server.platform.db.migration.DatabaseMigrationState.Status;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import org.sonar.server.platform.db.migration.DatabaseMigrationState;
import org.sonar.server.ws.WsTester;
import org.sonar.db.dialect.Dialect;
import org.sonar.server.platform.db.migration.DatabaseMigration;
import org.sonar.server.platform.db.migration.DatabaseMigrationState.Status;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import org.sonar.server.platform.db.migration.DatabaseMigrationState;
import org.sonar.server.ws.WsTester;
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.version;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableSet;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import javax.annotation.Nullable;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-
-public class DatabaseVersion {
-
- public static final int LAST_VERSION = 1_502;
-
- /**
- * The minimum supported version which can be upgraded. Lower
- * versions must be previously upgraded to LTS version.
- * Note that the value can't be less than current LTS version.
- */
- public static final int MIN_UPGRADE_VERSION = 1_152;
-
- /**
- * These tables are still involved in DB migrations, so potentially
- * incorrect collation must be fixed so that joins with other
- * tables are possible.
- *
- * @see org.sonar.db.charset.ColumnDef#isInSonarQubeTable()
- */
- public static final Set<String> OLD_DROPPED_TABLES = ImmutableSet.of(
- "active_dashboards",
- "activities",
- "dashboards",
- "issue_filters",
- "issue_filter_favourites",
- "measure_filters",
- "measure_filter_favourites",
- "widgets",
- "widget_properties");
-
- /**
- * List of all the tables.
- * This list is hardcoded because we didn't succeed in using java.sql.DatabaseMetaData#getTables() in the same way
- * for all the supported databases, particularly due to Oracle results.
- */
- public static final Set<String> TABLES = ImmutableSet.of(
- "active_rules",
- "active_rule_parameters",
- "authors",
- "ce_activity",
- "ce_queue",
- "ce_task_input",
- "ce_scanner_context",
- "duplications_index",
- "events",
- "file_sources",
- "groups",
- "groups_users",
- "group_roles",
- "internal_properties",
- "issues",
- "issue_changes",
- "loaded_templates",
- "manual_measures",
- "metrics",
- "notifications",
- "organizations",
- "permission_templates",
- "perm_templates_users",
- "perm_templates_groups",
- "perm_tpl_characteristics",
- "quality_gates",
- "quality_gate_conditions",
- "projects",
- "project_links",
- "project_measures",
- "project_qprofiles",
- "properties",
- "qprofile_changes",
- "resource_index",
- "rules",
- "rules_parameters",
- "rules_profiles",
- "rule_repositories",
- "schema_migrations",
- "snapshots",
- "users",
- "user_roles",
- "user_tokens",
- "webhook_deliveries");
-
- private final DbClient dbClient;
-
- public DatabaseVersion(DbClient dbClient) {
- this.dbClient = dbClient;
- }
-
- @VisibleForTesting
- static Status getStatus(@Nullable Integer currentVersion, int lastVersion) {
- Status status = Status.FRESH_INSTALL;
- if (currentVersion != null) {
- if (currentVersion == lastVersion) {
- status = Status.UP_TO_DATE;
- } else if (currentVersion > lastVersion) {
- status = Status.REQUIRES_DOWNGRADE;
- } else {
- status = Status.REQUIRES_UPGRADE;
- }
- }
- return status;
- }
-
- public Status getStatus() {
- return getStatus(getVersion(), LAST_VERSION);
- }
-
- public Integer getVersion() {
- try (DbSession dbSession = dbClient.openSession(false)) {
- if (!DatabaseUtils.tableExists("SCHEMA_MIGRATIONS", dbSession.getConnection())) {
- return null;
- }
-
- List<Integer> versions = dbClient.schemaMigrationDao().selectVersions(dbSession);
- if (!versions.isEmpty()) {
- Collections.sort(versions);
- return versions.get(versions.size() - 1);
- }
- return null;
- }
- }
-
- public enum Status {
- UP_TO_DATE, REQUIRES_UPGRADE, REQUIRES_DOWNGRADE, FRESH_INSTALL
- }
-}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.db.version;
+
+import com.google.common.collect.ImmutableSet;
+import java.util.Set;
+
+public final class SqTables {
+ /**
+ * These tables are still involved in DB migrations, so potentially
+ * incorrect collation must be fixed so that joins with other
+ * tables are possible.
+ *
+ * @see org.sonar.db.charset.ColumnDef#isInSonarQubeTable()
+ */
+ public static final Set<String> OLD_DROPPED_TABLES = ImmutableSet.of(
+ "active_dashboards",
+ "activities",
+ "dashboards",
+ "issue_filters",
+ "issue_filter_favourites",
+ "measure_filters",
+ "measure_filter_favourites",
+ "widgets",
+ "widget_properties");
+
+ /**
+ * List of all the tables.
+ * This list is hardcoded because we didn't succeed in using java.sql.DatabaseMetaData#getTables() in the same way
+ * for all the supported databases, particularly due to Oracle results.
+ */
+ public static final Set<String> TABLES = ImmutableSet.of(
+ "active_rules",
+ "active_rule_parameters",
+ "authors",
+ "ce_activity",
+ "ce_queue",
+ "ce_task_input",
+ "ce_scanner_context",
+ "duplications_index",
+ "events",
+ "file_sources",
+ "groups",
+ "groups_users",
+ "group_roles",
+ "internal_properties",
+ "issues",
+ "issue_changes",
+ "loaded_templates",
+ "manual_measures",
+ "metrics",
+ "notifications",
+ "organizations",
+ "permission_templates",
+ "perm_templates_users",
+ "perm_templates_groups",
+ "perm_tpl_characteristics",
+ "quality_gates",
+ "quality_gate_conditions",
+ "projects",
+ "project_links",
+ "project_measures",
+ "project_qprofiles",
+ "properties",
+ "qprofile_changes",
+ "resource_index",
+ "rules",
+ "rules_parameters",
+ "rules_profiles",
+ "rule_repositories",
+ "schema_migrations",
+ "snapshots",
+ "users",
+ "user_roles",
+ "user_tokens",
+ "webhook_deliveries");
+
+ private SqTables() {
+ // prevents instantiation
+ }
+}
import org.sonar.db.dialect.MySql;
import org.sonar.db.dialect.Oracle;
import org.sonar.db.dialect.PostgreSql;
-import org.sonar.db.version.DatabaseVersion;
+import org.sonar.db.version.SqTables;
public abstract class DatabaseCommands {
private final IDataTypeFactory dbUnitFactory;
try {
connection.setAutoCommit(false);
statement = connection.createStatement();
- for (String table : DatabaseVersion.TABLES) {
+ for (String table : SqTables.TABLES) {
try {
if (shouldTruncate(connection, table)) {
statement.executeUpdate(truncateSql(table));
connection.setAutoCommit(false);
statement = connection.createStatement();
- for (String table : DatabaseVersion.TABLES) {
+ for (String table : SqTables.TABLES) {
try {
resultSet = statement.executeQuery("SELECT CASE WHEN MAX(ID) IS NULL THEN 1 ELSE MAX(ID)+1 END FROM " + table);
resultSet.next();
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2016 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.version;
-
-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 static org.assertj.core.api.Assertions.assertThat;
-
-public class DatabaseVersionTest {
-
- @Rule
- public DbTester dbTester = DbTester.create(System2.INSTANCE);
-
- private DbClient dbClient = dbTester.getDbClient();
- private DbSession dbSession = dbTester.getSession();
- private DatabaseVersion underTest = new DatabaseVersion(dbClient);
-
- @Test
- public void getVersion() {
- dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "1");
- dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "2");
- dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "4");
- dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "123");
- dbTester.getDbClient().schemaMigrationDao().insert(dbSession, "50");
- dbSession.commit();
-
- Integer version = underTest.getVersion();
-
- assertThat(version).isEqualTo(123);
- }
-
- @Test
- public void getVersion_no_rows() {
- Integer version = underTest.getVersion();
-
- assertThat(version).isNull();
- }
-
- @Test
- public void getStatus() {
- assertThat(DatabaseVersion.getStatus(null, 150)).isEqualTo(DatabaseVersion.Status.FRESH_INSTALL);
- assertThat(DatabaseVersion.getStatus(123, 150)).isEqualTo(DatabaseVersion.Status.REQUIRES_UPGRADE);
- assertThat(DatabaseVersion.getStatus(150, 150)).isEqualTo(DatabaseVersion.Status.UP_TO_DATE);
- assertThat(DatabaseVersion.getStatus(200, 150)).isEqualTo(DatabaseVersion.Status.REQUIRES_DOWNGRADE);
- }
-}