]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8445 move DatabaseVersion to sonar-db-migration
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Fri, 16 Dec 2016 08:12:19 +0000 (09:12 +0100)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Fri, 16 Dec 2016 13:35:28 +0000 (14:35 +0100)
23 files changed:
server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/charset/ColumnDef.java
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/history/MigrationHistoryImpl.java
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/DatabaseVersion.java [new file with mode: 0644]
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/DatabaseVersionTest.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java
server/sonar-server/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java
server/sonar-server/src/main/java/org/sonar/server/platform/DefaultServerUpgradeStatus.java
server/sonar-server/src/main/java/org/sonar/server/platform/Platform.java
server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/DatabaseMonitor.java
server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java
server/sonar-server/src/main/java/org/sonar/server/platform/ws/DbMigrationStatusAction.java
server/sonar-server/src/main/java/org/sonar/server/platform/ws/MigrateDbAction.java
server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java
server/sonar-server/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java
server/sonar-server/src/test/java/org/sonar/server/platform/DefaultServerUpgradeStatusTest.java
server/sonar-server/src/test/java/org/sonar/server/platform/monitoring/DatabaseMonitorTest.java
server/sonar-server/src/test/java/org/sonar/server/platform/ws/DbMigrationStatusActionTest.java
server/sonar-server/src/test/java/org/sonar/server/platform/ws/MigrateDbActionTest.java
sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java [deleted file]
sonar-db/src/main/java/org/sonar/db/version/SqTables.java [new file with mode: 0644]
sonar-db/src/test/java/org/sonar/db/DatabaseCommands.java
sonar-db/src/test/java/org/sonar/db/version/DatabaseVersionTest.java [deleted file]

index 8ca295e95aa8b43b6212434c46a635d1ecd374a4..0b13b6fc8326456d2625abe4e1eda10ce39da971 100644 (file)
@@ -63,7 +63,7 @@ import org.sonar.db.DatabaseChecker;
 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;
index da7708cbbfd18e116926df2a788c7af286f02e90..3e40e7ea011b9fb20cbbb13fa63b1eb48e066c91 100644 (file)
@@ -23,7 +23,7 @@ import java.sql.ResultSet;
 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}).
@@ -81,7 +81,7 @@ public class ColumnDef {
 
   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> {
index 8e08992f19cc39873aa09373aaafde65257294ea..b1fc36497ad0dfd58149dff0c2b6d53b4eec6b54 100644 (file)
@@ -30,11 +30,12 @@ import org.sonar.db.DbClient;
 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;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/DatabaseVersion.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/DatabaseVersion.java
new file mode 100644 (file)
index 0000000..cfe8a89
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * 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
+  }
+}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/DatabaseVersionTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/DatabaseVersionTest.java
new file mode 100644 (file)
index 0000000..ff5d406
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * 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);
+  }
+}
index bb5ba51b32ea36944114cddece555262ef307c1d..0f3f7388a4bcc5d14fc209250427154a8253e9fc 100644 (file)
@@ -32,7 +32,7 @@ import org.sonar.api.server.ServerSide;
 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;
@@ -76,7 +76,7 @@ public class BackendCleanup {
     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);
index db5548a95fe85fc3300483fbfaa37aadf1ad387f..ad44c4e20790fa39655a421e49a38c45809ccc91 100644 (file)
@@ -22,7 +22,7 @@ package org.sonar.server.platform;
 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;
 
index cae8e5c0ea0dbe1249717d74bc4a2d7220941cce..56b3df3f96214de1f343f0040b7ac23deb64c509 100644 (file)
@@ -23,7 +23,7 @@ import org.apache.commons.lang.builder.ReflectionToStringBuilder;
 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
index 44129da93576a2eeea899f494b3d791caf8799a6..95f86d74973d74000821c243084a77642fe5e0a5 100644 (file)
@@ -30,7 +30,7 @@ import org.sonar.api.utils.log.Logger;
 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;
index 4e9571805527d4c5bff2c6015db45af1167206db..3c56eefd5c409755c5495aadaae22ef649e2a0d9 100644 (file)
@@ -29,7 +29,7 @@ import org.apache.commons.dbutils.DbUtils;
 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
index a3bb6fc8fa7b8e2ab4ec5f99a54f972543312080..bd1cd454b1b69d008c8ddc14e99a4b05438122db 100644 (file)
@@ -24,7 +24,7 @@ import org.sonar.core.i18n.DefaultI18n;
 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;
index d54ce3119f95e9dc2f7d363cb5890223dca42eab..3e383c3ddc735e803b5edfa9aa6ee8f9844f7532 100644 (file)
@@ -25,7 +25,7 @@ import org.sonar.api.server.ws.Response;
 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;
index d8cccb93063987df02784d0887e94205aad0e9c6..029dd1dfd4dbb4ee6ce70782b867aed11583516e 100644 (file)
@@ -25,7 +25,7 @@ import org.sonar.api.server.ws.Response;
 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;
 
index 9aa211f5fbc50080321e08ea7ae5120d331edcac..de8a5bff7894bd4c0e77299e1d972295b17d9f83 100644 (file)
@@ -49,7 +49,7 @@ import org.sonar.db.DbSession;
 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;
index 2749a9b570a03298833ea8a8d85ad075b458a164..687e25860a85730799d7392099594b380438fe29 100644 (file)
@@ -25,7 +25,7 @@ import org.junit.rules.ExpectedException;
 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;
index fdca3f984fc4cc3c7a54cb90a19f4e1509af6e08..4b7f2fca8d693965950a1f87a738f972069acda8 100644 (file)
@@ -20,7 +20,7 @@
 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;
index 9fcd6f1e6ff505379228340e137f7e3617e98b2f..228b19650e4203074a71cb92d26a6cd21dad07bd 100644 (file)
@@ -24,7 +24,7 @@ import org.junit.Rule;
 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;
 
index c2741c626293c918d6c1ddb070a02c66413f6f79..b5c833e7d1f1b9a71fd062c648dcfffc87da00b7 100644 (file)
@@ -32,7 +32,7 @@ import org.sonar.api.utils.DateUtils;
 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;
 
index 4fb43fb15843ceff38e02bd809fac91ac81d9af7..64ef74ad62de5e6a5f9d01fab42a42ecbaeb058a 100644 (file)
@@ -33,7 +33,7 @@ import org.sonar.db.Database;
 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;
 
diff --git a/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java b/sonar-db/src/main/java/org/sonar/db/version/DatabaseVersion.java
deleted file mode 100644 (file)
index 6dcb896..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * 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
-  }
-}
diff --git a/sonar-db/src/main/java/org/sonar/db/version/SqTables.java b/sonar-db/src/main/java/org/sonar/db/version/SqTables.java
new file mode 100644 (file)
index 0000000..e08c27f
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * 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
+  }
+}
index 812ad84eb32c6d779b07a35a12cb3848155d762b..9ec7da2b031d55f24212393cf59688012128d9db 100644 (file)
@@ -43,7 +43,7 @@ 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.DatabaseVersion;
+import org.sonar.db.version.SqTables;
 
 public abstract class DatabaseCommands {
   private final IDataTypeFactory dbUnitFactory;
@@ -149,7 +149,7 @@ public abstract class DatabaseCommands {
     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));
@@ -193,7 +193,7 @@ public abstract class DatabaseCommands {
       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();
diff --git a/sonar-db/src/test/java/org/sonar/db/version/DatabaseVersionTest.java b/sonar-db/src/test/java/org/sonar/db/version/DatabaseVersionTest.java
deleted file mode 100644 (file)
index cb1e321..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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);
-  }
-}