]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8520 init H2 with Java code as with all other DBs
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Fri, 19 Jul 2019 15:12:33 +0000 (17:12 +0200)
committerSonarTech <sonartech@sonarsource.com>
Fri, 9 Aug 2019 18:21:24 +0000 (20:21 +0200)
schema-h2.ddl file is replaced by autogenerated file schema-sq.ddl (and moved to module sonar-db-dao)
files rows-h2.sql and schema_migrations-h2.ddl are dropped
command "./gradlew :server:sonar-db-dao:dumpSchema" can be used to update schema-sq.ddl
but this is optional as build will always ensure file is up-to-date with java changes and fail the build if it is not (required for CI builds)

43 files changed:
server/sonar-db-core/src/main/java/org/sonar/db/CoreDdlUtils.java [deleted file]
server/sonar-db-core/src/test/java/org/sonar/db/CoreDbTester.java
server/sonar-db-core/src/test/java/org/sonar/db/CoreDdlUtilsTest.java [deleted file]
server/sonar-db-core/src/test/java/org/sonar/db/CoreH2Database.java
server/sonar-db-core/src/test/java/org/sonar/db/CoreTestDb.java
server/sonar-db-core/src/test/resources/org/sonar/db/CoreDbTester/empty.sql [deleted file]
server/sonar-db-dao/build.gradle
server/sonar-db-dao/src/main/java/org/sonar/db/DdlUtils.java [deleted file]
server/sonar-db-dao/src/main/resources/org/sonar/db/rows-h2.sql [deleted file]
server/sonar-db-dao/src/main/resources/org/sonar/db/schema-h2.ddl [deleted file]
server/sonar-db-dao/src/main/resources/org/sonar/db/schema_migrations-h2.ddl [deleted file]
server/sonar-db-dao/src/schema/schema-sq.ddl [new file with mode: 0644]
server/sonar-db-dao/src/test/java/org/sonar/db/DdlUtilsTest.java [deleted file]
server/sonar-db-dao/src/test/java/org/sonar/db/H2Database.java
server/sonar-db-dao/src/test/java/org/sonar/db/H2DatabaseTest.java
server/sonar-db-dao/src/test/java/org/sonar/db/TestDbImpl.java
server/sonar-db-dao/src/test/java/org/sonar/db/dump/DumpSQSchema.java [new file with mode: 0644]
server/sonar-db-dao/src/test/java/org/sonar/db/dump/SQSchemaDumper.java [new file with mode: 0644]
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/engine/MigrationContainerPopulatorImpl.java
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/step/DdlChange.java
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchema.java [new file with mode: 0644]
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/DbVersion00.java [new file with mode: 0644]
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchema.java [new file with mode: 0644]
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/package-info.java [new file with mode: 0644]
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/CreateInitialSchema.java [deleted file]
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/DbVersion79.java [deleted file]
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/PopulateInitialSchema.java [deleted file]
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/package-info.java [deleted file]
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/charset/SqlExecutorTest.java
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaTest.java [new file with mode: 0644]
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/DbVersion00Test.java [new file with mode: 0644]
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaTest.java [new file with mode: 0644]
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v79/CreateInitialSchemaTest.java [deleted file]
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v79/DbVersion79Test.java [deleted file]
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v79/PopulateInitialSchemaTest.java [deleted file]
server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaTest/empty.sql [new file with mode: 0644]
server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaTest/v79.sql [new file with mode: 0644]
server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v79/CreateInitialSchemaTest/empty.sql [deleted file]
server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v79/PopulateInitialSchemaTest/v79.sql [deleted file]
server/sonar-server/src/main/java/org/sonar/server/platform/db/migration/AutoDbMigration.java
server/sonar-server/src/test/java/org/sonar/server/platform/db/migration/AutoDbMigrationH2Test.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/platform/db/migration/AutoDbMigrationTest.java

diff --git a/server/sonar-db-core/src/main/java/org/sonar/db/CoreDdlUtils.java b/server/sonar-db-core/src/main/java/org/sonar/db/CoreDdlUtils.java
deleted file mode 100644 (file)
index a219ff5..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.db;
-
-import java.io.PrintWriter;
-import java.sql.Connection;
-import org.apache.commons.io.output.NullWriter;
-import org.apache.ibatis.io.Resources;
-import org.apache.ibatis.jdbc.ScriptRunner;
-
-/**
- * Util class to create Sonar database tables
- *
- * @since 2.12
- */
-public final class CoreDdlUtils {
-
-  private CoreDdlUtils() {
-  }
-
-  public static boolean supportsDialect(String dialect) {
-    return "h2".equals(dialect);
-  }
-
-  public static void executeScript(Connection connection, String path) {
-    ScriptRunner scriptRunner = newScriptRunner(connection);
-    try {
-      scriptRunner.runScript(Resources.getResourceAsReader(path));
-      connection.commit();
-
-    } catch (Exception e) {
-      throw new IllegalStateException("Fail to restore: " + path, e);
-    }
-  }
-
-  private static ScriptRunner newScriptRunner(Connection connection) {
-    ScriptRunner scriptRunner = new ScriptRunner(connection);
-    scriptRunner.setDelimiter(";");
-    scriptRunner.setStopOnError(true);
-    scriptRunner.setLogWriter(new PrintWriter(new NullWriter()));
-    return scriptRunner;
-  }
-}
index 6df2eccaba2eb8ff902dbbb3265a5f077be4fd34..ed85f851228b3db53a3af801b27bf312274bafa2 100644 (file)
@@ -28,21 +28,19 @@ import org.apache.commons.lang.StringUtils;
 public class CoreDbTester extends AbstractDbTester<CoreTestDb> {
   private final DefaultOrganizationTesting defaultOrganizationTesting;
 
-  private CoreDbTester(String schemaPath) {
-    super(CoreTestDb.create(schemaPath));
+  private CoreDbTester(CoreTestDb testDb) {
+    super(testDb);
     this.defaultOrganizationTesting = new DefaultOrganizationTesting(this);
   }
 
   public static CoreDbTester createForSchema(Class testClass, String filename) {
     String path = StringUtils.replaceChars(testClass.getCanonicalName(), '.', '/');
     String schemaPath = path + "/" + filename;
-    return new CoreDbTester(schemaPath);
+    return new CoreDbTester(CoreTestDb.create(schemaPath));
   }
 
   public static CoreDbTester createEmpty() {
-    String path = StringUtils.replaceChars(CoreDbTester.class.getCanonicalName(), '.', '/');
-    String schemaPath = path + "/empty.sql";
-    return new CoreDbTester(schemaPath);
+    return new CoreDbTester(CoreTestDb.createEmpty());
   }
 
   @Override
diff --git a/server/sonar-db-core/src/test/java/org/sonar/db/CoreDdlUtilsTest.java b/server/sonar-db-core/src/test/java/org/sonar/db/CoreDdlUtilsTest.java
deleted file mode 100644 (file)
index 20acb79..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.db;
-
-import org.assertj.core.api.Assertions;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class CoreDdlUtilsTest {
-  @Rule
-  public ExpectedException expectedException = ExpectedException.none();
-
-  @Test
-  public void shouldSupportOnlyH2() {
-    Assertions.assertThat(CoreDdlUtils.supportsDialect("h2")).isTrue();
-    assertThat(CoreDdlUtils.supportsDialect("postgresql")).isFalse();
-    assertThat(CoreDdlUtils.supportsDialect("oracle")).isFalse();
-    assertThat(CoreDdlUtils.supportsDialect("mssql")).isFalse();
-  }
-}
index 08c7f2b22ba7aa558cca3a00d8b5eb54a8353116..f4a78eed82d10ab54c2aad35bb8501a2edd1ca91 100644 (file)
  */
 package org.sonar.db;
 
+import java.io.PrintWriter;
 import java.sql.Connection;
 import java.sql.SQLException;
 import javax.sql.DataSource;
 import org.apache.commons.dbcp2.BasicDataSource;
-import org.apache.commons.dbutils.DbUtils;
+import org.apache.commons.io.output.NullWriter;
+import org.apache.ibatis.io.Resources;
+import org.apache.ibatis.jdbc.ScriptRunner;
 import org.sonar.db.dialect.Dialect;
 import org.sonar.db.dialect.H2;
 
 import static java.lang.String.format;
 
 /**
- * H2 in-memory database, used for unit tests only.
- *
- * @since 3.2
+ * H2 in-memory database, used for unit tests only against an empty DB or a provided H2 SQL script.
  */
 public class CoreH2Database implements Database {
   private final String name;
@@ -63,18 +64,32 @@ public class CoreH2Database implements Database {
   }
 
   public void executeScript(String classloaderPath) {
-    Connection connection = null;
-    try {
-      connection = datasource.getConnection();
-      CoreDdlUtils.executeScript(connection, classloaderPath);
-
+    try (Connection connection = datasource.getConnection()) {
+      executeScript(connection, classloaderPath);
     } catch (SQLException e) {
       throw new IllegalStateException("Fail to execute script: " + classloaderPath, e);
-    } finally {
-      DbUtils.closeQuietly(connection);
     }
   }
 
+  private static void executeScript(Connection connection, String path) {
+    ScriptRunner scriptRunner = newScriptRunner(connection);
+    try {
+      scriptRunner.runScript(Resources.getResourceAsReader(path));
+      connection.commit();
+
+    } catch (Exception e) {
+      throw new IllegalStateException("Fail to restore: " + path, e);
+    }
+  }
+
+  private static ScriptRunner newScriptRunner(Connection connection) {
+    ScriptRunner scriptRunner = new ScriptRunner(connection);
+    scriptRunner.setDelimiter(";");
+    scriptRunner.setStopOnError(true);
+    scriptRunner.setLogWriter(new PrintWriter(new NullWriter()));
+    return scriptRunner;
+  }
+
   @Override
   public void stop() {
     try {
index 6699612c5bbb944e643604f35edef25093ee96a1..c7fdb601b1d58d28c1d47217e3a98f8e5cd498b4 100644 (file)
@@ -26,7 +26,9 @@ import java.net.URI;
 import java.util.Map;
 import java.util.Properties;
 import java.util.function.BiConsumer;
+import java.util.function.Consumer;
 import java.util.function.Function;
+import javax.annotation.Nullable;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
@@ -65,27 +67,35 @@ class CoreTestDb implements TestDb {
   }
 
   static CoreTestDb create(String schemaPath) {
+    requireNonNull(schemaPath, "schemaPath can't be null");
+
     return new CoreTestDb().init(schemaPath);
   }
 
-  private CoreTestDb init(String schemaPath) {
-    requireNonNull(schemaPath, "schemaPath can't be null");
+  static CoreTestDb createEmpty() {
+    return new CoreTestDb().init(null);
+  }
 
+  private CoreTestDb init(@Nullable String schemaPath) {
     Function<Settings, Database> databaseCreator = settings -> {
       String dialect = settings.getString("sonar.jdbc.dialect");
       if (dialect != null && !"h2".equals(dialect)) {
         return new DefaultDatabase(new LogbackHelper(), settings);
       }
-      return new CoreH2Database("h2Tests-" + DigestUtils.md5Hex(schemaPath));
+      return new CoreH2Database("h2Tests-" + (schemaPath == null ?  "empty" : DigestUtils.md5Hex(schemaPath)));
     };
-    Function<Database, Boolean> databaseInitializer = database -> {
-      // will fail if not H2
+    Consumer<Database> databaseInitializer = database -> {
+      if (schemaPath == null) {
+        return;
+      }
+
+      // scripts are assumed to be using H2 specific syntax, ignore the test if not on H2
       if (!database.getDialect().getId().equals("h2")) {
-        return false;
+        database.stop();
+        throw new AssumptionViolatedException("This test is intended to be run on H2 only");
       }
 
       ((CoreH2Database) database).executeScript(schemaPath);
-      return true;
     };
     BiConsumer<Database, Boolean> noPostStartAction = (db, created) -> {
     };
@@ -94,20 +104,17 @@ class CoreTestDb implements TestDb {
     return this;
   }
 
-  protected void init(Function<Settings, Database> databaseSupplier,
-    Function<Database, Boolean> databaseInitializer,
+  protected void init(Function<Settings, Database> databaseCreator,
+    Consumer<Database> databaseInitializer,
     BiConsumer<Database, Boolean> extendedStart) {
     if (db == null) {
       Settings settings = new MapSettings().addProperties(System.getProperties());
       loadOrchestratorSettings(settings);
       logJdbcSettings(settings);
-      db = databaseSupplier.apply(settings);
+      db = databaseCreator.apply(settings);
       db.start();
 
-      if (!databaseInitializer.apply(db)) {
-        db.stop();
-        throw new IllegalStateException("Can't apply init script");
-      }
+      databaseInitializer.accept(db);
       Loggers.get(getClass()).debug("Test Database: " + db);
 
       commands = DatabaseCommands.forDialect(db.getDialect());
diff --git a/server/sonar-db-core/src/test/resources/org/sonar/db/CoreDbTester/empty.sql b/server/sonar-db-core/src/test/resources/org/sonar/db/CoreDbTester/empty.sql
deleted file mode 100644 (file)
index e69de29..0000000
index 18f3fefcfe85b09b07f85c26687ce23d0d22e042..b78b2b6fadacb8763fc9439b8edc138598ed2f63 100644 (file)
@@ -17,6 +17,7 @@ dependencies {
   compile project(path: ':sonar-plugin-api', configuration: 'shadow')
 
   compile project(':server:sonar-db-core')
+  compile project(':server:sonar-db-migration')
   compile project(':sonar-core')
 
   compileOnly 'com.google.code.findbugs:jsr305'
@@ -44,6 +45,12 @@ test {
   systemProperty 'orchestrator.configUrl', System.getProperty('orchestrator.configUrl')
 }
 
+task dumpSchema(type:JavaExec) {
+    main = 'org.sonar.db.dump.DumpSQSchema'
+    classpath = sourceSets.test.runtimeClasspath
+}
+tasks.check.dependsOn dumpSchema
+
 task testJar(type: Jar) {
   classifier = 'tests'
   from sourceSets.test.output
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/DdlUtils.java b/server/sonar-db-dao/src/main/java/org/sonar/db/DdlUtils.java
deleted file mode 100644 (file)
index b3bf45b..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.db;
-
-import java.sql.Connection;
-
-import static org.sonar.db.CoreDdlUtils.executeScript;
-
-public class DdlUtils {
-
-  private DdlUtils() {
-    // prevents instantiation
-  }
-
-  /**
-   * The connection is commited in this method but not closed.
-   */
-  public static void createSchema(Connection connection, String dialect, boolean createSchemaMigrations) {
-    if (createSchemaMigrations) {
-      executeScript(connection, "org/sonar/db/schema_migrations-" + dialect + ".ddl");
-    }
-    executeScript(connection, "org/sonar/db/schema-" + dialect + ".ddl");
-    executeScript(connection, "org/sonar/db/rows-" + dialect + ".sql");
-  }
-}
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/rows-h2.sql b/server/sonar-db-dao/src/main/resources/org/sonar/db/rows-h2.sql
deleted file mode 100644 (file)
index fb12115..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-INSERT INTO USERS(ID, UUID, LOGIN, NAME, EMAIL, EXTERNAL_ID, EXTERNAL_LOGIN, EXTERNAL_IDENTITY_PROVIDER, USER_LOCAL, CRYPTED_PASSWORD, SALT, HASH_METHOD, IS_ROOT, ONBOARDED, CREATED_AT, UPDATED_AT) VALUES (1, 'UuidnciQUUs7Zd3KPvFD', 'admin', 'Administrator', null, 'admin', 'admin', 'sonarqube', true, '$2a$12$uCkkXmhW5ThVK8mpBvnXOOJRLd64LJeHTeCkSuB3lfaR2N0AYBaSi', null, 'BCRYPT', false, true, '1418215735482', '1418215735482');
-ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 2;
-
-INSERT INTO GROUPS(ID, ORGANIZATION_UUID, NAME, DESCRIPTION, CREATED_AT, UPDATED_AT) VALUES (1, 'AVdqnciQUUs7Zd3KPvFD', 'sonar-administrators', 'System administrators', '2011-09-26 22:27:51.0', '2011-09-26 22:27:51.0');
-INSERT INTO GROUPS(ID, ORGANIZATION_UUID, NAME, DESCRIPTION, CREATED_AT, UPDATED_AT) VALUES (2, 'AVdqnciQUUs7Zd3KPvFD', 'sonar-users', 'Any new users created will automatically join this group', '2011-09-26 22:27:51.0', '2011-09-26 22:27:51.0');
-ALTER TABLE GROUPS ALTER COLUMN ID RESTART WITH 3;
-
-INSERT INTO QUALITY_GATES(ID, UUID, NAME, IS_BUILT_IN, CREATED_AT, UPDATED_AT) VALUES (1, 'AWASGWAKYOI_InFKS3UF', 'Sonar way', true, '2011-09-26 22:27:51.0', '2011-09-26 22:27:51.0');
-
-INSERT INTO ORGANIZATIONS (UUID, KEE, NAME, GUARDED, NEW_PROJECT_PRIVATE, DEFAULT_GROUP_ID, DEFAULT_QUALITY_GATE_UUID, SUBSCRIPTION, CREATED_AT, UPDATED_AT) VALUES ('AVdqnciQUUs7Zd3KPvFD', 'default-organization', 'Default Organization', true, false, 2, 'AWASGWAKYOI_InFKS3UF', 'SONARQUBE', '1474962596482', '1474962596482');
-INSERT INTO ORG_QUALITY_GATES (UUID, ORGANIZATION_UUID, QUALITY_GATE_UUID) VALUES ('AWAwlGzz-5zzlJtFU9G5', 'AVdqnciQUUs7Zd3KPvFD', 'AWASGWAKYOI_InFKS3UF');
-
-INSERT INTO INTERNAL_PROPERTIES (KEE, IS_EMPTY, TEXT_VALUE, CREATED_AT) VALUES ('organization.default', false, 'AVdqnciQUUs7Zd3KPvFD', '1474962596482');
-
-INSERT INTO GROUP_ROLES(ID, ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE) VALUES (1, 'AVdqnciQUUs7Zd3KPvFD', 1, null, 'admin');
-INSERT INTO GROUP_ROLES(ID, ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE) VALUES (2, 'AVdqnciQUUs7Zd3KPvFD', 1, null, 'profileadmin');
-INSERT INTO GROUP_ROLES(ID, ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE) VALUES (3, 'AVdqnciQUUs7Zd3KPvFD', 1, null, 'gateadmin');
-INSERT INTO GROUP_ROLES(ID, ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE) VALUES (4, 'AVdqnciQUUs7Zd3KPvFD', null, null, 'scan');
-INSERT INTO GROUP_ROLES(ID, ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE) VALUES (5, 'AVdqnciQUUs7Zd3KPvFD', null, null, 'provisioning');
-INSERT INTO GROUP_ROLES(ID, ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE) VALUES (6, 'AVdqnciQUUs7Zd3KPvFD', 1, null, 'provisioning');
-INSERT INTO GROUP_ROLES(ID, ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE) VALUES (7, 'AVdqnciQUUs7Zd3KPvFD', 1, null, 'applicationcreator');
-INSERT INTO GROUP_ROLES(ID, ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE) VALUES (8, 'AVdqnciQUUs7Zd3KPvFD', 1, null, 'portfoliocreator');
-ALTER TABLE GROUP_ROLES ALTER COLUMN ID RESTART WITH 9;
-
-INSERT INTO GROUPS_USERS(USER_ID, GROUP_ID) VALUES (1, 1);
-INSERT INTO GROUPS_USERS(USER_ID, GROUP_ID) VALUES (1, 2);
-
-INSERT INTO ORGANIZATION_MEMBERS(ORGANIZATION_UUID, USER_ID) VALUES ('AVdqnciQUUs7Zd3KPvFD', 1);
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/schema-h2.ddl b/server/sonar-db-dao/src/main/resources/org/sonar/db/schema-h2.ddl
deleted file mode 100644 (file)
index 8b28fb4..0000000
+++ /dev/null
@@ -1,976 +0,0 @@
-CREATE TABLE "ORGANIZATIONS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(300) NOT NULL,
-  "NAME" VARCHAR(300) NOT NULL,
-  "DESCRIPTION" VARCHAR(256),
-  "URL" VARCHAR(256),
-  "AVATAR_URL" VARCHAR(256),
-  "GUARDED" BOOLEAN,
-  "DEFAULT_PERM_TEMPLATE_PROJECT" VARCHAR(40),
-  "DEFAULT_PERM_TEMPLATE_APP" VARCHAR(40),
-  "DEFAULT_PERM_TEMPLATE_PORT" VARCHAR(40),
-  "DEFAULT_GROUP_ID" INTEGER,
-  "DEFAULT_QUALITY_GATE_UUID" VARCHAR(40) NOT NULL,
-  "NEW_PROJECT_PRIVATE" BOOLEAN NOT NULL,
-  "SUBSCRIPTION" VARCHAR(40) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ORGANIZATIONS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "ORGANIZATION_KEY" ON "ORGANIZATIONS" ("KEE");
-
-CREATE TABLE "ORGANIZATION_MEMBERS" (
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "USER_ID" INTEGER NOT NULL,
-
-  CONSTRAINT "PK_ORGANIZATION_MEMBERS" PRIMARY KEY ("ORGANIZATION_UUID", "USER_ID")
-);
-CREATE INDEX "IX_ORG_MEMBERS_ON_USER_ID" ON "ORGANIZATION_MEMBERS" ("USER_ID");
-
-CREATE TABLE "GROUPS_USERS" (
-  "USER_ID" INTEGER,
-  "GROUP_ID" INTEGER
-);
-CREATE INDEX "INDEX_GROUPS_USERS_ON_GROUP_ID" ON "GROUPS_USERS" ("GROUP_ID");
-CREATE INDEX "INDEX_GROUPS_USERS_ON_USER_ID" ON "GROUPS_USERS" ("USER_ID");
-CREATE UNIQUE INDEX "GROUPS_USERS_UNIQUE" ON "GROUPS_USERS" ("GROUP_ID", "USER_ID");
-
-
-CREATE TABLE "RULES_PARAMETERS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "RULE_ID" INTEGER NOT NULL,
-  "NAME" VARCHAR(128) NOT NULL,
-  "PARAM_TYPE" VARCHAR(512) NOT NULL,
-  "DEFAULT_VALUE" VARCHAR(4000),
-  "DESCRIPTION" VARCHAR(4000)
-);
-CREATE INDEX "RULES_PARAMETERS_RULE_ID" ON "RULES_PARAMETERS" ("RULE_ID");
-CREATE UNIQUE INDEX "RULES_PARAMETERS_UNIQUE" ON "RULES_PARAMETERS" ("RULE_ID", "NAME");
-
-
-CREATE TABLE "RULES_PROFILES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "NAME" VARCHAR(100) NOT NULL,
-  "LANGUAGE" VARCHAR(20),
-  "KEE" VARCHAR(255) NOT NULL,
-  "RULES_UPDATED_AT" VARCHAR(100),
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP,
-  "IS_BUILT_IN" BOOLEAN NOT NULL
-);
-CREATE UNIQUE INDEX "UNIQ_QPROF_KEY" ON "RULES_PROFILES" ("KEE");
-
-
-CREATE TABLE "ORG_QPROFILES" (
-  "UUID" VARCHAR(255) NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "RULES_PROFILE_UUID" VARCHAR(255) NOT NULL,
-  "PARENT_UUID" VARCHAR(255),
-  "LAST_USED" BIGINT,
-  "USER_UPDATED_AT" BIGINT,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ORG_QPROFILES" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "ORG_QPROFILES_ORG_UUID" ON "ORG_QPROFILES" ("ORGANIZATION_UUID");
-CREATE INDEX "ORG_QPROFILES_RP_UUID" ON "ORG_QPROFILES" ("RULES_PROFILE_UUID");
-CREATE INDEX "ORG_QPROFILES_PARENT_UUID" ON "ORG_QPROFILES" ("PARENT_UUID");
-
-
-CREATE TABLE "DEFAULT_QPROFILES" (
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "LANGUAGE" VARCHAR(20) NOT NULL,
-  "QPROFILE_UUID" VARCHAR(255) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_DEFAULT_QPROFILES" PRIMARY KEY ("ORGANIZATION_UUID", "LANGUAGE")
-);
-CREATE UNIQUE INDEX "UNIQ_DEFAULT_QPROFILES_UUID" ON "DEFAULT_QPROFILES" ("QPROFILE_UUID");
-
-
-CREATE TABLE "PROJECT_QPROFILES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "PROFILE_KEY" VARCHAR(50) NOT NULL
-);
-CREATE UNIQUE INDEX "UNIQ_PROJECT_QPROFILES" ON "PROJECT_QPROFILES" ("PROJECT_UUID", "PROFILE_KEY");
-
-
-CREATE TABLE "QPROFILE_EDIT_USERS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "USER_ID" INTEGER NOT NULL,
-  "QPROFILE_UUID" VARCHAR(255) NOT NULL,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_QPROFILE_EDIT_USERS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "QPROFILE_EDIT_USERS_QPROFILE" ON "QPROFILE_EDIT_USERS" ("QPROFILE_UUID");
-CREATE UNIQUE INDEX "QPROFILE_EDIT_USERS_UNIQUE" ON "QPROFILE_EDIT_USERS" ("USER_ID", "QPROFILE_UUID");
-
-
-CREATE TABLE "QPROFILE_EDIT_GROUPS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "GROUP_ID" INTEGER NOT NULL,
-  "QPROFILE_UUID" VARCHAR(255) NOT NULL,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_QPROFILE_EDIT_GROUPS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "QPROFILE_EDIT_GROUPS_QPROFILE" ON "QPROFILE_EDIT_GROUPS" ("QPROFILE_UUID");
-CREATE UNIQUE INDEX "QPROFILE_EDIT_GROUPS_UNIQUE" ON "QPROFILE_EDIT_GROUPS" ("GROUP_ID", "QPROFILE_UUID");
-
-
-CREATE TABLE "GROUPS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(500),
-  "DESCRIPTION" VARCHAR(200),
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP
-);
-
-
-CREATE TABLE "SNAPSHOTS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(50) NOT NULL,
-  "CREATED_AT" BIGINT,
-  "BUILD_DATE" BIGINT,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "STATUS" VARCHAR(4) NOT NULL DEFAULT 'U',
-  "PURGE_STATUS" INTEGER,
-  "ISLAST" BOOLEAN NOT NULL DEFAULT FALSE,
-  "VERSION" VARCHAR(500),
-  "BUILD_STRING" VARCHAR(100),
-  "PERIOD1_MODE" VARCHAR(100),
-  "PERIOD1_PARAM" VARCHAR(100),
-  "PERIOD1_DATE" BIGINT,
-  "PERIOD2_MODE" VARCHAR(100),
-  "PERIOD2_PARAM" VARCHAR(100),
-  "PERIOD2_DATE" BIGINT,
-  "PERIOD3_MODE" VARCHAR(100),
-  "PERIOD3_PARAM" VARCHAR(100),
-  "PERIOD3_DATE" BIGINT,
-  "PERIOD4_MODE" VARCHAR(100),
-  "PERIOD4_PARAM" VARCHAR(100),
-  "PERIOD4_DATE" BIGINT,
-  "PERIOD5_MODE" VARCHAR(100),
-  "PERIOD5_PARAM" VARCHAR(100),
-  "PERIOD5_DATE" BIGINT,
-  "REVISION" VARCHAR(100)
-);
-CREATE INDEX "SNAPSHOT_COMPONENT" ON "SNAPSHOTS" ("COMPONENT_UUID");
-CREATE UNIQUE INDEX "ANALYSES_UUID" ON "SNAPSHOTS" ("UUID");
-
-CREATE TABLE "GROUP_ROLES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "GROUP_ID" INTEGER,
-  "RESOURCE_ID" INTEGER,
-  "ROLE" VARCHAR(64) NOT NULL
-);
-CREATE INDEX "GROUP_ROLES_RESOURCE" ON "GROUP_ROLES" ("RESOURCE_ID");
-CREATE UNIQUE INDEX "UNIQ_GROUP_ROLES" ON "GROUP_ROLES" ("ORGANIZATION_UUID", "GROUP_ID", "RESOURCE_ID", "ROLE");
-
-
-CREATE TABLE "RULE_REPOSITORIES" (
-  "KEE" VARCHAR(200) NOT NULL,
-  "LANGUAGE" VARCHAR(20) NOT NULL,
-  "NAME" VARCHAR(4000) NOT NULL,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_RULE_REPOSITORIES" PRIMARY KEY ("KEE")
-);
-
-CREATE TABLE "DEPRECATED_RULE_KEYS" (
-  "UUID"  VARCHAR(40) NOT NULL,
-  "RULE_ID" INTEGER NOT NULL,
-  "OLD_REPOSITORY_KEY" VARCHAR(200) NOT NULL,
-  "OLD_RULE_KEY" VARCHAR(255) NOT NULL,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_DEPRECATED_RULE_KEYS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "UNIQ_DEPRECATED_RULE_KEYS" ON "DEPRECATED_RULE_KEYS" ("OLD_REPOSITORY_KEY", "OLD_RULE_KEY");
-CREATE INDEX "RULE_ID_DEPRECATED_RULE_KEYS" ON "DEPRECATED_RULE_KEYS" ("RULE_ID");
-
-CREATE TABLE "RULES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PLUGIN_KEY" VARCHAR(200),
-  "PLUGIN_RULE_KEY" VARCHAR(200) NOT NULL,
-  "PLUGIN_NAME" VARCHAR(255) NOT NULL,
-  "DESCRIPTION" VARCHAR(16777215),
-  "DESCRIPTION_FORMAT" VARCHAR(20),
-  "PRIORITY" INTEGER,
-  "IS_TEMPLATE" BOOLEAN DEFAULT FALSE,
-  "IS_EXTERNAL" BOOLEAN NOT NULL,
-  "IS_AD_HOC" BOOLEAN NOT NULL,
-  "TEMPLATE_ID" INTEGER,
-  "PLUGIN_CONFIG_KEY" VARCHAR(200),
-  "NAME" VARCHAR(200),
-  "STATUS" VARCHAR(40),
-  "LANGUAGE" VARCHAR(20),
-  "SCOPE" VARCHAR(20) NOT NULL,
-  "DEF_REMEDIATION_FUNCTION" VARCHAR(20),
-  "DEF_REMEDIATION_GAP_MULT" VARCHAR(20),
-  "DEF_REMEDIATION_BASE_EFFORT" VARCHAR(20),
-  "GAP_DESCRIPTION" VARCHAR(4000),
-  "SYSTEM_TAGS" VARCHAR(4000),
-  "SECURITY_STANDARDS" VARCHAR(4000),
-  "RULE_TYPE" TINYINT,
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT
-);
-CREATE UNIQUE INDEX "RULES_REPO_KEY" ON "RULES" ("PLUGIN_NAME", "PLUGIN_RULE_KEY");
-
-CREATE TABLE "RULES_METADATA" (
-  "RULE_ID" INTEGER NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "NOTE_DATA" CLOB,
-  "NOTE_USER_UUID" VARCHAR(255),
-  "NOTE_CREATED_AT" BIGINT,
-  "NOTE_UPDATED_AT" BIGINT,
-  "REMEDIATION_FUNCTION" VARCHAR(20),
-  "REMEDIATION_GAP_MULT" VARCHAR(20),
-  "REMEDIATION_BASE_EFFORT" VARCHAR(20),
-  "TAGS" VARCHAR(4000),
-  "AD_HOC_NAME" VARCHAR(200),
-  "AD_HOC_DESCRIPTION" VARCHAR(16777215),
-  "AD_HOC_SEVERITY" VARCHAR(10),
-  "AD_HOC_TYPE" TINYINT,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_RULES_METADATA" PRIMARY KEY ("RULE_ID", "ORGANIZATION_UUID")
-);
-
-CREATE TABLE "EVENTS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(400),
-  "ANALYSIS_UUID" VARCHAR(50) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "CATEGORY" VARCHAR(50),
-  "EVENT_DATE" BIGINT NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "DESCRIPTION" VARCHAR(4000),
-  "EVENT_DATA"  VARCHAR(4000)
-);
-CREATE INDEX "EVENTS_ANALYSIS" ON "EVENTS" ("ANALYSIS_UUID");
-CREATE INDEX "EVENTS_COMPONENT_UUID" ON "EVENTS" ("COMPONENT_UUID");
-CREATE UNIQUE INDEX "EVENTS_UUID" ON "EVENTS" ("UUID");
-
-CREATE TABLE "EVENT_COMPONENT_CHANGES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "EVENT_UUID" VARCHAR(40) NOT NULL,
-  "EVENT_COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "EVENT_ANALYSIS_UUID" VARCHAR(50) NOT NULL,
-  "CHANGE_CATEGORY" VARCHAR(20) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "COMPONENT_KEY" VARCHAR(400) NOT NULL,
-  "COMPONENT_NAME" VARCHAR(2000) NOT NULL,
-  "COMPONENT_BRANCH_KEY" VARCHAR(255),
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_EVENT_COMPONENT_CHANGES" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "EVENT_COMPONENT_CHANGES_UNIQUE" ON "EVENT_COMPONENT_CHANGES" ("EVENT_UUID", "CHANGE_CATEGORY", "COMPONENT_UUID");
-CREATE INDEX "EVENT_CPNT_CHANGES_CPNT" ON "EVENT_COMPONENT_CHANGES" ("EVENT_COMPONENT_UUID");
-CREATE INDEX "EVENT_CPNT_CHANGES_ANALYSIS" ON "EVENT_COMPONENT_CHANGES" ("EVENT_ANALYSIS_UUID");
-
-
-CREATE TABLE "QUALITY_GATES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(100) NOT NULL,
-  "IS_BUILT_IN" BOOLEAN NOT NULL,
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP,
-);
-CREATE UNIQUE INDEX "UNIQ_QUALITY_GATES_UUID" ON "QUALITY_GATES" ("UUID");
-
-
-CREATE TABLE "QUALITY_GATE_CONDITIONS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "QGATE_ID" INTEGER,
-  "METRIC_ID" INTEGER,
-  "OPERATOR" VARCHAR(3),
-  "VALUE_ERROR" VARCHAR(64),
-  "VALUE_WARNING" VARCHAR(64),
-  "PERIOD" INTEGER,
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP,
-);
-
-CREATE TABLE "ORG_QUALITY_GATES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "QUALITY_GATE_UUID" VARCHAR(40) NOT NULL,
-
-  CONSTRAINT "PK_ORG_QUALITY_GATES" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "UNIQ_ORG_QUALITY_GATES" ON "ORG_QUALITY_GATES" ("ORGANIZATION_UUID","QUALITY_GATE_UUID");
-
-CREATE TABLE "PROJECT_QGATES" (
-"PROJECT_UUID" VARCHAR(40) NOT NULL,
-"QUALITY_GATE_UUID" VARCHAR(40) NOT NULL,
-
-CONSTRAINT "PK_PROJECT_QGATES" PRIMARY KEY ("PROJECT_UUID")
-);
-CREATE UNIQUE INDEX "UNIQ_PROJECT_QGATES" ON "PROJECT_QGATES" ("PROJECT_UUID", "QUALITY_GATE_UUID");
-
-CREATE TABLE "PROPERTIES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PROP_KEY" VARCHAR(512) NOT NULL,
-  "RESOURCE_ID" INTEGER,
-  "USER_ID" INTEGER,
-  "IS_EMPTY" BOOLEAN NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-  "CLOB_VALUE" CLOB,
-  "CREATED_AT" BIGINT NOT NULL
-);
-CREATE INDEX "PROPERTIES_KEY" ON "PROPERTIES" ("PROP_KEY");
-
-
-CREATE TABLE "PROJECT_LINKS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "LINK_TYPE" VARCHAR(20) NOT NULL,
-  "NAME" VARCHAR(128),
-  "HREF" VARCHAR(2048) NOT NULL,
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT,
-
-   CONSTRAINT "PK_PROJECT_LINKS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "PROJECT_LINKS_PROJECT" ON "PROJECT_LINKS" ("PROJECT_UUID");
-
-
-CREATE TABLE "DUPLICATIONS_INDEX" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ANALYSIS_UUID" VARCHAR(50) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "HASH" VARCHAR(50) NOT NULL,
-  "INDEX_IN_FILE" INTEGER NOT NULL,
-  "START_LINE" INTEGER NOT NULL,
-  "END_LINE" INTEGER NOT NULL
-);
-CREATE INDEX "DUPLICATIONS_INDEX_HASH" ON "DUPLICATIONS_INDEX" ("HASH");
-CREATE INDEX "DUPLICATION_ANALYSIS_COMPONENT" ON "DUPLICATIONS_INDEX" ("ANALYSIS_UUID", "COMPONENT_UUID");
-
-
-CREATE TABLE "LIVE_MEASURES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "METRIC_ID" INTEGER NOT NULL,
-  "VALUE" DOUBLE,
-  "TEXT_VALUE" VARCHAR(4000),
-  "VARIATION" DOUBLE,
-  "MEASURE_DATA" BINARY,
-  "UPDATE_MARKER" VARCHAR(40),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_LIVE_MEASURES" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "LIVE_MEASURES_PROJECT" ON "LIVE_MEASURES" ("PROJECT_UUID");
-CREATE UNIQUE INDEX "LIVE_MEASURES_COMPONENT" ON "LIVE_MEASURES" ("COMPONENT_UUID", "METRIC_ID");
-
-
-CREATE TABLE "PROJECT_MEASURES" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "VALUE" DOUBLE,
-  "METRIC_ID" INTEGER NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "ANALYSIS_UUID" VARCHAR(50) NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-  "ALERT_STATUS" VARCHAR(5),
-  "ALERT_TEXT" VARCHAR(4000),
-  "DESCRIPTION" VARCHAR(4000),
-  "PERSON_ID" INTEGER,
-  "VARIATION_VALUE_1" DOUBLE,
-  "VARIATION_VALUE_2" DOUBLE,
-  "VARIATION_VALUE_3" DOUBLE,
-  "VARIATION_VALUE_4" DOUBLE,
-  "VARIATION_VALUE_5" DOUBLE,
-  "MEASURE_DATA" BINARY
-);
-CREATE INDEX "MEASURES_COMPONENT_UUID" ON "PROJECT_MEASURES" ("COMPONENT_UUID");
-CREATE INDEX "MEASURES_ANALYSIS_METRIC" ON "PROJECT_MEASURES" ("ANALYSIS_UUID", "METRIC_ID");
-
-
-CREATE TABLE "INTERNAL_PROPERTIES" (
-  "KEE" VARCHAR(20) NOT NULL,
-  "IS_EMPTY" BOOLEAN NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-  "CLOB_VALUE" CLOB,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_INTERNAL_PROPERTIES" PRIMARY KEY ("KEE")
-);
-
-
-CREATE TABLE "PROJECTS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(400),
-  "UUID" VARCHAR(50) NOT NULL,
-  "UUID_PATH" VARCHAR(1500) NOT NULL,
-  "ROOT_UUID" VARCHAR(50) NOT NULL,
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "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(500),
-  "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_ORGANIZATION" ON "PROJECTS" ("ORGANIZATION_UUID");
-CREATE UNIQUE 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");
-
-CREATE TABLE "INTERNAL_COMPONENT_PROPS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "KEE" VARCHAR(512) NOT NULL,
-  "VALUE" VARCHAR(4000),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-  CONSTRAINT "INTERNAL_COMPONENT_PROPS_UUID" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "UNIQUE_COMPONENT_UUID_KEE" ON "INTERNAL_COMPONENT_PROPS" ("COMPONENT_UUID", "KEE");
-
-CREATE TABLE "MANUAL_MEASURES" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "METRIC_ID" INTEGER NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "VALUE" DOUBLE,
-  "TEXT_VALUE" VARCHAR(4000),
-  "USER_UUID" VARCHAR(255),
-  "DESCRIPTION" VARCHAR(4000),
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT
-);
-CREATE INDEX "MANUAL_MEASURES_COMPONENT_UUID" ON "MANUAL_MEASURES" ("COMPONENT_UUID");
-
-
-CREATE TABLE "ACTIVE_RULES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PROFILE_ID" INTEGER NOT NULL,
-  "RULE_ID" INTEGER NOT NULL,
-  "FAILURE_LEVEL" INTEGER NOT NULL,
-  "INHERITANCE" VARCHAR(10),
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT
-);
-CREATE UNIQUE INDEX "ACTIVE_RULES_UNIQUE" ON "ACTIVE_RULES" ("PROFILE_ID","RULE_ID");
-
-
-CREATE TABLE "NOTIFICATIONS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "DATA" BLOB
-);
-
-
-CREATE TABLE "USER_ROLES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "USER_ID" INTEGER,
-  "RESOURCE_ID" INTEGER,
-  "ROLE" VARCHAR(64) NOT NULL
-);
-CREATE INDEX "USER_ROLES_RESOURCE" ON "USER_ROLES" ("RESOURCE_ID");
-CREATE INDEX "USER_ROLES_USER" ON "USER_ROLES" ("USER_ID");
-
-
-CREATE TABLE "ACTIVE_RULE_PARAMETERS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ACTIVE_RULE_ID" INTEGER NOT NULL,
-  "RULES_PARAMETER_ID" INTEGER NOT NULL,
-  "RULES_PARAMETER_KEY" VARCHAR(128),
-  "VALUE" VARCHAR(4000)
-);
-CREATE INDEX "IX_ARP_ON_ACTIVE_RULE_ID" ON "ACTIVE_RULE_PARAMETERS" ("ACTIVE_RULE_ID");
-
-
-CREATE TABLE "USERS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(255) NOT NULL,
-  "LOGIN" VARCHAR(255) NOT NULL,
-  "NAME" VARCHAR(200),
-  "EMAIL" VARCHAR(100),
-  "CRYPTED_PASSWORD" VARCHAR(100),
-  "SALT" VARCHAR(40),
-  "HASH_METHOD" VARCHAR(10),
-  "ACTIVE" BOOLEAN DEFAULT TRUE,
-  "SCM_ACCOUNTS" VARCHAR(4000),
-  "EXTERNAL_ID" VARCHAR(255) NOT NULL,
-  "EXTERNAL_LOGIN" VARCHAR(255) NOT NULL,
-  "EXTERNAL_IDENTITY_PROVIDER" VARCHAR(100) NOT NULL,
-  "IS_ROOT" BOOLEAN NOT NULL,
-  "USER_LOCAL" BOOLEAN,
-  "ONBOARDED" BOOLEAN NOT NULL,
-  "HOMEPAGE_TYPE" VARCHAR(40),
-  "HOMEPAGE_PARAMETER" VARCHAR(40),
-  "ORGANIZATION_UUID" VARCHAR(40),
-  "LAST_CONNECTION_DATE" BIGINT,
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT
-);
-CREATE UNIQUE INDEX "USERS_UUID" ON "USERS" ("UUID");
-CREATE UNIQUE INDEX "USERS_LOGIN" ON "USERS" ("LOGIN");
-CREATE UNIQUE INDEX "UNIQ_EXTERNAL_ID" ON "USERS" ("EXTERNAL_IDENTITY_PROVIDER", "EXTERNAL_ID");
-CREATE UNIQUE INDEX "UNIQ_EXTERNAL_LOGIN" ON "USERS" ("EXTERNAL_IDENTITY_PROVIDER", "EXTERNAL_LOGIN");
-CREATE INDEX "USERS_UPDATED_AT" ON "USERS" ("UPDATED_AT");
-
-
-CREATE TABLE "METRICS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "NAME" VARCHAR(64) NOT NULL,
-  "DESCRIPTION" VARCHAR(255),
-  "DIRECTION" INTEGER NOT NULL DEFAULT 0,
-  "DOMAIN" VARCHAR(64),
-  "SHORT_NAME" VARCHAR(64),
-  "QUALITATIVE" BOOLEAN NOT NULL DEFAULT FALSE,
-  "VAL_TYPE" VARCHAR(8),
-  "USER_MANAGED" BOOLEAN DEFAULT FALSE,
-  "ENABLED" BOOLEAN DEFAULT TRUE,
-  "WORST_VALUE" DOUBLE,
-  "BEST_VALUE" DOUBLE,
-  "OPTIMIZED_BEST_VALUE" BOOLEAN,
-  "HIDDEN" BOOLEAN,
-  "DELETE_HISTORICAL_DATA" BOOLEAN,
-  "DECIMAL_SCALE" INTEGER
-);
-CREATE UNIQUE INDEX "METRICS_UNIQUE_NAME" ON "METRICS" ("NAME");
-
-
-CREATE TABLE "ISSUES" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "KEE" VARCHAR(50) UNIQUE NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50),
-  "PROJECT_UUID" VARCHAR(50),
-  "RULE_ID" INTEGER,
-  "SEVERITY" VARCHAR(10),
-  "MANUAL_SEVERITY" BOOLEAN NOT NULL,
-  "MESSAGE" VARCHAR(4000),
-  "LINE" INTEGER,
-  "GAP" DOUBLE,
-  "EFFORT" INTEGER,
-  "STATUS" VARCHAR(20),
-  "RESOLUTION" VARCHAR(20),
-  "CHECKSUM" VARCHAR(1000),
-  "REPORTER" VARCHAR(255),
-  "ASSIGNEE" VARCHAR(255),
-  "AUTHOR_LOGIN" VARCHAR(255),
-  "ACTION_PLAN_KEY" VARCHAR(50) NULL,
-  "ISSUE_ATTRIBUTES" VARCHAR(4000),
-  "TAGS" VARCHAR(4000),
-  "ISSUE_CREATION_DATE" BIGINT,
-  "ISSUE_CLOSE_DATE" BIGINT,
-  "ISSUE_UPDATE_DATE" BIGINT,
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT,
-  "LOCATIONS" BLOB,
-  "ISSUE_TYPE" TINYINT,
-  "FROM_HOTSPOT" BOOLEAN NULL
-);
-CREATE UNIQUE INDEX "ISSUES_KEE" ON "ISSUES" ("KEE");
-CREATE INDEX "ISSUES_COMPONENT_UUID" ON "ISSUES" ("COMPONENT_UUID");
-CREATE INDEX "ISSUES_PROJECT_UUID" ON "ISSUES" ("PROJECT_UUID");
-CREATE INDEX "ISSUES_RULE_ID" ON "ISSUES" ("RULE_ID");
-CREATE INDEX "ISSUES_RESOLUTION" ON "ISSUES" ("RESOLUTION");
-CREATE INDEX "ISSUES_ASSIGNEE" ON "ISSUES" ("ASSIGNEE");
-CREATE INDEX "ISSUES_CREATION_DATE" ON "ISSUES" ("ISSUE_CREATION_DATE");
-CREATE INDEX "ISSUES_UPDATED_AT" ON "ISSUES" ("UPDATED_AT");
-
-
-CREATE TABLE "ISSUE_CHANGES" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "KEE" VARCHAR(50),
-  "ISSUE_KEY" VARCHAR(50) NOT NULL,
-  "USER_LOGIN" VARCHAR(255),
-  "CHANGE_TYPE" VARCHAR(40),
-  "CHANGE_DATA"  VARCHAR(16777215),
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT,
-  "ISSUE_CHANGE_CREATION_DATE" BIGINT
-);
-CREATE INDEX "ISSUE_CHANGES_KEE" ON "ISSUE_CHANGES" ("KEE");
-CREATE INDEX "ISSUE_CHANGES_ISSUE_KEY" ON "ISSUE_CHANGES" ("ISSUE_KEY");
-
-
-CREATE TABLE "PERMISSION_TEMPLATES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(100) NOT NULL,
-  "KEE" VARCHAR(100) NOT NULL,
-  "DESCRIPTION" VARCHAR(4000),
-  "KEY_PATTERN" VARCHAR(500),
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP
-);
-
-
-CREATE TABLE "PERM_TPL_CHARACTERISTICS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "TEMPLATE_ID" INTEGER NOT NULL,
-  "PERMISSION_KEY" VARCHAR(64) NOT NULL,
-  "WITH_PROJECT_CREATOR" BOOLEAN NOT NULL DEFAULT FALSE,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX "UNIQ_PERM_TPL_CHARAC" ON "PERM_TPL_CHARACTERISTICS" ("TEMPLATE_ID", "PERMISSION_KEY");
-
-
-CREATE TABLE "PERM_TEMPLATES_USERS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "USER_ID" INTEGER NOT NULL,
-  "TEMPLATE_ID" INTEGER NOT NULL,
-  "PERMISSION_REFERENCE" VARCHAR(64) NOT NULL,
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP
-);
-
-
-CREATE TABLE "PERM_TEMPLATES_GROUPS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "GROUP_ID" INTEGER,
-  "TEMPLATE_ID" INTEGER NOT NULL,
-  "PERMISSION_REFERENCE" VARCHAR(64) NOT NULL,
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP
-);
-
-
-CREATE TABLE "QPROFILE_CHANGES" (
-  "KEE" VARCHAR(40) NOT NULL,
-  "RULES_PROFILE_UUID" VARCHAR(255) NOT NULL,
-  "CHANGE_TYPE" VARCHAR(20) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "USER_UUID" VARCHAR(255),
-  "CHANGE_DATA" CLOB,
-
-  CONSTRAINT "PK_QPROFILE_CHANGES" PRIMARY KEY ("KEE")
-);
-CREATE INDEX "QP_CHANGES_RULES_PROFILE_UUID" ON "QPROFILE_CHANGES" ("RULES_PROFILE_UUID");
-
-
-CREATE TABLE "FILE_SOURCES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "FILE_UUID" VARCHAR(50) NOT NULL,
-  "LINE_HASHES" CLOB,
-  "LINE_HASHES_VERSION" INTEGER,
-  "LINE_COUNT" INTEGER NOT NULL,
-  "BINARY_DATA" BLOB,
-  "DATA_HASH" VARCHAR(50),
-  "SRC_HASH" VARCHAR(50),
-  "REVISION" VARCHAR(100),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL
-);
-CREATE INDEX "FILE_SOURCES_PROJECT_UUID" ON "FILE_SOURCES" ("PROJECT_UUID");
-CREATE UNIQUE INDEX "FILE_SOURCES_FILE_UUID" ON "FILE_SOURCES" ("FILE_UUID");
-CREATE INDEX "FILE_SOURCES_UPDATED_AT" ON "FILE_SOURCES" ("UPDATED_AT");
-
-
-CREATE TABLE "CE_QUEUE" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(40) NOT NULL,
-  "TASK_TYPE" VARCHAR(15) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(40) NULL,
-  "MAIN_COMPONENT_UUID" VARCHAR(40) NULL,
-  "STATUS" VARCHAR(15) NOT NULL,
-  "SUBMITTER_UUID" VARCHAR(255) NULL,
-  "WORKER_UUID" VARCHAR(40) NULL,
-  "EXECUTION_COUNT" INTEGER NOT NULL,
-  "STARTED_AT" BIGINT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX "CE_QUEUE_UUID" ON "CE_QUEUE" ("UUID");
-CREATE INDEX "CE_QUEUE_COMPONENT" ON "CE_QUEUE" ("COMPONENT_UUID");
-CREATE INDEX "CE_QUEUE_MAIN_COMPONENT" ON "CE_QUEUE" ("MAIN_COMPONENT_UUID");
-CREATE INDEX "CE_QUEUE_STATUS" ON "CE_QUEUE" ("STATUS");
-
-
-CREATE TABLE "CE_ACTIVITY" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(40) NOT NULL,
-  "TASK_TYPE" VARCHAR(15) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(40) NULL,
-  "MAIN_COMPONENT_UUID" VARCHAR(40) NULL,
-  "ANALYSIS_UUID" VARCHAR(50) NULL,
-  "STATUS" VARCHAR(15) NOT NULL,
-  "IS_LAST" BOOLEAN,
-  "IS_LAST_KEY" VARCHAR(55),
-  "MAIN_IS_LAST" BOOLEAN,
-  "MAIN_IS_LAST_KEY" VARCHAR(55),
-  "SUBMITTER_UUID" VARCHAR(255) NULL,
-  "WORKER_UUID" VARCHAR(40) NULL,
-  "EXECUTION_COUNT" INTEGER NOT NULL,
-  "SUBMITTED_AT" BIGINT NOT NULL,
-  "STARTED_AT" BIGINT NULL,
-  "EXECUTED_AT" BIGINT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-  "EXECUTION_TIME_MS" BIGINT NULL,
-  "ERROR_MESSAGE" VARCHAR(1000),
-  "ERROR_STACKTRACE" CLOB,
-  "ERROR_TYPE" VARCHAR(20)
-);
-CREATE UNIQUE INDEX "CE_ACTIVITY_UUID" ON "CE_ACTIVITY" ("UUID");
-CREATE INDEX "CE_ACTIVITY_COMPONENT" ON "CE_ACTIVITY" ("COMPONENT_UUID");
-CREATE INDEX "CE_ACTIVITY_MAIN_COMPONENT" ON "CE_ACTIVITY" ("COMPONENT_UUID");
-CREATE INDEX "CE_ACTIVITY_ISLAST_KEY" ON "CE_ACTIVITY" ("IS_LAST_KEY");
-CREATE INDEX "CE_ACTIVITY_ISLAST" ON "CE_ACTIVITY" ("IS_LAST", "STATUS");
-CREATE INDEX "CE_ACTIVITY_MAIN_ISLAST_KEY" ON "CE_ACTIVITY" ("MAIN_IS_LAST_KEY");
-CREATE INDEX "CE_ACTIVITY_MAIN_ISLAST" ON "CE_ACTIVITY" ("MAIN_IS_LAST", "STATUS");
-
-
-CREATE TABLE "CE_TASK_CHARACTERISTICS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "TASK_UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(50) NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-
-  CONSTRAINT "PK_CE_TASK_CHARACTERISTICS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "CE_TASK_CHARACTERISTICS_TASK_UUID" ON "CE_TASK_CHARACTERISTICS" ("TASK_UUID");
-
-
-CREATE TABLE "CE_TASK_INPUT" (
-  "TASK_UUID" VARCHAR(40) NOT NULL,
-  "INPUT_DATA" BLOB,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_CE_TASK_INPUT" PRIMARY KEY ("TASK_UUID")
-);
-
-
-CREATE TABLE "CE_SCANNER_CONTEXT" (
-  "TASK_UUID" VARCHAR(40) NOT NULL,
-  "CONTEXT_DATA" BLOB NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_CE_SCANNER_CONTEXT" PRIMARY KEY ("TASK_UUID")
-);
-
-CREATE TABLE "CE_TASK_MESSAGE" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "TASK_UUID" VARCHAR(40) NOT NULL,
-  "MESSAGE" VARCHAR(4000) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "CE_TASK_MESSAGE" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "CE_TASK_MESSAGE_TASK" ON "CE_TASK_MESSAGE" ("TASK_UUID");
-
-
-CREATE TABLE "USER_TOKENS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "USER_UUID" VARCHAR(255) NOT NULL,
-  "NAME" VARCHAR(100) NOT NULL,
-  "TOKEN_HASH" VARCHAR(255) NOT NULL,
-  "LAST_CONNECTION_DATE" BIGINT,
-  "CREATED_AT" BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX "USER_TOKENS_TOKEN_HASH" ON "USER_TOKENS" ("TOKEN_HASH");
-CREATE UNIQUE INDEX "USER_TOKENS_USER_UUID_NAME" ON "USER_TOKENS" ("USER_UUID", "NAME");
-
-
-CREATE TABLE "ES_QUEUE" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "DOC_TYPE" VARCHAR(40) NOT NULL,
-  "DOC_ID" VARCHAR(4000) NOT NULL,
-  "DOC_ID_TYPE" VARCHAR(20),
-  "DOC_ROUTING" VARCHAR(4000),
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ES_QUEUE" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "ES_QUEUE_CREATED_AT" ON "ES_QUEUE" ("CREATED_AT");
-
-
-CREATE TABLE "PLUGINS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(200) NOT NULL,
-  "BASE_PLUGIN_KEY" VARCHAR(200),
-  "FILE_HASH" VARCHAR(200) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_PLUGINS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "PLUGINS_KEY" ON "PLUGINS" ("KEE");
-
-
-CREATE TABLE "PROJECT_BRANCHES" (
-  "UUID" VARCHAR(50) NOT NULL,
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "KEE" VARCHAR(255) NOT NULL,
-  "KEY_TYPE" VARCHAR(12) NOT NULL,
-  "BRANCH_TYPE" VARCHAR(12),
-  "MERGE_BRANCH_UUID" VARCHAR(50),
-  "PULL_REQUEST_BINARY" BLOB,
-  "MANUAL_BASELINE_ANALYSIS_UUID" VARCHAR(40),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_PROJECT_BRANCHES" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "PROJECT_BRANCHES_KEE_KEY_TYPE" ON "PROJECT_BRANCHES" ("PROJECT_UUID", "KEE", "KEY_TYPE");
-
-
-CREATE TABLE "ANALYSIS_PROPERTIES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "ANALYSIS_UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(512) NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-  "CLOB_VALUE" CLOB,
-  "IS_EMPTY" BOOLEAN NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ANALYSIS_PROPERTIES" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "ANALYSIS_PROPERTIES_ANALYSIS" ON "ANALYSIS_PROPERTIES" ("ANALYSIS_UUID");
-
-
-CREATE TABLE "WEBHOOKS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(100) NOT NULL,
-  "URL" VARCHAR(2000) NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40),
-  "PROJECT_UUID" VARCHAR(40),
-  "SECRET" VARCHAR(200),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_WEBHOOKS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "ORGANIZATION_WEBHOOK" ON "WEBHOOKS" ("ORGANIZATION_UUID");
-CREATE INDEX "PROJECT_WEBHOOK" ON "WEBHOOKS" ("PROJECT_UUID");
-
-
-CREATE TABLE "WEBHOOK_DELIVERIES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "WEBHOOK_UUID" VARCHAR(40) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(40) NOT NULL,
-  "ANALYSIS_UUID" VARCHAR(40),
-  "CE_TASK_UUID" VARCHAR(40),
-  "NAME" VARCHAR(100) NOT NULL,
-  "URL" VARCHAR(2000) NOT NULL,
-  "SUCCESS" BOOLEAN NOT NULL,
-  "HTTP_STATUS" INT,
-  "DURATION_MS" INT NOT NULL,
-  "PAYLOAD" CLOB NOT NULL,
-  "ERROR_STACKTRACE" CLOB,
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_WEBHOOK_DELIVERIES" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "COMPONENT_UUID" ON "WEBHOOK_DELIVERIES" ("COMPONENT_UUID");
-CREATE INDEX "CE_TASK_UUID" ON "WEBHOOK_DELIVERIES" ("CE_TASK_UUID");
-CREATE INDEX "ANALYSIS_UUID" ON "WEBHOOK_DELIVERIES" ("ANALYSIS_UUID");
-
-
-CREATE TABLE "ALM_APP_INSTALLS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "ALM_ID" VARCHAR(40) NOT NULL,
-  "OWNER_ID" VARCHAR(4000) NOT NULL,
-  "IS_OWNER_USER" BOOLEAN NOT NULL,
-  "INSTALL_ID" VARCHAR(4000) NOT NULL,
-  "USER_EXTERNAL_ID" VARCHAR(255),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ALM_APP_INSTALLS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "ALM_APP_INSTALLS_OWNER" ON "ALM_APP_INSTALLS" ("ALM_ID", "OWNER_ID");
-CREATE UNIQUE INDEX "ALM_APP_INSTALLS_INSTALL" ON "ALM_APP_INSTALLS" ("ALM_ID", "INSTALL_ID");
-CREATE INDEX "ALM_APP_INSTALLS_EXTERNAL_ID" ON "ALM_APP_INSTALLS" ("USER_EXTERNAL_ID");
-
-CREATE TABLE "PROJECT_ALM_BINDINGS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "ALM_ID" VARCHAR(40) NOT NULL,
-  "REPO_ID" VARCHAR(256) NOT NULL,
-  "PROJECT_UUID" VARCHAR(40) NOT NULL,
-  "GITHUB_SLUG" VARCHAR(256) NULL,
-  "URL" VARCHAR(2000) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-  CONSTRAINT "PK_PROJECT_ALM_BINDINGS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "PROJECT_ALM_BINDINGS_ALM_REPO" ON "PROJECT_ALM_BINDINGS" ("ALM_ID", "REPO_ID");
-CREATE UNIQUE INDEX "PROJECT_ALM_BINDINGS_PROJECT" ON "PROJECT_ALM_BINDINGS" ("PROJECT_UUID");
-
-CREATE TABLE "PROJECT_MAPPINGS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "KEY_TYPE" VARCHAR(200) NOT NULL,
-  "KEE" VARCHAR(4000) NOT NULL,
-  "PROJECT_UUID" VARCHAR(40) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  CONSTRAINT "PK_PROJECT_MAPPINGS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "KEY_TYPE_KEE" ON "PROJECT_MAPPINGS" ("KEY_TYPE", "KEE");
-CREATE INDEX "PROJECT_UUID" ON "PROJECT_MAPPINGS" ("PROJECT_UUID");
-
-CREATE TABLE "ORGANIZATION_ALM_BINDINGS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "ALM_APP_INSTALL_UUID" VARCHAR(40) NOT NULL,
-  "ALM_ID" VARCHAR(40) NOT NULL,
-  "URL" VARCHAR(2000) NOT NULL,
-  "USER_UUID" VARCHAR(255) NOT NULL,
-  "MEMBERS_SYNC_ENABLED" BOOLEAN,
-  "CREATED_AT" BIGINT NOT NULL,
-  CONSTRAINT "PK_ORGANIZATION_ALM_BINDINGS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "ORG_ALM_BINDINGS_ORG" ON "ORGANIZATION_ALM_BINDINGS" ("ORGANIZATION_UUID");
-CREATE UNIQUE INDEX "ORG_ALM_BINDINGS_INSTALL" ON "ORGANIZATION_ALM_BINDINGS" ("ALM_APP_INSTALL_UUID");
-
-CREATE TABLE "USER_PROPERTIES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "USER_UUID" VARCHAR(255) NOT NULL,
-  "KEE" VARCHAR(100) NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_USER_PROPERTIES" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "USER_PROPERTIES_USER_UUID_KEE" ON "USER_PROPERTIES" ("USER_UUID", "KEE");
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/schema_migrations-h2.ddl b/server/sonar-db-dao/src/main/resources/org/sonar/db/schema_migrations-h2.ddl
deleted file mode 100644 (file)
index aad2a07..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-CREATE TABLE "SCHEMA_MIGRATIONS" (
-  "VERSION" VARCHAR(256) NOT NULL
-);
-CREATE INDEX "UNIQUE_SCHEMA_MIGRATIONS" ON "SCHEMA_MIGRATIONS" ("VERSION");
diff --git a/server/sonar-db-dao/src/schema/schema-sq.ddl b/server/sonar-db-dao/src/schema/schema-sq.ddl
new file mode 100644 (file)
index 0000000..0c1d1f6
--- /dev/null
@@ -0,0 +1,947 @@
+###############################################################
+####  Description of SonarQube's schema in H2 SQL syntax   ####
+####                                                       ####
+####   This file is autogenerated and stored in SCM to     ####
+####   conveniently read the SonarQube's schema at any     ####
+####   point in time.                                      ####
+####                                                       ####
+####          DO NOT MODIFY THIS FILE DIRECTLY             ####
+####    use gradle task :server:sonar-db-dao:dumpSchema    ####
+###############################################################
+
+CREATE TABLE SCHEMA_MIGRATIONS(
+    VERSION VARCHAR(255) NOT NULL
+);
+
+CREATE TABLE ACTIVE_RULE_PARAMETERS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    ACTIVE_RULE_ID INTEGER NOT NULL,
+    RULES_PARAMETER_ID INTEGER NOT NULL,
+    VALUE VARCHAR(4000),
+    RULES_PARAMETER_KEY VARCHAR(128)
+);
+ALTER TABLE ACTIVE_RULE_PARAMETERS ADD CONSTRAINT PK_ACTIVE_RULE_PARAMETERS PRIMARY KEY(ID);
+CREATE INDEX IX_ARP_ON_ACTIVE_RULE_ID ON ACTIVE_RULE_PARAMETERS(ACTIVE_RULE_ID);
+
+CREATE TABLE ACTIVE_RULES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    PROFILE_ID INTEGER NOT NULL,
+    RULE_ID INTEGER NOT NULL,
+    FAILURE_LEVEL INTEGER NOT NULL,
+    INHERITANCE VARCHAR(10),
+    CREATED_AT BIGINT,
+    UPDATED_AT BIGINT
+);
+ALTER TABLE ACTIVE_RULES ADD CONSTRAINT PK_ACTIVE_RULES PRIMARY KEY(ID);
+CREATE UNIQUE INDEX UNIQ_PROFILE_RULE_IDS ON ACTIVE_RULES(PROFILE_ID, RULE_ID);
+
+CREATE TABLE ALM_APP_INSTALLS(
+    UUID VARCHAR(40) NOT NULL,
+    ALM_ID VARCHAR(40) NOT NULL,
+    OWNER_ID VARCHAR(4000) NOT NULL,
+    INSTALL_ID VARCHAR(4000) NOT NULL,
+    IS_OWNER_USER BOOLEAN NOT NULL,
+    USER_EXTERNAL_ID VARCHAR(255),
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE ALM_APP_INSTALLS ADD CONSTRAINT PK_ALM_APP_INSTALLS PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX ALM_APP_INSTALLS_OWNER ON ALM_APP_INSTALLS(ALM_ID, OWNER_ID);
+CREATE UNIQUE INDEX ALM_APP_INSTALLS_INSTALL ON ALM_APP_INSTALLS(ALM_ID, INSTALL_ID);
+CREATE INDEX ALM_APP_INSTALLS_EXTERNAL_ID ON ALM_APP_INSTALLS(USER_EXTERNAL_ID);
+
+CREATE TABLE ANALYSIS_PROPERTIES(
+    UUID VARCHAR(40) NOT NULL,
+    ANALYSIS_UUID VARCHAR(40) NOT NULL,
+    KEE VARCHAR(512) NOT NULL,
+    TEXT_VALUE VARCHAR(4000),
+    CLOB_VALUE CLOB(2147483647),
+    IS_EMPTY BOOLEAN NOT NULL,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE ANALYSIS_PROPERTIES ADD CONSTRAINT PK_ANALYSIS_PROPERTIES PRIMARY KEY(UUID);
+CREATE INDEX ANALYSIS_PROPERTIES_ANALYSIS ON ANALYSIS_PROPERTIES(ANALYSIS_UUID);
+
+CREATE TABLE CE_ACTIVITY(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    UUID VARCHAR(40) NOT NULL,
+    TASK_TYPE VARCHAR(15) NOT NULL,
+    MAIN_COMPONENT_UUID VARCHAR(40),
+    COMPONENT_UUID VARCHAR(40),
+    STATUS VARCHAR(15) NOT NULL,
+    MAIN_IS_LAST BOOLEAN NOT NULL,
+    MAIN_IS_LAST_KEY VARCHAR(55) NOT NULL,
+    IS_LAST BOOLEAN NOT NULL,
+    IS_LAST_KEY VARCHAR(55) NOT NULL,
+    SUBMITTER_UUID VARCHAR(255),
+    SUBMITTED_AT BIGINT NOT NULL,
+    STARTED_AT BIGINT,
+    EXECUTED_AT BIGINT,
+    EXECUTION_COUNT INTEGER NOT NULL,
+    EXECUTION_TIME_MS BIGINT,
+    ANALYSIS_UUID VARCHAR(50),
+    ERROR_MESSAGE VARCHAR(1000),
+    ERROR_STACKTRACE CLOB(2147483647),
+    ERROR_TYPE VARCHAR(20),
+    WORKER_UUID VARCHAR(40),
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE CE_ACTIVITY ADD CONSTRAINT PK_CE_ACTIVITY PRIMARY KEY(ID);
+CREATE INDEX CE_ACTIVITY_COMPONENT ON CE_ACTIVITY(COMPONENT_UUID);
+CREATE INDEX CE_ACTIVITY_ISLAST ON CE_ACTIVITY(IS_LAST, STATUS);
+CREATE INDEX CE_ACTIVITY_ISLAST_KEY ON CE_ACTIVITY(IS_LAST_KEY);
+CREATE INDEX CE_ACTIVITY_MAIN_COMPONENT ON CE_ACTIVITY(MAIN_COMPONENT_UUID);
+CREATE INDEX CE_ACTIVITY_MAIN_ISLAST ON CE_ACTIVITY(MAIN_IS_LAST, STATUS);
+CREATE INDEX CE_ACTIVITY_MAIN_ISLAST_KEY ON CE_ACTIVITY(MAIN_IS_LAST_KEY);
+CREATE UNIQUE INDEX CE_ACTIVITY_UUID ON CE_ACTIVITY(UUID);
+
+CREATE TABLE CE_QUEUE(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    UUID VARCHAR(40) NOT NULL,
+    TASK_TYPE VARCHAR(15) NOT NULL,
+    MAIN_COMPONENT_UUID VARCHAR(40),
+    COMPONENT_UUID VARCHAR(40),
+    STATUS VARCHAR(15),
+    SUBMITTER_UUID VARCHAR(255),
+    STARTED_AT BIGINT,
+    WORKER_UUID VARCHAR(40),
+    EXECUTION_COUNT INTEGER NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE CE_QUEUE ADD CONSTRAINT PK_CE_QUEUE PRIMARY KEY(ID);
+CREATE INDEX CE_QUEUE_MAIN_COMPONENT ON CE_QUEUE(MAIN_COMPONENT_UUID);
+CREATE INDEX CE_QUEUE_COMPONENT ON CE_QUEUE(COMPONENT_UUID);
+CREATE UNIQUE INDEX CE_QUEUE_UUID ON CE_QUEUE(UUID);
+
+CREATE TABLE CE_SCANNER_CONTEXT(
+    TASK_UUID VARCHAR(40) NOT NULL,
+    CONTEXT_DATA BLOB NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE CE_SCANNER_CONTEXT ADD CONSTRAINT PK_CE_SCANNER_CONTEXT PRIMARY KEY(TASK_UUID);
+
+CREATE TABLE CE_TASK_CHARACTERISTICS(
+    UUID VARCHAR(40) NOT NULL,
+    TASK_UUID VARCHAR(40) NOT NULL,
+    KEE VARCHAR(512) NOT NULL,
+    TEXT_VALUE VARCHAR(512)
+);
+ALTER TABLE CE_TASK_CHARACTERISTICS ADD CONSTRAINT PK_CE_TASK_CHARACTERISTICS PRIMARY KEY(UUID);
+CREATE INDEX CE_CHARACTERISTICS_TASK_UUID ON CE_TASK_CHARACTERISTICS(TASK_UUID);
+
+CREATE TABLE CE_TASK_INPUT(
+    TASK_UUID VARCHAR(40) NOT NULL,
+    INPUT_DATA BLOB,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE CE_TASK_INPUT ADD CONSTRAINT PK_CE_TASK_INPUT PRIMARY KEY(TASK_UUID);
+
+CREATE TABLE CE_TASK_MESSAGE(
+    UUID VARCHAR(40) NOT NULL,
+    TASK_UUID VARCHAR(40) NOT NULL,
+    MESSAGE VARCHAR(4000) NOT NULL,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE CE_TASK_MESSAGE ADD CONSTRAINT PK_CE_TASK_MESSAGE PRIMARY KEY(UUID);
+CREATE INDEX CE_TASK_MESSAGE_TASK ON CE_TASK_MESSAGE(TASK_UUID);
+
+CREATE TABLE DEFAULT_QPROFILES(
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    LANGUAGE VARCHAR(20) NOT NULL,
+    QPROFILE_UUID VARCHAR(255) NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE DEFAULT_QPROFILES ADD CONSTRAINT PK_DEFAULT_QPROFILES PRIMARY KEY(ORGANIZATION_UUID, LANGUAGE);
+CREATE UNIQUE INDEX UNIQ_DEFAULT_QPROFILES_UUID ON DEFAULT_QPROFILES(QPROFILE_UUID);
+
+CREATE TABLE DEPRECATED_RULE_KEYS(
+    UUID VARCHAR(40) NOT NULL,
+    RULE_ID INTEGER NOT NULL,
+    OLD_REPOSITORY_KEY VARCHAR(255) NOT NULL,
+    OLD_RULE_KEY VARCHAR(200) NOT NULL,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE DEPRECATED_RULE_KEYS ADD CONSTRAINT PK_DEPRECATED_RULE_KEYS PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX UNIQ_DEPRECATED_RULE_KEYS ON DEPRECATED_RULE_KEYS(OLD_REPOSITORY_KEY, OLD_RULE_KEY);
+CREATE INDEX RULE_ID_DEPRECATED_RULE_KEYS ON DEPRECATED_RULE_KEYS(RULE_ID);
+
+CREATE TABLE DUPLICATIONS_INDEX(
+    ID BIGINT NOT NULL AUTO_INCREMENT (1,1),
+    ANALYSIS_UUID VARCHAR(50) NOT NULL,
+    COMPONENT_UUID VARCHAR(50) NOT NULL,
+    HASH VARCHAR(50) NOT NULL,
+    INDEX_IN_FILE INTEGER NOT NULL,
+    START_LINE INTEGER NOT NULL,
+    END_LINE INTEGER NOT NULL
+);
+ALTER TABLE DUPLICATIONS_INDEX ADD CONSTRAINT PK_DUPLICATIONS_INDEX PRIMARY KEY(ID);
+CREATE INDEX DUPLICATIONS_INDEX_HASH ON DUPLICATIONS_INDEX(HASH);
+CREATE INDEX DUPLICATION_ANALYSIS_COMPONENT ON DUPLICATIONS_INDEX(ANALYSIS_UUID, COMPONENT_UUID);
+
+CREATE TABLE ES_QUEUE(
+    UUID VARCHAR(40) NOT NULL,
+    DOC_TYPE VARCHAR(40) NOT NULL,
+    DOC_ID VARCHAR(4000) NOT NULL,
+    DOC_ID_TYPE VARCHAR(20),
+    DOC_ROUTING VARCHAR(4000),
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE ES_QUEUE ADD CONSTRAINT PK_ES_QUEUE PRIMARY KEY(UUID);
+CREATE INDEX ES_QUEUE_CREATED_AT ON ES_QUEUE(CREATED_AT);
+
+CREATE TABLE EVENT_COMPONENT_CHANGES(
+    UUID VARCHAR(40) NOT NULL,
+    EVENT_UUID VARCHAR(40) NOT NULL,
+    EVENT_COMPONENT_UUID VARCHAR(50) NOT NULL,
+    EVENT_ANALYSIS_UUID VARCHAR(50) NOT NULL,
+    CHANGE_CATEGORY VARCHAR(12) NOT NULL,
+    COMPONENT_UUID VARCHAR(50) NOT NULL,
+    COMPONENT_KEY VARCHAR(400) NOT NULL,
+    COMPONENT_NAME VARCHAR(2000) NOT NULL,
+    COMPONENT_BRANCH_KEY VARCHAR(255),
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE EVENT_COMPONENT_CHANGES ADD CONSTRAINT PK_EVENT_COMPONENT_CHANGES PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX EVENT_COMPONENT_CHANGES_UNIQUE ON EVENT_COMPONENT_CHANGES(EVENT_UUID, CHANGE_CATEGORY, COMPONENT_UUID);
+CREATE INDEX EVENT_CPNT_CHANGES_CPNT ON EVENT_COMPONENT_CHANGES(EVENT_COMPONENT_UUID);
+CREATE INDEX EVENT_CPNT_CHANGES_ANALYSIS ON EVENT_COMPONENT_CHANGES(EVENT_ANALYSIS_UUID);
+
+CREATE TABLE EVENTS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    UUID VARCHAR(40) NOT NULL,
+    ANALYSIS_UUID VARCHAR(50) NOT NULL,
+    NAME VARCHAR(400),
+    CATEGORY VARCHAR(50),
+    DESCRIPTION VARCHAR(4000),
+    EVENT_DATA VARCHAR(4000),
+    EVENT_DATE BIGINT NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    COMPONENT_UUID VARCHAR(50) NOT NULL
+);
+ALTER TABLE EVENTS ADD CONSTRAINT PK_EVENTS PRIMARY KEY(ID);
+CREATE UNIQUE INDEX EVENTS_UUID ON EVENTS(UUID);
+CREATE INDEX EVENTS_ANALYSIS ON EVENTS(ANALYSIS_UUID);
+CREATE INDEX EVENTS_COMPONENT_UUID ON EVENTS(COMPONENT_UUID);
+
+CREATE TABLE FILE_SOURCES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    PROJECT_UUID VARCHAR(50) NOT NULL,
+    FILE_UUID VARCHAR(50) NOT NULL,
+    LINE_HASHES CLOB(2147483647),
+    LINE_HASHES_VERSION INTEGER,
+    DATA_HASH VARCHAR(50),
+    SRC_HASH VARCHAR(50),
+    REVISION VARCHAR(100),
+    LINE_COUNT INTEGER NOT NULL,
+    BINARY_DATA BLOB,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE FILE_SOURCES ADD CONSTRAINT PK_FILE_SOURCES PRIMARY KEY(ID);
+CREATE UNIQUE INDEX FILE_SOURCES_FILE_UUID ON FILE_SOURCES(FILE_UUID);
+CREATE INDEX FILE_SOURCES_PROJECT_UUID ON FILE_SOURCES(PROJECT_UUID);
+CREATE INDEX FILE_SOURCES_UPDATED_AT ON FILE_SOURCES(UPDATED_AT);
+
+CREATE TABLE GROUP_ROLES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    GROUP_ID INTEGER,
+    RESOURCE_ID INTEGER,
+    ROLE VARCHAR(64) NOT NULL
+);
+ALTER TABLE GROUP_ROLES ADD CONSTRAINT PK_GROUP_ROLES PRIMARY KEY(ID);
+CREATE UNIQUE INDEX UNIQ_GROUP_ROLES ON GROUP_ROLES(ORGANIZATION_UUID, GROUP_ID, RESOURCE_ID, ROLE);
+CREATE INDEX GROUP_ROLES_RESOURCE ON GROUP_ROLES(RESOURCE_ID);
+
+CREATE TABLE GROUPS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    NAME VARCHAR(500),
+    DESCRIPTION VARCHAR(200),
+    CREATED_AT TIMESTAMP,
+    UPDATED_AT TIMESTAMP
+);
+ALTER TABLE GROUPS ADD CONSTRAINT PK_GROUPS PRIMARY KEY(ID);
+
+CREATE TABLE GROUPS_USERS(
+    USER_ID BIGINT,
+    GROUP_ID BIGINT
+);
+CREATE INDEX INDEX_GROUPS_USERS_ON_USER_ID ON GROUPS_USERS(USER_ID);
+CREATE INDEX INDEX_GROUPS_USERS_ON_GROUP_ID ON GROUPS_USERS(GROUP_ID);
+CREATE UNIQUE INDEX GROUPS_USERS_UNIQUE ON GROUPS_USERS(GROUP_ID, USER_ID);
+
+CREATE TABLE INTERNAL_COMPONENT_PROPS(
+    UUID VARCHAR(40) NOT NULL,
+    COMPONENT_UUID VARCHAR(50) NOT NULL,
+    KEE VARCHAR(512) NOT NULL,
+    VALUE VARCHAR(4000),
+    UPDATED_AT BIGINT NOT NULL,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE INTERNAL_COMPONENT_PROPS ADD CONSTRAINT PK_INTERNAL_COMPONENT_PROPS PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX UNIQUE_COMPONENT_UUID_KEE ON INTERNAL_COMPONENT_PROPS(COMPONENT_UUID, KEE);
+
+CREATE TABLE INTERNAL_PROPERTIES(
+    KEE VARCHAR(20) NOT NULL,
+    IS_EMPTY BOOLEAN NOT NULL,
+    TEXT_VALUE VARCHAR(4000),
+    CLOB_VALUE CLOB(2147483647),
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE INTERNAL_PROPERTIES ADD CONSTRAINT PK_INTERNAL_PROPERTIES PRIMARY KEY(KEE);
+
+CREATE TABLE ISSUE_CHANGES(
+    ID BIGINT NOT NULL AUTO_INCREMENT (1,1),
+    KEE VARCHAR(50),
+    ISSUE_KEY VARCHAR(50) NOT NULL,
+    USER_LOGIN VARCHAR(255),
+    CHANGE_TYPE VARCHAR(20),
+    CHANGE_DATA CLOB(2147483647),
+    CREATED_AT BIGINT,
+    UPDATED_AT BIGINT,
+    ISSUE_CHANGE_CREATION_DATE BIGINT
+);
+ALTER TABLE ISSUE_CHANGES ADD CONSTRAINT PK_ISSUE_CHANGES PRIMARY KEY(ID);
+CREATE INDEX ISSUE_CHANGES_ISSUE_KEY ON ISSUE_CHANGES(ISSUE_KEY);
+CREATE INDEX ISSUE_CHANGES_KEE ON ISSUE_CHANGES(KEE);
+
+CREATE TABLE ISSUES(
+    ID BIGINT NOT NULL AUTO_INCREMENT (1,1),
+    KEE VARCHAR(50) NOT NULL,
+    RULE_ID INTEGER,
+    SEVERITY VARCHAR(10),
+    MANUAL_SEVERITY BOOLEAN NOT NULL,
+    MESSAGE VARCHAR(4000),
+    LINE INTEGER,
+    GAP DOUBLE,
+    STATUS VARCHAR(20),
+    RESOLUTION VARCHAR(20),
+    CHECKSUM VARCHAR(1000),
+    REPORTER VARCHAR(255),
+    ASSIGNEE VARCHAR(255),
+    AUTHOR_LOGIN VARCHAR(255),
+    ACTION_PLAN_KEY VARCHAR(50),
+    ISSUE_ATTRIBUTES VARCHAR(4000),
+    EFFORT INTEGER,
+    CREATED_AT BIGINT,
+    UPDATED_AT BIGINT,
+    ISSUE_CREATION_DATE BIGINT,
+    ISSUE_UPDATE_DATE BIGINT,
+    ISSUE_CLOSE_DATE BIGINT,
+    TAGS VARCHAR(4000),
+    COMPONENT_UUID VARCHAR(50),
+    PROJECT_UUID VARCHAR(50),
+    LOCATIONS BLOB,
+    ISSUE_TYPE TINYINT,
+    FROM_HOTSPOT BOOLEAN
+);
+ALTER TABLE ISSUES ADD CONSTRAINT PK_ISSUES PRIMARY KEY(ID);
+CREATE INDEX ISSUES_ASSIGNEE ON ISSUES(ASSIGNEE);
+CREATE INDEX ISSUES_COMPONENT_UUID ON ISSUES(COMPONENT_UUID);
+CREATE INDEX ISSUES_CREATION_DATE ON ISSUES(ISSUE_CREATION_DATE);
+CREATE UNIQUE INDEX ISSUES_KEE ON ISSUES(KEE);
+CREATE INDEX ISSUES_PROJECT_UUID ON ISSUES(PROJECT_UUID);
+CREATE INDEX ISSUES_RESOLUTION ON ISSUES(RESOLUTION);
+CREATE INDEX ISSUES_RULE_ID ON ISSUES(RULE_ID);
+CREATE INDEX ISSUES_UPDATED_AT ON ISSUES(UPDATED_AT);
+
+CREATE TABLE LIVE_MEASURES(
+    UUID VARCHAR(40) NOT NULL,
+    PROJECT_UUID VARCHAR(50) NOT NULL,
+    COMPONENT_UUID VARCHAR(50) NOT NULL,
+    METRIC_ID INTEGER NOT NULL,
+    VALUE DOUBLE,
+    TEXT_VALUE VARCHAR(4000),
+    VARIATION DOUBLE,
+    MEASURE_DATA BLOB,
+    UPDATE_MARKER VARCHAR(40),
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE LIVE_MEASURES ADD CONSTRAINT PK_LIVE_MEASURES PRIMARY KEY(UUID);
+CREATE INDEX LIVE_MEASURES_PROJECT ON LIVE_MEASURES(PROJECT_UUID);
+CREATE UNIQUE INDEX LIVE_MEASURES_COMPONENT ON LIVE_MEASURES(COMPONENT_UUID, METRIC_ID);
+
+CREATE TABLE MANUAL_MEASURES(
+    ID BIGINT NOT NULL AUTO_INCREMENT (1,1),
+    METRIC_ID INTEGER NOT NULL,
+    VALUE DOUBLE,
+    TEXT_VALUE VARCHAR(4000),
+    USER_UUID VARCHAR(255),
+    DESCRIPTION VARCHAR(4000),
+    CREATED_AT BIGINT,
+    UPDATED_AT BIGINT,
+    COMPONENT_UUID VARCHAR(50) NOT NULL
+);
+ALTER TABLE MANUAL_MEASURES ADD CONSTRAINT PK_MANUAL_MEASURES PRIMARY KEY(ID);
+CREATE INDEX MANUAL_MEASURES_COMPONENT_UUID ON MANUAL_MEASURES(COMPONENT_UUID);
+
+CREATE TABLE METRICS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    NAME VARCHAR(64) NOT NULL,
+    DESCRIPTION VARCHAR(255),
+    DIRECTION INTEGER DEFAULT 0 NOT NULL,
+    DOMAIN VARCHAR(64),
+    SHORT_NAME VARCHAR(64),
+    QUALITATIVE BOOLEAN DEFAULT FALSE NOT NULL,
+    VAL_TYPE VARCHAR(8),
+    USER_MANAGED BOOLEAN DEFAULT FALSE,
+    ENABLED BOOLEAN DEFAULT TRUE,
+    WORST_VALUE DOUBLE,
+    BEST_VALUE DOUBLE,
+    OPTIMIZED_BEST_VALUE BOOLEAN,
+    HIDDEN BOOLEAN,
+    DELETE_HISTORICAL_DATA BOOLEAN,
+    DECIMAL_SCALE INTEGER
+);
+ALTER TABLE METRICS ADD CONSTRAINT PK_METRICS PRIMARY KEY(ID);
+CREATE UNIQUE INDEX METRICS_UNIQUE_NAME ON METRICS(NAME);
+
+CREATE TABLE NOTIFICATIONS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    DATA BLOB
+);
+ALTER TABLE NOTIFICATIONS ADD CONSTRAINT PK_NOTIFICATIONS PRIMARY KEY(ID);
+
+CREATE TABLE ORG_QPROFILES(
+    UUID VARCHAR(255) NOT NULL,
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    RULES_PROFILE_UUID VARCHAR(255) NOT NULL,
+    PARENT_UUID VARCHAR(255),
+    LAST_USED BIGINT,
+    USER_UPDATED_AT BIGINT,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE ORG_QPROFILES ADD CONSTRAINT PK_ORG_QPROFILES PRIMARY KEY(UUID);
+CREATE INDEX QPROFILES_ORG_UUID ON ORG_QPROFILES(ORGANIZATION_UUID);
+CREATE INDEX QPROFILES_RP_UUID ON ORG_QPROFILES(RULES_PROFILE_UUID);
+CREATE INDEX ORG_QPROFILES_PARENT_UUID ON ORG_QPROFILES(PARENT_UUID);
+
+CREATE TABLE ORG_QUALITY_GATES(
+    UUID VARCHAR(40) NOT NULL,
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    QUALITY_GATE_UUID VARCHAR(40) NOT NULL
+);
+ALTER TABLE ORG_QUALITY_GATES ADD CONSTRAINT PK_ORG_QUALITY_GATES PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX UNIQ_ORG_QUALITY_GATES ON ORG_QUALITY_GATES(ORGANIZATION_UUID, QUALITY_GATE_UUID);
+
+CREATE TABLE ORGANIZATION_ALM_BINDINGS(
+    UUID VARCHAR(40) NOT NULL,
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    ALM_APP_INSTALL_UUID VARCHAR(40) NOT NULL,
+    ALM_ID VARCHAR(40) NOT NULL,
+    URL VARCHAR(2000) NOT NULL,
+    USER_UUID VARCHAR(255) NOT NULL,
+    MEMBERS_SYNC_ENABLED BOOLEAN,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE ORGANIZATION_ALM_BINDINGS ADD CONSTRAINT PK_ORGANIZATION_ALM_BINDINGS PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX ORG_ALM_BINDINGS_ORG ON ORGANIZATION_ALM_BINDINGS(ORGANIZATION_UUID);
+CREATE UNIQUE INDEX ORG_ALM_BINDINGS_INSTALL ON ORGANIZATION_ALM_BINDINGS(ALM_APP_INSTALL_UUID);
+
+CREATE TABLE ORGANIZATION_MEMBERS(
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    USER_ID INTEGER NOT NULL
+);
+ALTER TABLE ORGANIZATION_MEMBERS ADD CONSTRAINT PK_ORGANIZATION_MEMBERS PRIMARY KEY(ORGANIZATION_UUID, USER_ID);
+CREATE INDEX IX_ORG_MEMBERS_ON_USER_ID ON ORGANIZATION_MEMBERS(USER_ID);
+
+CREATE TABLE ORGANIZATIONS(
+    UUID VARCHAR(40) NOT NULL,
+    KEE VARCHAR(255) NOT NULL,
+    NAME VARCHAR(255) NOT NULL,
+    DESCRIPTION VARCHAR(256),
+    URL VARCHAR(256),
+    AVATAR_URL VARCHAR(256),
+    GUARDED BOOLEAN,
+    DEFAULT_GROUP_ID INTEGER,
+    DEFAULT_QUALITY_GATE_UUID VARCHAR(40) NOT NULL,
+    DEFAULT_PERM_TEMPLATE_PROJECT VARCHAR(40),
+    DEFAULT_PERM_TEMPLATE_APP VARCHAR(40),
+    DEFAULT_PERM_TEMPLATE_PORT VARCHAR(40),
+    NEW_PROJECT_PRIVATE BOOLEAN NOT NULL,
+    SUBSCRIPTION VARCHAR(40) NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE ORGANIZATIONS ADD CONSTRAINT PK_ORGANIZATIONS PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX ORGANIZATION_KEY ON ORGANIZATIONS(KEE);
+
+CREATE TABLE PERM_TEMPLATES_GROUPS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    GROUP_ID INTEGER,
+    TEMPLATE_ID INTEGER NOT NULL,
+    PERMISSION_REFERENCE VARCHAR(64) NOT NULL,
+    CREATED_AT TIMESTAMP,
+    UPDATED_AT TIMESTAMP
+);
+ALTER TABLE PERM_TEMPLATES_GROUPS ADD CONSTRAINT PK_PERM_TEMPLATES_GROUPS PRIMARY KEY(ID);
+
+CREATE TABLE PERM_TEMPLATES_USERS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    USER_ID INTEGER NOT NULL,
+    TEMPLATE_ID INTEGER NOT NULL,
+    PERMISSION_REFERENCE VARCHAR(64) NOT NULL,
+    CREATED_AT TIMESTAMP,
+    UPDATED_AT TIMESTAMP
+);
+ALTER TABLE PERM_TEMPLATES_USERS ADD CONSTRAINT PK_PERM_TEMPLATES_USERS PRIMARY KEY(ID);
+
+CREATE TABLE PERM_TPL_CHARACTERISTICS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    TEMPLATE_ID INTEGER NOT NULL,
+    PERMISSION_KEY VARCHAR(64) NOT NULL,
+    WITH_PROJECT_CREATOR BOOLEAN DEFAULT FALSE NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE PERM_TPL_CHARACTERISTICS ADD CONSTRAINT PK_PERM_TPL_CHARACTERISTICS PRIMARY KEY(ID);
+CREATE UNIQUE INDEX UNIQ_PERM_TPL_CHARAC ON PERM_TPL_CHARACTERISTICS(TEMPLATE_ID, PERMISSION_KEY);
+
+CREATE TABLE PERMISSION_TEMPLATES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    NAME VARCHAR(100) NOT NULL,
+    KEE VARCHAR(100) NOT NULL,
+    DESCRIPTION VARCHAR(4000),
+    CREATED_AT TIMESTAMP,
+    UPDATED_AT TIMESTAMP,
+    KEY_PATTERN VARCHAR(500)
+);
+ALTER TABLE PERMISSION_TEMPLATES ADD CONSTRAINT PK_PERMISSION_TEMPLATES PRIMARY KEY(ID);
+
+CREATE TABLE PLUGINS(
+    UUID VARCHAR(40) NOT NULL,
+    KEE VARCHAR(200) NOT NULL,
+    BASE_PLUGIN_KEY VARCHAR(200),
+    FILE_HASH VARCHAR(200) NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE PLUGINS ADD CONSTRAINT PK_PLUGINS PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX PLUGINS_KEY ON PLUGINS(KEE);
+
+CREATE TABLE PROJECT_ALM_BINDINGS(
+    UUID VARCHAR(40) NOT NULL,
+    ALM_ID VARCHAR(40) NOT NULL,
+    REPO_ID VARCHAR(256) NOT NULL,
+    PROJECT_UUID VARCHAR(40) NOT NULL,
+    GITHUB_SLUG VARCHAR(256),
+    URL VARCHAR(2000) NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE PROJECT_ALM_BINDINGS ADD CONSTRAINT PK_PROJECT_ALM_BINDINGS PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX PROJECT_ALM_BINDINGS_ALM_REPO ON PROJECT_ALM_BINDINGS(ALM_ID, REPO_ID);
+CREATE UNIQUE INDEX PROJECT_ALM_BINDINGS_PROJECT ON PROJECT_ALM_BINDINGS(PROJECT_UUID);
+
+CREATE TABLE PROJECT_BRANCHES(
+    UUID VARCHAR(50) NOT NULL,
+    PROJECT_UUID VARCHAR(50) NOT NULL,
+    KEE VARCHAR(255) NOT NULL,
+    BRANCH_TYPE VARCHAR(12),
+    MERGE_BRANCH_UUID VARCHAR(50),
+    KEY_TYPE VARCHAR(12) NOT NULL,
+    PULL_REQUEST_BINARY BLOB,
+    MANUAL_BASELINE_ANALYSIS_UUID VARCHAR(40),
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE PROJECT_BRANCHES ADD CONSTRAINT PK_PROJECT_BRANCHES PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX PROJECT_BRANCHES_KEE_KEY_TYPE ON PROJECT_BRANCHES(PROJECT_UUID, KEE, KEY_TYPE);
+
+CREATE TABLE PROJECT_LINKS(
+    UUID VARCHAR(40) NOT NULL,
+    PROJECT_UUID VARCHAR(40) NOT NULL,
+    LINK_TYPE VARCHAR(20) NOT NULL,
+    NAME VARCHAR(128),
+    HREF VARCHAR(2048) NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE PROJECT_LINKS ADD CONSTRAINT PK_PROJECT_LINKS PRIMARY KEY(UUID);
+CREATE INDEX PROJECT_LINKS_PROJECT ON PROJECT_LINKS(PROJECT_UUID);
+
+CREATE TABLE PROJECT_MAPPINGS(
+    UUID VARCHAR(40) NOT NULL,
+    KEY_TYPE VARCHAR(200) NOT NULL,
+    KEE VARCHAR(4000) NOT NULL,
+    PROJECT_UUID VARCHAR(40) NOT NULL,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE PROJECT_MAPPINGS ADD CONSTRAINT PK_PROJECT_MAPPINGS PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX KEY_TYPE_KEE ON PROJECT_MAPPINGS(KEY_TYPE, KEE);
+CREATE INDEX PROJECT_UUID ON PROJECT_MAPPINGS(PROJECT_UUID);
+
+CREATE TABLE PROJECT_MEASURES(
+    ID BIGINT NOT NULL AUTO_INCREMENT (1,1),
+    VALUE DOUBLE,
+    METRIC_ID INTEGER NOT NULL,
+    ANALYSIS_UUID VARCHAR(50) NOT NULL,
+    COMPONENT_UUID VARCHAR(50) NOT NULL,
+    TEXT_VALUE VARCHAR(4000),
+    ALERT_STATUS VARCHAR(5),
+    ALERT_TEXT VARCHAR(4000),
+    DESCRIPTION VARCHAR(4000),
+    PERSON_ID INTEGER,
+    VARIATION_VALUE_1 DOUBLE,
+    VARIATION_VALUE_2 DOUBLE,
+    VARIATION_VALUE_3 DOUBLE,
+    VARIATION_VALUE_4 DOUBLE,
+    VARIATION_VALUE_5 DOUBLE,
+    MEASURE_DATA BLOB
+);
+ALTER TABLE PROJECT_MEASURES ADD CONSTRAINT PK_PROJECT_MEASURES PRIMARY KEY(ID);
+CREATE INDEX MEASURES_ANALYSIS_METRIC ON PROJECT_MEASURES(ANALYSIS_UUID, METRIC_ID);
+CREATE INDEX MEASURES_COMPONENT_UUID ON PROJECT_MEASURES(COMPONENT_UUID);
+
+CREATE TABLE PROJECT_QGATES(
+    PROJECT_UUID VARCHAR(40) NOT NULL,
+    QUALITY_GATE_UUID VARCHAR(40) NOT NULL
+);
+ALTER TABLE PROJECT_QGATES ADD CONSTRAINT PK_PROJECT_QGATES PRIMARY KEY(PROJECT_UUID);
+CREATE UNIQUE INDEX UNIQ_PROJECT_QGATES ON PROJECT_QGATES(PROJECT_UUID, QUALITY_GATE_UUID);
+
+CREATE TABLE PROJECT_QPROFILES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    PROJECT_UUID VARCHAR(50) NOT NULL,
+    PROFILE_KEY VARCHAR(50) NOT NULL
+);
+ALTER TABLE PROJECT_QPROFILES ADD CONSTRAINT PK_PROJECT_QPROFILES PRIMARY KEY(ID);
+CREATE UNIQUE INDEX UNIQ_PROJECT_QPROFILES ON PROJECT_QPROFILES(PROJECT_UUID, PROFILE_KEY);
+
+CREATE TABLE PROJECTS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    UUID VARCHAR(50) NOT NULL,
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    KEE VARCHAR(400),
+    DEPRECATED_KEE VARCHAR(400),
+    NAME VARCHAR(2000),
+    LONG_NAME VARCHAR(2000),
+    DESCRIPTION VARCHAR(2000),
+    ENABLED BOOLEAN DEFAULT TRUE NOT NULL,
+    SCOPE VARCHAR(3),
+    QUALIFIER VARCHAR(10),
+    PRIVATE BOOLEAN NOT NULL,
+    ROOT_UUID VARCHAR(50) NOT NULL,
+    LANGUAGE VARCHAR(20),
+    COPY_COMPONENT_UUID VARCHAR(50),
+    DEVELOPER_UUID VARCHAR(50),
+    PATH VARCHAR(2000),
+    UUID_PATH VARCHAR(1500) NOT NULL,
+    PROJECT_UUID VARCHAR(50) NOT NULL,
+    MODULE_UUID VARCHAR(50),
+    MODULE_UUID_PATH VARCHAR(1500),
+    AUTHORIZATION_UPDATED_AT BIGINT,
+    TAGS VARCHAR(500),
+    MAIN_BRANCH_PROJECT_UUID VARCHAR(50),
+    B_CHANGED BOOLEAN,
+    B_NAME VARCHAR(500),
+    B_LONG_NAME VARCHAR(500),
+    B_DESCRIPTION VARCHAR(2000),
+    B_ENABLED BOOLEAN,
+    B_QUALIFIER VARCHAR(10),
+    B_LANGUAGE VARCHAR(20),
+    B_COPY_COMPONENT_UUID VARCHAR(50),
+    B_PATH VARCHAR(2000),
+    B_UUID_PATH VARCHAR(1500),
+    B_MODULE_UUID VARCHAR(50),
+    B_MODULE_UUID_PATH VARCHAR(1500),
+    CREATED_AT TIMESTAMP
+);
+ALTER TABLE PROJECTS ADD CONSTRAINT PK_PROJECTS PRIMARY KEY(ID);
+CREATE INDEX PROJECTS_ORGANIZATION ON PROJECTS(ORGANIZATION_UUID);
+CREATE UNIQUE INDEX PROJECTS_KEE ON PROJECTS(KEE);
+CREATE INDEX PROJECTS_MODULE_UUID ON PROJECTS(MODULE_UUID);
+CREATE INDEX PROJECTS_PROJECT_UUID ON PROJECTS(PROJECT_UUID);
+CREATE INDEX PROJECTS_QUALIFIER ON PROJECTS(QUALIFIER);
+CREATE INDEX PROJECTS_ROOT_UUID ON PROJECTS(ROOT_UUID);
+CREATE INDEX PROJECTS_UUID ON PROJECTS(UUID);
+
+CREATE TABLE PROPERTIES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    PROP_KEY VARCHAR(512) NOT NULL,
+    RESOURCE_ID BIGINT,
+    USER_ID BIGINT,
+    IS_EMPTY BOOLEAN NOT NULL,
+    TEXT_VALUE VARCHAR(4000),
+    CLOB_VALUE CLOB(2147483647),
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE PROPERTIES ADD CONSTRAINT PK_PROPERTIES PRIMARY KEY(ID);
+CREATE INDEX PROPERTIES_KEY ON PROPERTIES(PROP_KEY);
+
+CREATE TABLE QPROFILE_CHANGES(
+    KEE VARCHAR(40) NOT NULL,
+    RULES_PROFILE_UUID VARCHAR(255) NOT NULL,
+    CHANGE_TYPE VARCHAR(20) NOT NULL,
+    USER_UUID VARCHAR(255),
+    CHANGE_DATA CLOB(2147483647),
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE QPROFILE_CHANGES ADD CONSTRAINT PK_QPROFILE_CHANGES PRIMARY KEY(KEE);
+CREATE INDEX QP_CHANGES_RULES_PROFILE_UUID ON QPROFILE_CHANGES(RULES_PROFILE_UUID);
+
+CREATE TABLE QPROFILE_EDIT_GROUPS(
+    UUID VARCHAR(40) NOT NULL,
+    GROUP_ID INTEGER NOT NULL,
+    QPROFILE_UUID VARCHAR(255) NOT NULL,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE QPROFILE_EDIT_GROUPS ADD CONSTRAINT PK_QPROFILE_EDIT_GROUPS PRIMARY KEY(UUID);
+CREATE INDEX QPROFILE_EDIT_GROUPS_QPROFILE ON QPROFILE_EDIT_GROUPS(QPROFILE_UUID);
+CREATE UNIQUE INDEX QPROFILE_EDIT_GROUPS_UNIQUE ON QPROFILE_EDIT_GROUPS(GROUP_ID, QPROFILE_UUID);
+
+CREATE TABLE QPROFILE_EDIT_USERS(
+    UUID VARCHAR(40) NOT NULL,
+    USER_ID INTEGER NOT NULL,
+    QPROFILE_UUID VARCHAR(255) NOT NULL,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE QPROFILE_EDIT_USERS ADD CONSTRAINT PK_QPROFILE_EDIT_USERS PRIMARY KEY(UUID);
+CREATE INDEX QPROFILE_EDIT_USERS_QPROFILE ON QPROFILE_EDIT_USERS(QPROFILE_UUID);
+CREATE UNIQUE INDEX QPROFILE_EDIT_USERS_UNIQUE ON QPROFILE_EDIT_USERS(USER_ID, QPROFILE_UUID);
+
+CREATE TABLE QUALITY_GATE_CONDITIONS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    QGATE_ID INTEGER,
+    METRIC_ID INTEGER,
+    PERIOD INTEGER,
+    OPERATOR VARCHAR(3),
+    VALUE_ERROR VARCHAR(64),
+    VALUE_WARNING VARCHAR(64),
+    CREATED_AT TIMESTAMP,
+    UPDATED_AT TIMESTAMP
+);
+ALTER TABLE QUALITY_GATE_CONDITIONS ADD CONSTRAINT PK_QUALITY_GATE_CONDITIONS PRIMARY KEY(ID);
+
+CREATE TABLE QUALITY_GATES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    UUID VARCHAR(40) NOT NULL,
+    NAME VARCHAR(100) NOT NULL,
+    IS_BUILT_IN BOOLEAN NOT NULL,
+    CREATED_AT TIMESTAMP,
+    UPDATED_AT TIMESTAMP
+);
+ALTER TABLE QUALITY_GATES ADD CONSTRAINT PK_QUALITY_GATES PRIMARY KEY(ID);
+CREATE UNIQUE INDEX UNIQ_QUALITY_GATES_UUID ON QUALITY_GATES(UUID);
+
+CREATE TABLE RULE_REPOSITORIES(
+    KEE VARCHAR(200) NOT NULL,
+    LANGUAGE VARCHAR(20) NOT NULL,
+    NAME VARCHAR(4000) NOT NULL,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE RULE_REPOSITORIES ADD CONSTRAINT PK_RULE_REPOSITORIES PRIMARY KEY(KEE);
+
+CREATE TABLE RULES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    NAME VARCHAR(200),
+    PLUGIN_RULE_KEY VARCHAR(200) NOT NULL,
+    PLUGIN_KEY VARCHAR(200),
+    PLUGIN_CONFIG_KEY VARCHAR(200),
+    PLUGIN_NAME VARCHAR(255) NOT NULL,
+    SCOPE VARCHAR(20) NOT NULL,
+    DESCRIPTION CLOB(2147483647),
+    PRIORITY INTEGER,
+    TEMPLATE_ID INTEGER,
+    STATUS VARCHAR(40),
+    LANGUAGE VARCHAR(20),
+    DEF_REMEDIATION_FUNCTION VARCHAR(20),
+    DEF_REMEDIATION_GAP_MULT VARCHAR(20),
+    DEF_REMEDIATION_BASE_EFFORT VARCHAR(20),
+    GAP_DESCRIPTION VARCHAR(4000),
+    SYSTEM_TAGS VARCHAR(4000),
+    IS_TEMPLATE BOOLEAN DEFAULT FALSE NOT NULL,
+    DESCRIPTION_FORMAT VARCHAR(20),
+    RULE_TYPE TINYINT,
+    SECURITY_STANDARDS VARCHAR(4000),
+    IS_AD_HOC BOOLEAN NOT NULL,
+    IS_EXTERNAL BOOLEAN NOT NULL,
+    CREATED_AT BIGINT,
+    UPDATED_AT BIGINT
+);
+ALTER TABLE RULES ADD CONSTRAINT PK_RULES PRIMARY KEY(ID);
+CREATE UNIQUE INDEX RULES_REPO_KEY ON RULES(PLUGIN_RULE_KEY, PLUGIN_NAME);
+
+CREATE TABLE RULES_METADATA(
+    RULE_ID INTEGER NOT NULL,
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    NOTE_DATA CLOB(2147483647),
+    NOTE_USER_UUID VARCHAR(255),
+    NOTE_CREATED_AT BIGINT,
+    NOTE_UPDATED_AT BIGINT,
+    REMEDIATION_FUNCTION VARCHAR(20),
+    REMEDIATION_GAP_MULT VARCHAR(20),
+    REMEDIATION_BASE_EFFORT VARCHAR(20),
+    TAGS VARCHAR(4000),
+    AD_HOC_NAME VARCHAR(200),
+    AD_HOC_DESCRIPTION CLOB(2147483647),
+    AD_HOC_SEVERITY VARCHAR(10),
+    AD_HOC_TYPE TINYINT,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE RULES_METADATA ADD CONSTRAINT PK_RULES_METADATA PRIMARY KEY(RULE_ID, ORGANIZATION_UUID);
+
+CREATE TABLE RULES_PARAMETERS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    RULE_ID INTEGER NOT NULL,
+    NAME VARCHAR(128) NOT NULL,
+    DESCRIPTION VARCHAR(4000),
+    PARAM_TYPE VARCHAR(512) NOT NULL,
+    DEFAULT_VALUE VARCHAR(4000)
+);
+ALTER TABLE RULES_PARAMETERS ADD CONSTRAINT PK_RULES_PARAMETERS PRIMARY KEY(ID);
+CREATE INDEX RULES_PARAMETERS_RULE_ID ON RULES_PARAMETERS(RULE_ID);
+CREATE UNIQUE INDEX RULES_PARAMETERS_UNIQUE ON RULES_PARAMETERS(RULE_ID, NAME);
+
+CREATE TABLE RULES_PROFILES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    NAME VARCHAR(100) NOT NULL,
+    LANGUAGE VARCHAR(20),
+    KEE VARCHAR(255) NOT NULL,
+    IS_BUILT_IN BOOLEAN NOT NULL,
+    RULES_UPDATED_AT VARCHAR(100),
+    CREATED_AT TIMESTAMP,
+    UPDATED_AT TIMESTAMP
+);
+ALTER TABLE RULES_PROFILES ADD CONSTRAINT PK_RULES_PROFILES PRIMARY KEY(ID);
+CREATE UNIQUE INDEX UNIQ_QPROF_KEY ON RULES_PROFILES(KEE);
+
+CREATE TABLE SNAPSHOTS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    UUID VARCHAR(50) NOT NULL,
+    COMPONENT_UUID VARCHAR(50) NOT NULL,
+    STATUS VARCHAR(4) DEFAULT 'U' NOT NULL,
+    ISLAST BOOLEAN DEFAULT FALSE NOT NULL,
+    VERSION VARCHAR(500),
+    PURGE_STATUS INTEGER,
+    BUILD_STRING VARCHAR(100),
+    REVISION VARCHAR(100),
+    BUILD_DATE BIGINT,
+    PERIOD1_MODE VARCHAR(100),
+    PERIOD1_PARAM VARCHAR(100),
+    PERIOD2_MODE VARCHAR(100),
+    PERIOD2_PARAM VARCHAR(100),
+    PERIOD3_MODE VARCHAR(100),
+    PERIOD3_PARAM VARCHAR(100),
+    PERIOD4_MODE VARCHAR(100),
+    PERIOD4_PARAM VARCHAR(100),
+    PERIOD5_MODE VARCHAR(100),
+    PERIOD5_PARAM VARCHAR(100),
+    PERIOD1_DATE BIGINT,
+    PERIOD2_DATE BIGINT,
+    PERIOD3_DATE BIGINT,
+    PERIOD4_DATE BIGINT,
+    PERIOD5_DATE BIGINT,
+    CREATED_AT BIGINT
+);
+ALTER TABLE SNAPSHOTS ADD CONSTRAINT PK_SNAPSHOTS PRIMARY KEY(ID);
+CREATE UNIQUE INDEX ANALYSES_UUID ON SNAPSHOTS(UUID);
+CREATE INDEX SNAPSHOT_COMPONENT ON SNAPSHOTS(COMPONENT_UUID);
+
+CREATE TABLE USER_PROPERTIES(
+    UUID VARCHAR(40) NOT NULL,
+    USER_UUID VARCHAR(255) NOT NULL,
+    KEE VARCHAR(100) NOT NULL,
+    TEXT_VALUE VARCHAR(4000) NOT NULL,
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT NOT NULL
+);
+ALTER TABLE USER_PROPERTIES ADD CONSTRAINT PK_USER_PROPERTIES PRIMARY KEY(UUID);
+CREATE UNIQUE INDEX USER_PROPERTIES_USER_UUID_KEE ON USER_PROPERTIES(USER_UUID, KEE);
+
+CREATE TABLE USER_ROLES(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    ORGANIZATION_UUID VARCHAR(40) NOT NULL,
+    USER_ID INTEGER,
+    RESOURCE_ID INTEGER,
+    ROLE VARCHAR(64) NOT NULL
+);
+ALTER TABLE USER_ROLES ADD CONSTRAINT PK_USER_ROLES PRIMARY KEY(ID);
+CREATE INDEX USER_ROLES_RESOURCE ON USER_ROLES(RESOURCE_ID);
+CREATE INDEX USER_ROLES_USER ON USER_ROLES(USER_ID);
+
+CREATE TABLE USER_TOKENS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    USER_UUID VARCHAR(255) NOT NULL,
+    NAME VARCHAR(100) NOT NULL,
+    TOKEN_HASH VARCHAR(255) NOT NULL,
+    LAST_CONNECTION_DATE BIGINT,
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE USER_TOKENS ADD CONSTRAINT PK_USER_TOKENS PRIMARY KEY(ID);
+CREATE UNIQUE INDEX USER_TOKENS_USER_UUID_NAME ON USER_TOKENS(USER_UUID, NAME);
+CREATE UNIQUE INDEX USER_TOKENS_TOKEN_HASH ON USER_TOKENS(TOKEN_HASH);
+
+CREATE TABLE USERS(
+    ID INTEGER NOT NULL AUTO_INCREMENT (1,1),
+    UUID VARCHAR(255) NOT NULL,
+    LOGIN VARCHAR(255) NOT NULL,
+    ORGANIZATION_UUID VARCHAR(40),
+    NAME VARCHAR(200),
+    EMAIL VARCHAR(100),
+    CRYPTED_PASSWORD VARCHAR(100),
+    SALT VARCHAR(40),
+    HASH_METHOD VARCHAR(10),
+    ACTIVE BOOLEAN DEFAULT TRUE,
+    SCM_ACCOUNTS VARCHAR(4000),
+    EXTERNAL_LOGIN VARCHAR(255) NOT NULL,
+    EXTERNAL_IDENTITY_PROVIDER VARCHAR(100) NOT NULL,
+    EXTERNAL_ID VARCHAR(255) NOT NULL,
+    IS_ROOT BOOLEAN NOT NULL,
+    USER_LOCAL BOOLEAN,
+    ONBOARDED BOOLEAN NOT NULL,
+    HOMEPAGE_TYPE VARCHAR(40),
+    HOMEPAGE_PARAMETER VARCHAR(40),
+    LAST_CONNECTION_DATE BIGINT,
+    CREATED_AT BIGINT,
+    UPDATED_AT BIGINT
+);
+ALTER TABLE USERS ADD CONSTRAINT PK_USERS PRIMARY KEY(ID);
+CREATE UNIQUE INDEX USERS_LOGIN ON USERS(LOGIN);
+CREATE INDEX USERS_UPDATED_AT ON USERS(UPDATED_AT);
+CREATE UNIQUE INDEX USERS_UUID ON USERS(UUID);
+CREATE UNIQUE INDEX UNIQ_EXTERNAL_ID ON USERS(EXTERNAL_IDENTITY_PROVIDER, EXTERNAL_ID);
+CREATE UNIQUE INDEX UNIQ_EXTERNAL_LOGIN ON USERS(EXTERNAL_IDENTITY_PROVIDER, EXTERNAL_LOGIN);
+
+CREATE TABLE WEBHOOK_DELIVERIES(
+    UUID VARCHAR(40) NOT NULL,
+    WEBHOOK_UUID VARCHAR(40) NOT NULL,
+    COMPONENT_UUID VARCHAR(40) NOT NULL,
+    CE_TASK_UUID VARCHAR(40),
+    ANALYSIS_UUID VARCHAR(40),
+    NAME VARCHAR(100) NOT NULL,
+    URL VARCHAR(2000) NOT NULL,
+    SUCCESS BOOLEAN NOT NULL,
+    HTTP_STATUS INTEGER,
+    DURATION_MS BIGINT NOT NULL,
+    PAYLOAD CLOB(2147483647) NOT NULL,
+    ERROR_STACKTRACE CLOB(2147483647),
+    CREATED_AT BIGINT NOT NULL
+);
+ALTER TABLE WEBHOOK_DELIVERIES ADD CONSTRAINT PK_WEBHOOK_DELIVERIES PRIMARY KEY(UUID);
+CREATE INDEX COMPONENT_UUID ON WEBHOOK_DELIVERIES(COMPONENT_UUID);
+CREATE INDEX CE_TASK_UUID ON WEBHOOK_DELIVERIES(CE_TASK_UUID);
+
+CREATE TABLE WEBHOOKS(
+    UUID VARCHAR(40) NOT NULL,
+    ORGANIZATION_UUID VARCHAR(40),
+    PROJECT_UUID VARCHAR(40),
+    NAME VARCHAR(100) NOT NULL,
+    URL VARCHAR(2000) NOT NULL,
+    SECRET VARCHAR(200),
+    CREATED_AT BIGINT NOT NULL,
+    UPDATED_AT BIGINT
+);
+ALTER TABLE WEBHOOKS ADD CONSTRAINT PK_WEBHOOKS PRIMARY KEY(UUID);
+CREATE INDEX ORGANIZATION_WEBHOOK ON WEBHOOKS(ORGANIZATION_UUID);
+CREATE INDEX PROJECT_WEBHOOK ON WEBHOOKS(PROJECT_UUID);
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/DdlUtilsTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/DdlUtilsTest.java
deleted file mode 100644 (file)
index 0423d6d..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.db;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import org.h2.Driver;
-import org.junit.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class DdlUtilsTest {
-
-  @Test
-  public void shouldCreateSchema_with_schema_migrations() throws SQLException {
-    DriverManager.registerDriver(new Driver());
-    try (Connection connection = DriverManager.getConnection("jdbc:h2:mem:sonar_test")) {
-      DdlUtils.createSchema(connection, "h2", true);
-
-      int tableCount = countTables(connection);
-      assertThat(tableCount).isGreaterThan(30);
-
-      verifySchemaMigrationsNotPopulated(connection);
-    }
-  }
-
-  @Test
-  public void shouldCreateSchema_without_schema_migrations() throws SQLException {
-    DriverManager.registerDriver(new Driver());
-    try (Connection connection = DriverManager.getConnection("jdbc:h2:mem:sonar_test2")) {
-      try (Statement statement = connection.createStatement()) {
-        statement.execute("create table schema_migrations (version varchar(255) not null)");
-      }
-      DdlUtils.createSchema(connection, "h2", false);
-
-      verifySchemaMigrationsNotPopulated(connection);
-    }
-  }
-
-  static int countTables(Connection connection) throws SQLException {
-    int count = 0;
-    ResultSet resultSet = connection.getMetaData().getTables("", null, null, new String[] {"TABLE"});
-    while (resultSet.next()) {
-      count++;
-    }
-    resultSet.close();
-    return count;
-  }
-
-  private void verifySchemaMigrationsNotPopulated(Connection connection) throws SQLException {
-    try (Statement statement = connection.createStatement();
-      ResultSet resultSet = statement.executeQuery("select count(*) from schema_migrations")) {
-      assertThat(resultSet.next()).isTrue();
-      assertThat(resultSet.getLong(1)).isEqualTo(0);
-      assertThat(resultSet.next()).isFalse();
-    }
-  }
-
-}
index 44bbaf93dfac25091f488b2a0573d63e78c1d43f..c102ff0b0f6b9b8eb1be4fa42ecedf7e4d41b838 100644 (file)
@@ -21,58 +21,65 @@ package org.sonar.db;
 
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.List;
 import javax.sql.DataSource;
-import org.apache.commons.dbcp2.BasicDataSource;
 import org.apache.commons.dbutils.DbUtils;
+import org.sonar.api.SonarEdition;
+import org.sonar.api.SonarQubeSide;
+import org.sonar.api.internal.SonarRuntimeImpl;
+import org.sonar.api.utils.System2;
+import org.sonar.api.utils.Version;
+import org.sonar.api.utils.log.Loggers;
+import org.sonar.core.platform.ComponentContainer;
+import org.sonar.core.util.UuidFactoryFast;
+import org.sonar.core.util.logs.Profiler;
 import org.sonar.db.dialect.Dialect;
 import org.sonar.db.dialect.H2;
+import org.sonar.server.platform.db.migration.MigrationConfigurationModule;
+import org.sonar.server.platform.db.migration.engine.MigrationContainer;
+import org.sonar.server.platform.db.migration.engine.MigrationContainerImpl;
+import org.sonar.server.platform.db.migration.engine.MigrationContainerPopulator;
+import org.sonar.server.platform.db.migration.engine.MigrationContainerPopulatorImpl;
+import org.sonar.server.platform.db.migration.history.MigrationHistoryTableImpl;
+import org.sonar.server.platform.db.migration.step.MigrationStep;
+import org.sonar.server.platform.db.migration.step.MigrationStepExecutionException;
+import org.sonar.server.platform.db.migration.step.MigrationSteps;
+import org.sonar.server.platform.db.migration.step.MigrationStepsExecutor;
+import org.sonar.server.platform.db.migration.step.RegisteredMigrationStep;
+import org.sonar.server.platform.db.migration.version.DbVersion;
 
-import static java.lang.String.format;
+import static com.google.common.base.Preconditions.checkState;
 
 /**
- * H2 in-memory database, used for unit tests only.
- *
- * @since 3.2
+ * H2 in-memory database, used for unit tests against an empty DB, a specific script or against SQ schema.
  */
-public class H2Database implements Database {
-  private final String name;
+public class H2Database extends CoreH2Database {
   private final boolean createSchema;
-  private BasicDataSource datasource;
 
   /**
    * IMPORTANT: change DB name in order to not conflict with {@link DefaultDatabaseTest}
    */
   public H2Database(String name, boolean createSchema) {
-    this.name = name;
+    super(name);
     this.createSchema = createSchema;
   }
 
   @Override
   public void start() {
-    startDatabase();
+    super.start();
     if (createSchema) {
       createSchema();
     }
   }
 
-  private void startDatabase() {
-    try {
-      datasource = new BasicDataSource();
-      datasource.setDriverClassName("org.h2.Driver");
-      datasource.setUsername("sonar");
-      datasource.setPassword("sonar");
-      datasource.setUrl("jdbc:h2:mem:" + name);
-    } catch (Exception e) {
-      throw new IllegalStateException("Fail to start H2", e);
-    }
-  }
-
   private void createSchema() {
     Connection connection = null;
     try {
-      connection = datasource.getConnection();
-      DdlUtils.createSchema(connection, "h2", true);
-
+      connection = getDataSource().getConnection();
+      NoopH2Database noopH2Database = new NoopH2Database();
+      // create and populate schema
+      createMigrationHistoryTable(noopH2Database);
+      executeDbMigrations(noopH2Database);
     } catch (SQLException e) {
       throw new IllegalStateException("Fail to create schema", e);
     } finally {
@@ -80,43 +87,101 @@ public class H2Database implements Database {
     }
   }
 
-  public void executeScript(String classloaderPath) {
-    Connection connection = null;
-    try {
-      connection = datasource.getConnection();
-      CoreDdlUtils.executeScript(connection, classloaderPath);
-
-    } catch (SQLException e) {
-      throw new IllegalStateException("Fail to execute script: " + classloaderPath, e);
-    } finally {
-      DbUtils.closeQuietly(connection);
+  public static final class H2MigrationContainerPopulator extends MigrationContainerPopulatorImpl {
+    public H2MigrationContainerPopulator(DbVersion... dbVersions) {
+      super(H2StepExecutor.class, dbVersions);
     }
   }
 
-  @Override
-  public void stop() {
-    try {
-      datasource.close();
-    } catch (SQLException e) {
-      // Ignore error
+  public static final class H2StepExecutor implements MigrationStepsExecutor {
+    private static final String STEP_START_PATTERN = "{}...";
+    private static final String STEP_STOP_PATTERN = "{}: {}";
+
+    private final ComponentContainer componentContainer;
+
+    public H2StepExecutor(ComponentContainer componentContainer) {
+      this.componentContainer = componentContainer;
+    }
+
+    @Override
+    public void execute(List<RegisteredMigrationStep> steps) {
+      steps.forEach(step -> execute(step, componentContainer));
     }
-  }
 
-  public DataSource getDataSource() {
-    return datasource;
+    private void execute(RegisteredMigrationStep step, ComponentContainer componentContainer) {
+      MigrationStep migrationStep = componentContainer.getComponentByType(step.getStepClass());
+      checkState(migrationStep != null, "Can not find instance of " + step.getStepClass());
+
+      execute(step, migrationStep);
+    }
+
+    private void execute(RegisteredMigrationStep step, MigrationStep migrationStep) {
+      Profiler stepProfiler = Profiler.create(Loggers.get(H2Database.class));
+      stepProfiler.startInfo(STEP_START_PATTERN, step);
+      boolean done = false;
+      try {
+        migrationStep.execute();
+        done = true;
+      } catch (Exception e) {
+        throw new MigrationStepExecutionException(step, e);
+      } finally {
+        if (done) {
+          stepProfiler.stopInfo(STEP_STOP_PATTERN, step, "success");
+        } else {
+          stepProfiler.stopError(STEP_STOP_PATTERN, step, "failure");
+        }
+      }
+    }
   }
 
-  public Dialect getDialect() {
-    return new H2();
+  private void executeDbMigrations(NoopH2Database noopH2Database) {
+    ComponentContainer parentContainer = new ComponentContainer();
+    parentContainer.add(noopH2Database);
+    parentContainer.add(H2MigrationContainerPopulator.class);
+    MigrationConfigurationModule migrationConfigurationModule = new MigrationConfigurationModule();
+    migrationConfigurationModule.configure(parentContainer);
+
+    // dependencies required by DB migrations
+    parentContainer.add(SonarRuntimeImpl.forSonarQube(Version.create(8, 0), SonarQubeSide.SERVER, SonarEdition.COMMUNITY));
+    parentContainer.add(UuidFactoryFast.getInstance());
+    parentContainer.add(System2.INSTANCE);
+
+    parentContainer.startComponents();
+
+    MigrationContainer migrationContainer = new MigrationContainerImpl(parentContainer, parentContainer.getComponentByType(MigrationContainerPopulator.class));
+    MigrationSteps migrationSteps = migrationContainer.getComponentByType(MigrationSteps.class);
+    migrationContainer.getComponentByType(MigrationStepsExecutor.class)
+      .execute(migrationSteps.readAll());
   }
 
-  @Override
-  public void enableSqlLogging(boolean enable) {
-    throw new UnsupportedOperationException();
+  private void createMigrationHistoryTable(NoopH2Database noopH2Database) {
+    new MigrationHistoryTableImpl(noopH2Database).start();
   }
 
-  @Override
-  public String toString() {
-    return format("H2 Database[%s]", name);
+  private class NoopH2Database implements Database {
+    @Override
+    public DataSource getDataSource() {
+      return H2Database.this.getDataSource();
+    }
+
+    @Override
+    public Dialect getDialect() {
+      return new H2();
+    }
+
+    @Override
+    public void enableSqlLogging(boolean enable) {
+
+    }
+
+    @Override
+    public void start() {
+      // do nothing
+    }
+
+    @Override
+    public void stop() {
+      // do nothing
+    }
   }
 }
index e4dec16889339c8b718b315ee17670b5ccf6c7b3..98a64beb4f70afae0521e5faaaf1a5c837a7b632 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.db;
 
 import java.sql.Connection;
+import java.sql.ResultSet;
 import java.sql.SQLException;
 import org.junit.After;
 import org.junit.Before;
@@ -43,9 +44,19 @@ public class H2DatabaseTest {
   @Test
   public void shouldExecuteDdlAtStartup() throws SQLException {
     Connection connection = db.getDataSource().getConnection();
-    int tableCount = DdlUtilsTest.countTables(connection);
+    int tableCount = countTables(connection);
     connection.close();
 
     assertThat(tableCount).isGreaterThan(30);
   }
+
+  private static int countTables(Connection connection) throws SQLException {
+    int count = 0;
+    ResultSet resultSet = connection.getMetaData().getTables("", null, null, new String[] {"TABLE"});
+    while (resultSet.next()) {
+      count++;
+    }
+    resultSet.close();
+    return count;
+  }
 }
index e5ef68b7fcf1813655a625e30c295a6c5f12f4bc..d3a80308f9164606859e2da0eb781a533e74a09f 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.db;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.BiConsumer;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import javax.annotation.Nullable;
 import org.apache.commons.codec.digest.DigestUtils;
@@ -51,7 +52,7 @@ class TestDbImpl extends CoreTestDb {
     this.myBatis = myBatis;
   }
 
-  void init(@Nullable String schemaPath, MyBatisConfExtension[] confExtensions) {
+  private void init(@Nullable String schemaPath, MyBatisConfExtension[] confExtensions) {
     Function<Settings, Database> databaseCreator = settings -> {
       String dialect = settings.getString("sonar.jdbc.dialect");
       if (dialect != null && !"h2".equals(dialect)) {
@@ -59,15 +60,17 @@ class TestDbImpl extends CoreTestDb {
       }
       return new H2Database("h2Tests" + DigestUtils.md5Hex(StringUtils.defaultString(schemaPath)), schemaPath == null);
     };
-    Function<Database, Boolean> schemaPathExecutor = database -> {
-      if (schemaPath != null) {
-        // will fail if not H2
-        if (!database.getDialect().getId().equals("h2")) {
-          return false;
-        }
-        ((H2Database) database).executeScript(schemaPath);
+    Consumer<Database> schemaPathExecutor = database -> {
+      if (schemaPath == null) {
+        return;
       }
-      return true;
+
+      // scripts are assumed to be using H2 specific syntax, ignore the test if not on H2
+      if (!database.getDialect().getId().equals("h2")) {
+        database.stop();
+        throw new AssumptionViolatedException("This test is intended to be run on H2 only");
+      }
+      ((H2Database) database).executeScript(schemaPath);
     };
     BiConsumer<Database, Boolean> createMyBatis = (db, created) -> myBatis = newMyBatis(db, confExtensions);
     init(databaseCreator, schemaPathExecutor, createMyBatis);
@@ -80,7 +83,7 @@ class TestDbImpl extends CoreTestDb {
   }
 
   static TestDbImpl create(@Nullable String schemaPath, MyBatisConfExtension... confExtensions) {
-    MyBatisConfExtension[] extensionArray = confExtensions == null || confExtensions.length == 0 ? null : confExtensions;
+    MyBatisConfExtension[] extensionArray = confExtensions.length == 0 ? null : confExtensions;
     if (schemaPath == null) {
       if (defaultSchemaBaseTestDb == null) {
         defaultSchemaBaseTestDb = new TestDbImpl((String) null);
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/dump/DumpSQSchema.java b/server/sonar-db-dao/src/test/java/org/sonar/db/dump/DumpSQSchema.java
new file mode 100644 (file)
index 0000000..49ebe22
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * 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.dump;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.sql.SQLException;
+import org.apache.commons.io.FileUtils;
+
+public class DumpSQSchema {
+
+  public static void main(String[] args) {
+    SQSchemaDumper dumper = new SQSchemaDumper();
+    try {
+      File targetFile = new File("src/schema/schema-sq.ddl");
+      if (!targetFile.exists()) {
+        System.out.println("Can not find schema dump file: '" + targetFile + "'");
+        System.exit(1);
+      }
+
+      Charset charset = Charset.forName("UTF8");
+      String oldContent = FileUtils.readFileToString(targetFile, charset);
+      String newContent = dumper.dumpToText();
+      boolean upToDate = newContent.equals(oldContent);
+      FileUtils.write(targetFile, newContent, charset);
+      if (!upToDate) {
+        System.err.println("SQL Schema dump file has changed. Please review and commit " + targetFile.getAbsolutePath());
+        System.exit(137);
+      }
+    } catch (SQLException | IOException e) {
+      e.printStackTrace();
+      System.exit(1);
+    }
+  }
+
+}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/dump/SQSchemaDumper.java b/server/sonar-db-dao/src/test/java/org/sonar/db/dump/SQSchemaDumper.java
new file mode 100644 (file)
index 0000000..3dca390
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * 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.dump;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import org.sonar.db.H2Database;
+
+import static com.google.common.base.Preconditions.checkState;
+
+class SQSchemaDumper {
+  private static final String LINE_SEPARATOR = "\n";
+  private static final String HEADER = "" +
+    "###############################################################" + LINE_SEPARATOR +
+    "####  Description of SonarQube's schema in H2 SQL syntax   ####" + LINE_SEPARATOR +
+    "####                                                       ####" + LINE_SEPARATOR +
+    "####   This file is autogenerated and stored in SCM to     ####" + LINE_SEPARATOR +
+    "####   conveniently read the SonarQube's schema at any     ####" + LINE_SEPARATOR +
+    "####   point in time.                                      ####" + LINE_SEPARATOR +
+    "####                                                       ####" + LINE_SEPARATOR +
+    "####          DO NOT MODIFY THIS FILE DIRECTLY             ####" + LINE_SEPARATOR +
+    "####    use gradle task :server:sonar-db-dao:dumpSchema    ####" + LINE_SEPARATOR +
+    "###############################################################" + LINE_SEPARATOR;
+  private static final String TABLE_SCHEMA_MIGRATIONS = "SCHEMA_MIGRATIONS";
+  private static final Comparator<String> SCHEMA_MIGRATIONS_THEN_NATURAL_ORDER = ((Comparator<String>) (o1, o2) -> {
+    if (o1.equals(TABLE_SCHEMA_MIGRATIONS)) {
+      return -1;
+    }
+    if (o2.equals(TABLE_SCHEMA_MIGRATIONS)) {
+      return 1;
+    }
+    return 0;
+  }).thenComparing(String.CASE_INSENSITIVE_ORDER);
+
+  String dumpToText() throws SQLException {
+    H2Database database = new H2Database("SQSchemaDumper", true);
+    database.start();
+
+    try (Connection connection = database.getDataSource().getConnection();
+         Statement statement = connection.createStatement()) {
+      List<String> tableNames = getSortedTableNames(statement);
+
+      StringBuilder res = new StringBuilder(HEADER);
+      for (String tableName : tableNames) {
+        res.append(LINE_SEPARATOR);
+        dumpTable(statement, res, tableName);
+      }
+      return res.toString();
+    }
+  }
+
+  /**
+   * List of all tables in database sorted in natural order except that table {@link #TABLE_SCHEMA_MIGRATIONS SCHEMA_MIGRATIONS}
+   * will always be first.
+   */
+  private List<String> getSortedTableNames(Statement statement) throws SQLException {
+    checkState(statement.execute("SHOW TABLES"), "can't list tables");
+    List<String> tableNames = new ArrayList<>();
+    try (ResultSet rSet = statement.getResultSet()) {
+      while (rSet.next()) {
+        tableNames.add(rSet.getString(1));
+      }
+    }
+    tableNames.sort(SCHEMA_MIGRATIONS_THEN_NATURAL_ORDER);
+    return tableNames;
+  }
+
+  private void dumpTable(Statement statement, StringBuilder res, String tableName) throws SQLException {
+    checkState(statement.execute("SCRIPT NODATA NOSETTINGS TABLE " + tableName), "Can't get schema dump of table %s", tableName);
+    try (ResultSet resultSet = statement.getResultSet()) {
+      while (resultSet.next()) {
+        String sql = resultSet.getString(1);
+        if (isIgnoredStatement(sql)) {
+          continue;
+        }
+
+        String cleanedSql = sql
+          .replaceAll(" PUBLIC\\.", " ")
+          .replaceAll(" MEMORY TABLE ", " TABLE ");
+        if (cleanedSql.startsWith("CREATE TABLE")) {
+          cleanedSql = fixAutoIncrementIdColumn(cleanedSql);
+        }
+        res.append(cleanedSql).append(LINE_SEPARATOR);
+      }
+    }
+  }
+
+  private static boolean isIgnoredStatement(String sql) {
+    return sql.startsWith("CREATE SEQUENCE") || sql.startsWith("CREATE USER") || sql.startsWith("--");
+  }
+
+  /**
+   * Hacky hacky hack: H2 generates DDL for auto increment column which varies from one run to another and is hardly
+   * readable for user.
+   * It's currently reasonable to assume:
+   * <ul>
+   *   <li>all existing auto increment columns are called ID</li>
+   *   <li>it's not a practice to create auto increment anymore => no new will be added which could have a different name</li>
+   * </ul>
+   */
+  private String fixAutoIncrementIdColumn(String cleanedSql) {
+    String res = fixAutoIncrementIdColumn(cleanedSql, "ID INTEGER DEFAULT (NEXT VALUE FOR ", "ID INTEGER NOT NULL AUTO_INCREMENT (1,1)");
+    res = fixAutoIncrementIdColumn(res, "ID BIGINT DEFAULT (NEXT VALUE FOR ", "ID BIGINT NOT NULL AUTO_INCREMENT (1,1)");
+    return res;
+  }
+
+  private static String fixAutoIncrementIdColumn(String sql, String src, String tgt) {
+    int idAutoGenColumn = sql.indexOf(src);
+    if (idAutoGenColumn < 0) {
+      return sql;
+    }
+
+    int comma = sql.indexOf(",", idAutoGenColumn + 1);
+    checkState(comma > -1, "can't find end of ID column declaration??");
+    StringBuilder bar = new StringBuilder(sql);
+    bar.replace(idAutoGenColumn, comma, tgt);
+    return bar.toString();
+  }
+}
index fc1127987c32703b924451f79b572702985e93c6..b199571a48c56a1bb36e8bdd264520d9132603bf 100644 (file)
@@ -24,7 +24,7 @@ import org.sonar.server.platform.db.migration.history.MigrationHistoryImpl;
 import org.sonar.server.platform.db.migration.history.MigrationHistoryMeddler;
 import org.sonar.server.platform.db.migration.step.MigrationStepRegistryImpl;
 import org.sonar.server.platform.db.migration.step.MigrationStepsProvider;
-import org.sonar.server.platform.db.migration.version.v79.DbVersion79;
+import org.sonar.server.platform.db.migration.version.v00.DbVersion00;
 import org.sonar.server.platform.db.migration.version.v80.DbVersion80;
 
 public class MigrationConfigurationModule extends Module {
@@ -32,7 +32,7 @@ public class MigrationConfigurationModule extends Module {
   protected void configureModule() {
     add(
       // DbVersion implementations
-      DbVersion79.class,
+      DbVersion00.class,
       DbVersion80.class,
 
       // migration steps
index 432ce8664a16cb6a90fc32b52185b479dd1ee4ee..2c89a904094b6d70a53378671a41f25378c3f5f3 100644 (file)
@@ -24,6 +24,7 @@ import java.util.HashSet;
 import java.util.Set;
 import org.sonar.server.platform.db.migration.step.MigrationStep;
 import org.sonar.server.platform.db.migration.step.MigrationSteps;
+import org.sonar.server.platform.db.migration.step.MigrationStepsExecutor;
 import org.sonar.server.platform.db.migration.step.MigrationStepsExecutorImpl;
 import org.sonar.server.platform.db.migration.version.DbVersion;
 
@@ -38,14 +39,20 @@ import org.sonar.server.platform.db.migration.version.DbVersion;
  */
 public class MigrationContainerPopulatorImpl implements MigrationContainerPopulator {
   private final DbVersion[] dbVersions;
+  private final Class<? extends MigrationStepsExecutor> executorType;
 
   public MigrationContainerPopulatorImpl(DbVersion... dbVersions) {
+    this(MigrationStepsExecutorImpl.class, dbVersions);
+  }
+
+  protected MigrationContainerPopulatorImpl(Class<? extends MigrationStepsExecutor> executorType, DbVersion... dbVersions) {
     this.dbVersions = dbVersions;
+    this.executorType = executorType;
   }
 
   @Override
   public void populateContainer(MigrationContainer container) {
-    container.add(MigrationStepsExecutorImpl.class);
+    container.add(executorType);
     populateFromDbVersion(container);
     populateFromMigrationSteps(container);
   }
index c4620a40d8026d73af166a40c01c815ad13d7bb5..e84746ec219ebe8c05c014e16ddedf997f118324 100644 (file)
@@ -41,7 +41,7 @@ public abstract class DdlChange implements MigrationStep {
   @Override
   public final void execute() throws SQLException {
     try (Connection writeConnection = createDdlConnection()) {
-      Context context = new Context(writeConnection);
+      Context context = new ContextImpl(writeConnection);
       execute(context);
     }
   }
@@ -62,22 +62,31 @@ public abstract class DdlChange implements MigrationStep {
     return db.getDialect();
   }
 
-  public static class Context {
+  public interface Context {
+    void execute(String sql);
+
+    void execute(String... sqls);
+
+    void execute(List<String> sqls);
+  }
+
+  private static class ContextImpl implements Context {
     private static final int ERROR_HANDLING_THRESHOLD = 10;
     // the tricky regexp is required to match "NULL" but not "NOT NULL"
     private final Pattern nullPattern = Pattern.compile("\\h?(?<!NOT )NULL");
     private final Pattern notNullPattern = Pattern.compile("\\h?NOT NULL");
     private final Connection writeConnection;
 
-    public Context(Connection writeConnection) {
+    private ContextImpl(Connection writeConnection) {
       this.writeConnection = writeConnection;
     }
 
-    public void execute(String sql) throws SQLException {
+    @Override
+    public void execute(String sql) {
       execute(sql, sql, 0);
     }
 
-    public void execute(String original, String sql, int errorCount) throws SQLException {
+    private void execute(String original, String sql, int errorCount) {
       try (Statement stmt = writeConnection.createStatement()) {
         stmt.execute(sql);
         writeConnection.commit();
@@ -108,11 +117,13 @@ public abstract class DdlChange implements MigrationStep {
       }
     }
 
-    public void execute(String... sqls) throws SQLException {
+    @Override
+    public void execute(String... sqls) {
       execute(asList(sqls));
     }
 
-    public void execute(List<String> sqls) throws SQLException {
+    @Override
+    public void execute(List<String> sqls) {
       for (String sql : sqls) {
         execute(sql);
       }
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchema.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchema.java
new file mode 100644 (file)
index 0000000..a999c79
--- /dev/null
@@ -0,0 +1,1375 @@
+/*
+ * 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.version.v00;
+
+import java.sql.SQLException;
+import org.sonar.db.Database;
+import org.sonar.server.platform.db.migration.def.BigIntegerColumnDef;
+import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
+import org.sonar.server.platform.db.migration.def.ColumnDef;
+import org.sonar.server.platform.db.migration.def.IntegerColumnDef;
+import org.sonar.server.platform.db.migration.def.TinyIntColumnDef;
+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.BigIntegerColumnDef.newBigIntegerColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.def.BlobColumnDef.newBlobColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.def.BooleanColumnDef.newBooleanColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.def.ClobColumnDef.newClobColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.def.DecimalColumnDef.newDecimalColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.def.IntegerColumnDef.newIntegerColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.def.TimestampColumnDef.newTimestampColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.def.TinyIntColumnDef.newTinyIntColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.MAX_SIZE;
+import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
+import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_VARCHAR_SIZE;
+import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
+import static org.sonar.server.platform.db.migration.sql.CreateTableBuilder.ColumnFlag.AUTO_INCREMENT;
+
+public class CreateInitialSchema extends DdlChange {
+
+  public CreateInitialSchema(Database db) {
+    super(db);
+  }
+
+  @Override
+  public void execute(Context context) throws SQLException {
+    createActiveRuleParameters(context);
+    createActiveRules(context);
+    createAlmAppInstalls(context);
+    createAnalysisProperties(context);
+    createCeActivity(context);
+    createCeQueue(context);
+    createCeScannerContext(context);
+    createCeTaskCharacteristics(context);
+    createCeTaskInput(context);
+    createCeTaskMessage(context);
+    createDefaultQProfiles(context);
+    createDeprecatedRuleKeys(context);
+    createDuplicationsIndex(context);
+    createEsQueue(context);
+    createEventComponentChanges(context);
+    createEvents(context);
+    createFileSources(context);
+    createGroupRoles(context);
+    createGroups(context);
+    createGroupsUsers(context);
+    createInternalComponentProps(context);
+    createInternalProperties(context);
+    createIssueChanges(context);
+    createIssues(context);
+    createLiveMeasures(context);
+    createManualMeasures(context);
+    createMetrics(context);
+    createNotifications(context);
+    createOrgQProfiles(context);
+    createOrgQualityGates(context);
+    createOrganizationAlmBindings(context);
+    createOrganizationMembers(context);
+    createOrganizations(context);
+    createPermTemplatesGroups(context);
+    createPermTemplatesUsers(context);
+    createPermTemplatesCharacteristics(context);
+    createPermissionTemplates(context);
+    createPlugins(context);
+    createProjectAlmBindings(context);
+    createProjectBranches(context);
+    createProjectLinks(context);
+    createProjectMappings(context);
+    createProjectMeasures(context);
+    createProjectQprofiles(context);
+    createProjects(context);
+    createProperties(context);
+    createQProfileChanges(context);
+    createQProfileEditGroups(context);
+    createQProfileEditUsers(context);
+    createQualityGateConditions(context);
+    createQualityGates(context);
+    createRulesRepository(context);
+    createRules(context);
+    createRulesMetadata(context);
+    createRulesParameters(context);
+    createRulesProfiles(context);
+    createSnapshots(context);
+    createUserProperties(context);
+    createUserRoles(context);
+    createUserTokens(context);
+    createUsers(context);
+    createWebhookDeliveries(context);
+    createWebhooks(context);
+  }
+
+  private void createActiveRuleParameters(Context context) {
+    String tableName = "active_rule_parameters";
+    IntegerColumnDef activeRuleIdColumnDef = newIntegerColumnDefBuilder().setColumnName("active_rule_id").setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(activeRuleIdColumnDef)
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("rules_parameter_id").setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("value").setLimit(MAX_SIZE).build())
+        .addColumn(newLenientVarcharBuilder("rules_parameter_key").setLimit(128).build())
+        .build());
+    addIndex(context, tableName, "ix_arp_on_active_rule_id", false, activeRuleIdColumnDef);
+  }
+
+  private void createActiveRules(Context context) {
+    IntegerColumnDef profileIdCol = newIntegerColumnDefBuilder().setColumnName("profile_id").setIsNullable(false).build();
+    IntegerColumnDef ruleIdCol = newIntegerColumnDefBuilder().setColumnName("rule_id").setIsNullable(false).build();
+    context.execute(
+      newTableBuilder("active_rules")
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(profileIdCol)
+        .addColumn(ruleIdCol)
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("failure_level").setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("inheritance").setLimit(10).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").build())
+        .build());
+    addIndex(context, "active_rules", "uniq_profile_rule_ids", true, profileIdCol, ruleIdCol);
+  }
+
+  private void createAlmAppInstalls(Context context) {
+    String tableName = "alm_app_installs";
+    VarcharColumnDef almIdCol = newVarcharColumnBuilder("alm_id").setIsNullable(false).setLimit(UUID_SIZE).build();
+    VarcharColumnDef ownerCol = newVarcharColumnBuilder("owner_id").setIsNullable(false).setLimit(MAX_SIZE).build();
+    VarcharColumnDef installCol = newVarcharColumnBuilder("install_id").setIsNullable(false).setLimit(MAX_SIZE).build();
+    VarcharColumnDef userExternalIdCol = newVarcharColumnBuilder("user_external_id").setLimit(255).setIsNullable(true).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+      .addColumn(almIdCol)
+      .addColumn(ownerCol)
+      .addColumn(installCol)
+      .addColumn(newBooleanColumnDefBuilder().setColumnName("is_owner_user").setIsNullable(false).build())
+      .addColumn(userExternalIdCol)
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "alm_app_installs_owner", true, almIdCol, ownerCol);
+    addIndex(context, tableName, "alm_app_installs_install", true, almIdCol, installCol);
+    addIndex(context, tableName, "alm_app_installs_external_id", false, userExternalIdCol);
+  }
+
+  private void createAnalysisProperties(Context context) {
+    String tableName = "analysis_properties";
+    VarcharColumnDef snapshotUuidColumn = newVarcharColumnBuilder("snapshot_uuid")
+      .setIsNullable(false)
+      .setLimit(UUID_SIZE)
+      .build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+        .addColumn(snapshotUuidColumn)
+        .addColumn(newVarcharColumnBuilder("kee").setIsNullable(false).setLimit(512).build())
+        .addColumn(newVarcharColumnBuilder("text_value").setIsNullable(true).setLimit(MAX_SIZE).build())
+        .addColumn(newClobColumnDefBuilder().setColumnName("clob_value").setIsNullable(true).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_empty").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "ix_snapshot_uuid", false, snapshotUuidColumn);
+  }
+
+  private void createCeActivity(Context context) {
+    String tableName = "ce_activity";
+    VarcharColumnDef uuidCol = newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
+    VarcharColumnDef mainComponentUuidCol = newVarcharColumnBuilder("main_component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
+    VarcharColumnDef componentUuidCol = newVarcharColumnBuilder("component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
+    VarcharColumnDef statusCol = newLenientVarcharBuilder("status").setLimit(15).setIsNullable(false).build();
+    BooleanColumnDef isLastCol = newBooleanColumnDefBuilder().setColumnName("is_last").setIsNullable(false).build();
+    VarcharColumnDef isLastKeyCol = newLenientVarcharBuilder("is_last_key").setLimit(55).setIsNullable(false).build();
+    BooleanColumnDef mainIsLastCol = newBooleanColumnDefBuilder().setColumnName("main_is_last").setIsNullable(false).build();
+    VarcharColumnDef mainIsLastKeyCol = newLenientVarcharBuilder("main_is_last_key").setLimit(55).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(uuidCol)
+        .addColumn(newLenientVarcharBuilder("task_type").setLimit(15).setIsNullable(false).build())
+        .addColumn(mainComponentUuidCol)
+        .addColumn(componentUuidCol)
+        .addColumn(statusCol)
+        .addColumn(mainIsLastCol)
+        .addColumn(mainIsLastKeyCol)
+        .addColumn(isLastCol)
+        .addColumn(isLastKeyCol)
+        .addColumn(newLenientVarcharBuilder("submitter_uuid").setLimit(255).setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("submitted_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("started_at").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("executed_at").setIsNullable(true).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("execution_count").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("execution_time_ms").setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("error_message").setLimit(1_000).setIsNullable(true).build())
+        .addColumn(newClobColumnDefBuilder().setColumnName("error_stacktrace").setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("error_type").setLimit(20).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("worker_uuid").setLimit(UUID_SIZE).setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "ce_activity_component", false, componentUuidCol);
+    addIndex(context, tableName, "ce_activity_islast", false, isLastCol, statusCol);
+    addIndex(context, tableName, "ce_activity_islast_key", false, isLastKeyCol);
+    addIndex(context, tableName, "ce_activity_main_component", false, mainComponentUuidCol);
+    addIndex(context, tableName, "ce_activity_main_islast", false, mainIsLastCol, statusCol);
+    addIndex(context, tableName, "ce_activity_main_islast_key", false, mainIsLastKeyCol);
+    addIndex(context, tableName, "ce_activity_uuid", true, uuidCol);
+  }
+
+  private void createCeQueue(Context context) {
+    String tableName = "ce_queue";
+    VarcharColumnDef uuidCol = newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
+    VarcharColumnDef mainComponentUuidCol = newLenientVarcharBuilder("main_component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
+    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(uuidCol)
+        .addColumn(newLenientVarcharBuilder("task_type").setLimit(15).setIsNullable(false).build())
+        .addColumn(mainComponentUuidCol)
+        .addColumn(componentUuidCol)
+        .addColumn(newLenientVarcharBuilder("status").setLimit(15).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("submitter_uuid").setLimit(255).setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("started_at").setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("worker_uuid").setLimit(UUID_SIZE).setIsNullable(true).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("execution_count").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "ce_queue_main_component", false, mainComponentUuidCol);
+    addIndex(context, tableName, "ce_queue_component", false, componentUuidCol);
+    addIndex(context, tableName, "ce_queue_uuid", true, uuidCol);
+  }
+
+  private void createCeScannerContext(Context context) {
+    context.execute(
+      newTableBuilder("ce_scanner_context")
+        .addPkColumn(newLenientVarcharBuilder("task_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addColumn(newBlobColumnDefBuilder().setColumnName("context_data").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+  }
+
+  private void createCeTaskCharacteristics(Context context) {
+    String tableName = "ce_task_characteristics";
+    VarcharColumnDef ceTaskUuidColumn = newLenientVarcharBuilder("task_uuid")
+      .setLimit(UUID_SIZE)
+      .setIsNullable(false)
+      .build();
+
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addColumn(ceTaskUuidColumn)
+        .addColumn(newLenientVarcharBuilder("kee").setLimit(512).setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("text_value").setLimit(512).setIsNullable(true).build())
+        .build());
+    addIndex(context, tableName, "ce_characteristics_" + ceTaskUuidColumn.getName(), false, ceTaskUuidColumn);
+  }
+
+  private void createCeTaskInput(Context context) {
+    context.execute(
+      newTableBuilder("ce_task_input")
+        .addPkColumn(newLenientVarcharBuilder("task_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addColumn(newBlobColumnDefBuilder().setColumnName("input_data").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+  }
+
+  private void createCeTaskMessage(Context context) {
+    String tableName = "ce_task_message";
+    VarcharColumnDef taskUuidCol = newVarcharColumnBuilder("task_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(taskUuidCol)
+      .addColumn(newVarcharColumnBuilder("message").setIsNullable(false).setLimit(MAX_SIZE).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, tableName + "_task", false, taskUuidCol);
+  }
+
+  private void createDefaultQProfiles(Context context) {
+    String tableName = "default_qprofiles";
+    VarcharColumnDef profileUuidColumn = newLenientVarcharBuilder("qprofile_uuid")
+      .setLimit(255)
+      .setIsNullable(false)
+      .build();
+
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newLenientVarcharBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addPkColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(false).build())
+        .addColumn(profileUuidColumn)
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "uniq_default_qprofiles_uuid", true, profileUuidColumn);
+  }
+
+  private void createDeprecatedRuleKeys(Context context) {
+    String tableName = "deprecated_rule_keys";
+    IntegerColumnDef ruleIdCol = newIntegerColumnDefBuilder().setColumnName("rule_id").setIsNullable(false).build();
+    VarcharColumnDef oldRepositoryKeyCol = newVarcharColumnBuilder("old_repository_key").setIsNullable(false).setLimit(255).build();
+    VarcharColumnDef oldRuleKeyCol = newVarcharColumnBuilder("old_rule_key").setIsNullable(false).setLimit(200).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(ruleIdCol)
+      .addColumn(oldRepositoryKeyCol)
+      .addColumn(oldRuleKeyCol)
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "uniq_deprecated_rule_keys", true, oldRepositoryKeyCol, oldRuleKeyCol);
+    addIndex(context, tableName, "rule_id_deprecated_rule_keys", true, ruleIdCol);
+  }
+
+  private void createDuplicationsIndex(Context context) {
+    String tableName = "duplications_index";
+    VarcharColumnDef hashCol = newLenientVarcharBuilder("hash").setLimit(50).setIsNullable(false).build();
+    VarcharColumnDef analysisUuidCol = newLenientVarcharBuilder("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(analysisUuidCol)
+        .addColumn(componentUuidCol)
+        .addColumn(hashCol)
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("index_in_file").setIsNullable(false).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("start_line").setIsNullable(false).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("end_line").setIsNullable(false).build())
+        .build());
+
+    addIndex(context, tableName, "duplications_index_hash", false, hashCol);
+    addIndex(context, tableName, "duplication_analysis_component", false, analysisUuidCol, componentUuidCol);
+  }
+
+  private void createEsQueue(Context context) {
+    String tableName = "es_queue";
+    BigIntegerColumnDef createdAtCol = newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+        .addColumn(newVarcharColumnBuilder("doc_type").setIsNullable(false).setLimit(40).build())
+        .addColumn(newVarcharColumnBuilder("doc_id").setIsNullable(false).setLimit(MAX_SIZE).build())
+        .addColumn(newVarcharColumnBuilder("doc_id_type").setIsNullable(true).setLimit(20).build())
+        .addColumn(newVarcharColumnBuilder("doc_routing").setIsNullable(true).setLimit(MAX_SIZE).build())
+        .addColumn(createdAtCol)
+        .build());
+    addIndex(context, tableName, "es_queue_created_at", false, createdAtCol);
+  }
+
+  private void createEventComponentChanges(Context context) {
+    String tableName = "event_component_changes";
+    VarcharColumnDef eventUuidCol = newVarcharColumnBuilder("event_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+    VarcharColumnDef eventComponentUuidCol = newVarcharColumnBuilder("event_component_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
+    VarcharColumnDef eventAnalysisUuidCol = newVarcharColumnBuilder("event_analysis_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
+    VarcharColumnDef changeCategoryCol = newVarcharColumnBuilder("change_category").setIsNullable(false).setLimit(12).build();
+    VarcharColumnDef componentUuidCol = newVarcharColumnBuilder("component_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(eventUuidCol)
+      .addColumn(eventComponentUuidCol)
+      .addColumn(eventAnalysisUuidCol)
+      .addColumn(changeCategoryCol)
+      .addColumn(componentUuidCol)
+      .addColumn(newVarcharColumnBuilder("component_key").setIsNullable(false).setLimit(400).build())
+      .addColumn(newVarcharColumnBuilder("component_name").setIsNullable(false).setLimit(2000).build())
+      .addColumn(newVarcharColumnBuilder("component_branch_key").setIsNullable(true).setLimit(255).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, tableName + "_unique", true, eventUuidCol, changeCategoryCol, componentUuidCol);
+    addIndex(context, tableName, "event_cpnt_changes_cpnt", false, eventComponentUuidCol);
+    addIndex(context, tableName, "event_cpnt_changes_analysis", false, eventAnalysisUuidCol);
+  }
+
+  private void createEvents(Context context) {
+    String tableName = "events";
+    VarcharColumnDef uuidCol = newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
+    VarcharColumnDef analysisUuidCol = newLenientVarcharBuilder("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    VarcharColumnDef componentUuid = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(uuidCol)
+        .addColumn(analysisUuidCol)
+        .addColumn(newLenientVarcharBuilder("name").setLimit(400).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("category").setLimit(50).build())
+        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).build())
+        .addColumn(newLenientVarcharBuilder("event_data").setLimit(MAX_SIZE).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("event_date").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(componentUuid)
+        .build());
+    addIndex(context, tableName, "events_uuid", true, uuidCol);
+    addIndex(context, tableName, "events_analysis", false, analysisUuidCol);
+    addIndex(context, tableName, "events_component_uuid", false, componentUuid);
+  }
+
+  private void createFileSources(Context context) {
+    String tableName = "file_sources";
+    VarcharColumnDef projectUuidCol = newLenientVarcharBuilder("project_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    BigIntegerColumnDef updatedAtCol = newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build();
+    VarcharColumnDef fileUuidCol = newLenientVarcharBuilder("file_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(projectUuidCol)
+        .addColumn(fileUuidCol)
+        .addColumn(newClobColumnDefBuilder().setColumnName("line_hashes").setIsNullable(true).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("line_hashes_version").setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("data_hash").setLimit(50).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("src_hash").setLimit(50).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("revision").setLimit(100).setIsNullable(true).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("line_count").setIsNullable(false).build())
+        .addColumn(newBlobColumnDefBuilder().setColumnName("binary_data").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(updatedAtCol)
+        .build());
+    addIndex(context, tableName, "file_sources_file_uuid", true, fileUuidCol);
+    addIndex(context, tableName, "file_sources_project_uuid", false, projectUuidCol);
+    addIndex(context, tableName, "file_sources_updated_at", false, updatedAtCol);
+  }
+
+  private void createGroupRoles(Context context) {
+    String tableName = "group_roles";
+    IntegerColumnDef groupIdCol = newIntegerColumnDefBuilder().setColumnName("group_id").setIsNullable(true).build();
+    IntegerColumnDef resourceIdCol = newIntegerColumnDefBuilder().setColumnName("resource_id").setIsNullable(true).build();
+    VarcharColumnDef roleCol = newLenientVarcharBuilder("role").setLimit(64).setIsNullable(false).build();
+    VarcharColumnDef organizationUuidCol = newLenientVarcharBuilder("organization_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(organizationUuidCol)
+        .addColumn(groupIdCol)
+        .addColumn(resourceIdCol)
+        .addColumn(roleCol)
+        .build());
+    addIndex(context, tableName, "uniq_group_roles", true, organizationUuidCol, groupIdCol, resourceIdCol, roleCol);
+    addIndex(context, tableName, "group_roles_resource", false, resourceIdCol);
+  }
+
+  private void createGroups(Context context) {
+    context.execute(
+      newTableBuilder("groups")
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newLenientVarcharBuilder("organization_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+        .addColumn(newLenientVarcharBuilder("name").setLimit(500).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("description").setLimit(200).setIsNullable(true).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
+        .build());
+  }
+
+  private void createGroupsUsers(Context context) {
+    String tableName = "groups_users";
+    BigIntegerColumnDef userIdCol = newBigIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(true).build();
+    BigIntegerColumnDef groupIdCol = newBigIntegerColumnDefBuilder().setColumnName("group_id").setIsNullable(true).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addColumn(userIdCol)
+        .addColumn(groupIdCol)
+        .build());
+    addIndex(context, tableName, "index_groups_users_on_user_id", false, userIdCol);
+    addIndex(context, tableName, "index_groups_users_on_group_id", false, groupIdCol);
+    addIndex(context, tableName, "groups_users_unique", true, groupIdCol, userIdCol);
+  }
+
+  private void createInternalComponentProps(Context context) {
+    String tableName = "internal_component_props";
+    VarcharColumnDef componentUuidCol = newVarcharColumnBuilder("component_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
+    VarcharColumnDef keeCol = newVarcharColumnBuilder("kee").setIsNullable(false).setLimit(512).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(componentUuidCol)
+      .addColumn(keeCol)
+      .addColumn(newVarcharColumnBuilder("value").setIsNullable(true).setLimit(MAX_SIZE).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "unique_component_uuid_kee", true, componentUuidCol, keeCol);
+  }
+
+  private void createInternalProperties(Context context) {
+    context.execute(
+      newTableBuilder("internal_properties")
+        .addPkColumn(newLenientVarcharBuilder("kee").setLimit(20).setIsNullable(false).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_empty").setIsNullable(false).build())
+        .addColumn(newVarcharColumnDefBuilder().setColumnName("text_value").setLimit(MAX_SIZE).setIgnoreOracleUnit(true).build())
+        .addColumn(newClobColumnDefBuilder().setColumnName("clob_value").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .build());
+  }
+
+  private void createIssueChanges(Context context) {
+    String tableName = "issue_changes";
+    VarcharColumnDef issueKeyCol = newLenientVarcharBuilder("issue_key").setLimit(50).setIsNullable(false).build();
+    VarcharColumnDef keeCol = newLenientVarcharBuilder("kee").setLimit(50).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(keeCol)
+        .addColumn(issueKeyCol)
+        .addColumn(newLenientVarcharBuilder("user_login").setLimit(255).build())
+        .addColumn(newLenientVarcharBuilder("change_type").setLimit(20).build())
+        .addColumn(newClobColumnDefBuilder().setColumnName("change_data").build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("issue_change_creation_date").build())
+        .build());
+    addIndex(context, tableName, "issue_changes_issue_key", false, issueKeyCol);
+    addIndex(context, tableName, "issue_changes_kee", false, keeCol);
+  }
+
+  private void createIssues(Context context) {
+    VarcharColumnDef assigneeCol = newLenientVarcharBuilder("assignee").setLimit(255).build();
+    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(50).build();
+    BigIntegerColumnDef issueCreationDateCol = newBigIntegerColumnDefBuilder().setColumnName("issue_creation_date").build();
+    VarcharColumnDef keeCol = newLenientVarcharBuilder("kee").setLimit(50).setIsNullable(false).build();
+    VarcharColumnDef projectUuidCol = newLenientVarcharBuilder("project_uuid").setLimit(50).build();
+    VarcharColumnDef resolutionCol = newLenientVarcharBuilder("resolution").setLimit(20).build();
+    IntegerColumnDef ruleIdCol = newIntegerColumnDefBuilder().setColumnName("rule_id").build();
+    BigIntegerColumnDef updatedAtCol = newBigIntegerColumnDefBuilder().setColumnName("updated_at").build();
+    context.execute(
+      newTableBuilder("issues")
+        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(keeCol)
+        .addColumn(ruleIdCol)
+        .addColumn(newLenientVarcharBuilder("severity").setLimit(10).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("manual_severity").setIsNullable(false).build())
+        // unit has been fixed in SonarQube 5.6 (see migration 1151, SONAR-7493)
+        .addColumn(newVarcharColumnBuilder("message").setLimit(MAX_SIZE).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("line").build())
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("gap").setPrecision(30).setScale(20).build())
+        .addColumn(newLenientVarcharBuilder("status").setLimit(20).build())
+        .addColumn(resolutionCol)
+        .addColumn(newLenientVarcharBuilder("checksum").setLimit(1000).build())
+        .addColumn(newLenientVarcharBuilder("reporter").setLimit(255).build())
+        .addColumn(assigneeCol)
+        .addColumn(newLenientVarcharBuilder("author_login").setLimit(255).build())
+        .addColumn(newLenientVarcharBuilder("action_plan_key").setLimit(50).build())
+        .addColumn(newLenientVarcharBuilder("issue_attributes").setLimit(MAX_SIZE).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("effort").build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").build())
+        .addColumn(updatedAtCol)
+        .addColumn(issueCreationDateCol)
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("issue_update_date").build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("issue_close_date").build())
+        .addColumn(newLenientVarcharBuilder("tags").setLimit(MAX_SIZE).build())
+        .addColumn(componentUuidCol)
+        .addColumn(projectUuidCol)
+        .addColumn(newBlobColumnDefBuilder().setColumnName("locations").build())
+        .addColumn(new TinyIntColumnDef.Builder().setColumnName("issue_type").build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("from_hotspot").setIsNullable(true).build())
+        .build());
+    addIndex(context, "issues", "issues_assignee", false, assigneeCol);
+    addIndex(context, "issues", "issues_component_uuid", false, componentUuidCol);
+    addIndex(context, "issues", "issues_creation_date", false, issueCreationDateCol);
+    addIndex(context, "issues", "issues_kee", true, keeCol);
+    addIndex(context, "issues", "issues_project_uuid", false, projectUuidCol);
+    addIndex(context, "issues", "issues_resolution", false, resolutionCol);
+    addIndex(context, "issues", "issues_rule_id", false, ruleIdCol);
+    addIndex(context, "issues", "issues_updated_at", false, updatedAtCol);
+  }
+
+  private void createLiveMeasures(Context context) {
+    String tableName = "live_measures";
+    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
+    VarcharColumnDef componentUuidCol = newVarcharColumnBuilder("component_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
+    IntegerColumnDef metricIdCol = newIntegerColumnDefBuilder().setColumnName("metric_id").setIsNullable(false).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(projectUuidCol)
+      .addColumn(componentUuidCol)
+      .addColumn(metricIdCol)
+      .addColumn(newDecimalColumnDefBuilder().setColumnName("value").setPrecision(38).setScale(20).build())
+      .addColumn(newVarcharColumnBuilder("text_value").setIsNullable(true).setLimit(MAX_SIZE).build())
+      .addColumn(newDecimalColumnDefBuilder().setColumnName("variation").setPrecision(38).setScale(20).build())
+      .addColumn(newBlobColumnDefBuilder().setColumnName("measure_data").setIsNullable(true).build())
+      .addColumn(newVarcharColumnBuilder("update_marker").setIsNullable(true).setLimit(UUID_SIZE).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "live_measures_project", false, projectUuidCol);
+    addIndex(context, tableName, "live_measures_component", true, componentUuidCol, metricIdCol);
+  }
+
+  private void createManualMeasures(Context context) {
+    String tableName = "manual_measures";
+    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("metric_id").setIsNullable(false).build())
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("value").setPrecision(38).setScale(20).build())
+        .addColumn(newLenientVarcharBuilder("text_value").setLimit(MAX_SIZE).build())
+        .addColumn(newLenientVarcharBuilder("user_uuid").setLimit(255).build())
+        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").build())
+        .addColumn(componentUuidCol)
+        .build());
+    addIndex(context, tableName, "manual_measures_component_uuid", false, componentUuidCol);
+  }
+
+  private void createMetrics(Context context) {
+    String tableName = "metrics";
+    VarcharColumnDef nameCol = newLenientVarcharBuilder("name").setLimit(64).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(nameCol)
+        .addColumn(newLenientVarcharBuilder("description").setLimit(255).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("direction").setIsNullable(false).setDefaultValue(0).build())
+        .addColumn(newLenientVarcharBuilder("domain").setLimit(64).build())
+        .addColumn(newLenientVarcharBuilder("short_name").setLimit(64).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("qualitative").setDefaultValue(false).setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("val_type").setLimit(8).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("user_managed").setDefaultValue(false).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("enabled").setDefaultValue(true).build())
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("worst_value").setPrecision(38).setScale(20).build())
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("best_value").setPrecision(38).setScale(20).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("optimized_best_value").build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("hidden").build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("delete_historical_data").build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("decimal_scale").build())
+        .build());
+    addIndex(context, tableName, "metrics_unique_name", true, nameCol);
+  }
+
+  private void createNotifications(Context context) {
+    context.execute(
+      newTableBuilder("notifications")
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newBlobColumnDefBuilder().setColumnName("data").build())
+        .build());
+  }
+
+  private void createOrgQProfiles(Context context) {
+    String tableName = "org_qprofiles";
+    int profileUuidSize = 255;
+    VarcharColumnDef organizationCol = newLenientVarcharBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
+    VarcharColumnDef rulesProfileUuidCol = newLenientVarcharBuilder("rules_profile_uuid").setLimit(profileUuidSize).setIsNullable(false).build();
+    VarcharColumnDef parentUuidCol = newLenientVarcharBuilder("parent_uuid").setLimit(profileUuidSize).setIsNullable(true).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(profileUuidSize).setIsNullable(false).build())
+        .addColumn(organizationCol)
+        .addColumn(rulesProfileUuidCol)
+        .addColumn(parentUuidCol)
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_used").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("user_updated_at").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "qprofiles_org_uuid", false, organizationCol);
+    addIndex(context, tableName, "qprofiles_rp_uuid", false, rulesProfileUuidCol);
+    addIndex(context, tableName, "org_qprofiles_parent_uuid", false, parentUuidCol);
+  }
+
+  private void createOrgQualityGates(Context context) {
+    String tableName = "org_quality_gates";
+    VarcharColumnDef organizationUuidCol = newVarcharColumnBuilder("organization_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+    VarcharColumnDef qualityGateUuidCol = newVarcharColumnBuilder("quality_gate_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(organizationUuidCol)
+      .addColumn(qualityGateUuidCol)
+      .build());
+    addIndex(context, tableName, "uniq_org_quality_gates", true, organizationUuidCol, qualityGateUuidCol);
+  }
+
+  private void createOrganizationAlmBindings(Context context) {
+    String tableName = "organization_alm_bindings";
+    VarcharColumnDef organizationUuidCol = newVarcharColumnBuilder("organization_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+    VarcharColumnDef almAppInstallUuidCol = newVarcharColumnBuilder("alm_app_install_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(organizationUuidCol)
+      .addColumn(almAppInstallUuidCol)
+      .addColumn(newVarcharColumnBuilder("alm_id").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(newVarcharColumnBuilder("url").setIsNullable(false).setLimit(2000).build())
+      .addColumn(newVarcharColumnBuilder("user_uuid").setIsNullable(false).setLimit(255).build())
+      .addColumn(newBooleanColumnDefBuilder().setColumnName("members_sync_enabled").setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "org_alm_bindings_org", true, organizationUuidCol);
+    addIndex(context, tableName, "org_alm_bindings_install", true, almAppInstallUuidCol);
+  }
+
+  private void createOrganizationMembers(Context context) {
+    String tableName = "organization_members";
+    IntegerColumnDef userIdCol = newIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addPkColumn(userIdCol)
+        .build());
+    addIndex(context, tableName, "ix_org_members_on_user_id", false, userIdCol);
+  }
+
+  private void createOrganizations(Context context) {
+    String tableName = "organizations";
+    VarcharColumnDef keeColumn = newLenientVarcharBuilder("kee").setLimit(255).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addColumn(keeColumn)
+        .addColumn(newLenientVarcharBuilder("name").setLimit(255).setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("description").setLimit(256).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("url").setLimit(256).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("avatar_url").setLimit(256).setIsNullable(true).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("guarded").setIsNullable(false).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("default_group_id").setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("default_quality_gate_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addColumn(newVarcharColumnBuilder("default_perm_template_project").setLimit(UUID_SIZE).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("default_perm_template_app").setLimit(UUID_SIZE).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("default_perm_template_port").setLimit(UUID_SIZE).setIsNullable(true).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("new_project_private").setIsNullable(false).build())
+        .addColumn(newVarcharColumnBuilder("subscription").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "organization_key", true, keeColumn);
+  }
+
+  private void createPermTemplatesGroups(Context context) {
+    context.execute(
+      newTableBuilder("perm_templates_groups")
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("group_id").build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("template_id").setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("permission_reference").setLimit(64).setIsNullable(false).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").build())
+        .build());
+  }
+
+  private void createPermTemplatesUsers(Context context) {
+    context.execute(
+      newTableBuilder("perm_templates_users")
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(false).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("template_id").setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("permission_reference").setLimit(64).setIsNullable(false).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").build())
+        .build());
+  }
+
+  private void createPermTemplatesCharacteristics(Context context) {
+    String tableName = "perm_tpl_characteristics";
+    IntegerColumnDef templateIdColumn = newIntegerColumnDefBuilder().setColumnName("template_id").setIsNullable(false).build();
+    VarcharColumnDef permissionKeyColumn = newLenientVarcharBuilder("permission_key").setLimit(64).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(templateIdColumn)
+        .addColumn(permissionKeyColumn)
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("with_project_creator").setIsNullable(false).setDefaultValue(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+
+    addIndex(context, tableName, "uniq_perm_tpl_charac", true, templateIdColumn, permissionKeyColumn);
+  }
+
+  private void createPermissionTemplates(Context context) {
+    context.execute(
+      newTableBuilder("permission_templates")
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newLenientVarcharBuilder("organization_uuid").setIsNullable(false).setLimit(40).build())
+        .addColumn(newLenientVarcharBuilder("name").setLimit(100).setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("kee").setLimit(100).setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").build())
+        .addColumn(newLenientVarcharBuilder("key_pattern").setLimit(500).build())
+        .build());
+  }
+
+  private void createPlugins(Context context) {
+    int pluginKeyMaxSize = 200;
+    String tableName = "plugins";
+    VarcharColumnDef keyColumn = newVarcharColumnBuilder("kee").setLimit(pluginKeyMaxSize).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addColumn(keyColumn)
+        .addColumn(newVarcharColumnBuilder("base_plugin_key").setLimit(pluginKeyMaxSize).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("file_hash").setLimit(200).setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "plugins_key", true, keyColumn);
+  }
+
+  private void createProjectAlmBindings(Context context) {
+    String tableName = "project_alm_bindings";
+    VarcharColumnDef almIdCol = newVarcharColumnDefBuilder().setColumnName("alm_id").setIsNullable(false).setLimit(40).build();
+    VarcharColumnDef repoIdCol = newVarcharColumnDefBuilder().setColumnName("repo_id").setIsNullable(false).setLimit(256).build();
+    VarcharColumnDef projectUuidCol = newVarcharColumnDefBuilder().setColumnName("project_uuid").setIsNullable(false).setLimit(40).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+      .addColumn(almIdCol)
+      .addColumn(repoIdCol)
+      .addColumn(projectUuidCol)
+      .addColumn(newVarcharColumnBuilder("github_slug").setIsNullable(true).setLimit(256).build())
+      .addColumn(newVarcharColumnBuilder("url").setIsNullable(false).setLimit(2000).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, tableName + "_alm_repo", true, almIdCol, repoIdCol);
+    addIndex(context, tableName, tableName + "_project", true, projectUuidCol);
+  }
+
+  private void createProjectBranches(Context context) {
+    String tableName = "project_branches";
+    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
+    VarcharColumnDef keeCol = newVarcharColumnBuilder("kee").setIsNullable(false).setLimit(255).build();
+    VarcharColumnDef keyTypeCol = newVarcharColumnBuilder("key_type").setIsNullable(false).setLimit(12).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build())
+        .addColumn(projectUuidCol)
+        .addColumn(keeCol)
+        .addColumn(newVarcharColumnBuilder("branch_type").setIsNullable(true).setLimit(12).build())
+        .addColumn(newVarcharColumnBuilder("merge_branch_uuid").setIsNullable(true).setLimit(UUID_VARCHAR_SIZE).build())
+        .addColumn(keyTypeCol)
+        .addColumn(newBlobColumnDefBuilder().setColumnName("pull_request_binary").setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("manual_baseline_analysis_uuid").setIsNullable(true).setLimit(UUID_SIZE).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "project_branches_kee_key_type", true, projectUuidCol, keeCol, keyTypeCol);
+  }
+
+  private void createProjectLinks(Context context) {
+    String tableName = "project_links";
+    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+      .addColumn(projectUuidCol)
+      .addColumn(newVarcharColumnBuilder("link_type").setLimit(20).setIsNullable(false).build())
+      .addColumn(newVarcharColumnBuilder("name").setLimit(128).setIsNullable(true).build())
+      .addColumn(newVarcharColumnBuilder("href").setLimit(2048).setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "project_links_project", false, projectUuidCol);
+  }
+
+  private void createProjectMappings(Context context) {
+    String tableName = "project_mappings";
+    VarcharColumnDef keyTypeCol = newVarcharColumnBuilder("key_type").setIsNullable(false).setLimit(200).build();
+    VarcharColumnDef keyCol = newVarcharColumnBuilder("kee").setIsNullable(false).setLimit(MAX_SIZE).build();
+    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(keyTypeCol)
+      .addColumn(keyCol)
+      .addColumn(projectUuidCol)
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "key_type_kee", true, keyTypeCol, keyCol);
+    addIndex(context, tableName, "project_uuid", false, projectUuidCol);
+  }
+
+  private void createProjectMeasures(Context context) {
+    String tableName = "project_measures";
+    IntegerColumnDef personIdCol = newIntegerColumnDefBuilder().setColumnName("person_id").build();
+    IntegerColumnDef metricIdCol = newIntegerColumnDefBuilder().setColumnName("metric_id").setIsNullable(false).build();
+    VarcharColumnDef analysisUuidCol = newLenientVarcharBuilder("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("value").setPrecision(38).setScale(20).build())
+        .addColumn(metricIdCol)
+        .addColumn(analysisUuidCol)
+        .addColumn(componentUuidCol)
+        .addColumn(newLenientVarcharBuilder("text_value").setLimit(MAX_SIZE).build())
+        .addColumn(newLenientVarcharBuilder("alert_status").setLimit(5).build())
+        .addColumn(newLenientVarcharBuilder("alert_text").setLimit(MAX_SIZE).build())
+        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).build())
+        .addColumn(personIdCol)
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_1").setPrecision(38).setScale(20).build())
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_2").setPrecision(38).setScale(20).build())
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_3").setPrecision(38).setScale(20).build())
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_4").setPrecision(38).setScale(20).build())
+        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_5").setPrecision(38).setScale(20).build())
+        .addColumn(newBlobColumnDefBuilder().setColumnName("measure_data").build())
+        .build());
+    addIndex(context, tableName, "measures_analysis_metric", false, analysisUuidCol, metricIdCol);
+    addIndex(context, tableName, "measures_component_uuid", false, componentUuidCol);
+  }
+
+  private void createProjectQprofiles(Context context) {
+    String tableName = "project_qprofiles";
+    VarcharColumnDef projectUuid = newLenientVarcharBuilder("project_uuid").setLimit(50).setIsNullable(false).build();
+    VarcharColumnDef profileKey = newLenientVarcharBuilder("profile_key").setLimit(50).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(projectUuid)
+        .addColumn(profileKey)
+        .build());
+    addIndex(context, tableName, "uniq_project_qprofiles", true, projectUuid, profileKey);
+  }
+
+  private void createProjects(Context context) {
+    String tableName = "projects";
+    VarcharColumnDef uuidCol = newLenientVarcharBuilder("uuid").setLimit(50).setIsNullable(false).build();
+    VarcharColumnDef organizationUuidCol = newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
+    VarcharColumnDef keeCol = newLenientVarcharBuilder("kee").setLimit(400).setIsNullable(true).build();
+    VarcharColumnDef qualifierCol = newLenientVarcharBuilder("qualifier").setLimit(10).setIsNullable(true).build();
+    VarcharColumnDef rootUuidCol = newVarcharColumnBuilder("root_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    VarcharColumnDef projectUuidCol = newLenientVarcharBuilder("project_uuid").setLimit(50).setIsNullable(false).build();
+    VarcharColumnDef moduleUuidCol = newLenientVarcharBuilder("module_uuid").setLimit(50).setIsNullable(true).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(uuidCol)
+        .addColumn(organizationUuidCol)
+        .addColumn(keeCol)
+        .addColumn(newLenientVarcharBuilder("deprecated_kee").setLimit(400).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("name").setLimit(2_000).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("long_name").setLimit(2_000).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("description").setLimit(2_000).setIsNullable(true).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("enabled").setDefaultValue(true).setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("scope").setLimit(3).setIsNullable(true).build())
+        .addColumn(qualifierCol)
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("private").setIsNullable(false).build())
+        .addColumn(rootUuidCol)
+        .addColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("copy_component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("developer_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("path").setLimit(2_000).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("uuid_path").setLimit(1_500).setIsNullable(false).build())
+        .addColumn(projectUuidCol)
+        .addColumn(moduleUuidCol)
+        .addColumn(newLenientVarcharBuilder("module_uuid_path").setLimit(1_500).setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("authorization_updated_at").setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("tags").setLimit(500).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("main_branch_project_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("b_changed").setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_name").setLimit(500).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_long_name").setLimit(500).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_description").setLimit(2_000).setIsNullable(true).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("b_enabled").setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_qualifier").setLimit(10).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_language").setLimit(20).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_copy_component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_path").setLimit(2_000).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_uuid_path").setLimit(1_500).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_module_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("b_module_uuid_path").setLimit(1_500).setIsNullable(true).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
+        .build());
+    addIndex(context, tableName, "projects_organization", false, organizationUuidCol);
+    addIndex(context, tableName, "projects_kee", true, keeCol);
+    addIndex(context, tableName, "projects_module_uuid", false, moduleUuidCol);
+    addIndex(context, tableName, "projects_project_uuid", false, projectUuidCol);
+    addIndex(context, tableName, "projects_qualifier", false, qualifierCol);
+    addIndex(context, tableName, "projects_root_uuid", false, rootUuidCol);
+    // see SONAR-12341, index projects_uuid should actually be unique
+    addIndex(context, tableName, "projects_uuid", false, uuidCol);
+  }
+
+  private void createProperties(Context context) {
+    String tableName = "properties";
+    VarcharColumnDef propKey = newLenientVarcharBuilder("prop_key").setLimit(512).setIsNullable(false).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+      .addColumn(propKey)
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("resource_id").setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(true).build())
+      .addColumn(newBooleanColumnDefBuilder().setColumnName("is_empty").setIsNullable(false).build())
+      .addColumn(newLenientVarcharBuilder("text_value").setLimit(MAX_SIZE).build())
+      .addColumn(newClobColumnDefBuilder().setColumnName("clob_value").setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      // table with be renamed to properties in following migration, use final constraint name right away
+      .withPkConstraintName("pk_properties")
+      .build());
+    addIndex(context, tableName, "properties_key", false, propKey);
+  }
+
+  private void createQProfileChanges(Context context) {
+    String tableName = "qprofile_changes";
+    VarcharColumnDef rulesProfileUuidCol = newLenientVarcharBuilder("rules_profile_uuid").setLimit(255).setIsNullable(false).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newLenientVarcharBuilder("kee").setLimit(UUID_SIZE).setIsNullable(false).build())
+      .addColumn(rulesProfileUuidCol)
+      .addColumn(newLenientVarcharBuilder("change_type").setLimit(20).setIsNullable(false).build())
+      .addColumn(newLenientVarcharBuilder("user_uuid").setLimit(255).setIsNullable(true).build())
+      .addColumn(newClobColumnDefBuilder().setColumnName("change_data").setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "qp_changes_rules_profile_uuid", false, rulesProfileUuidCol);
+  }
+
+  private void createQProfileEditGroups(Context context) {
+    String tableName = "qprofile_edit_groups";
+    IntegerColumnDef groupCol = newIntegerColumnDefBuilder().setColumnName("group_id").setIsNullable(false).build();
+    VarcharColumnDef qProfileUuidCol = newVarcharColumnBuilder("qprofile_uuid").setIsNullable(false).setLimit(255).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(groupCol)
+      .addColumn(qProfileUuidCol)
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, tableName + "_qprofile", false, qProfileUuidCol);
+    addIndex(context, tableName, tableName + "_unique", true, groupCol, qProfileUuidCol);
+  }
+
+  private void createQProfileEditUsers(Context context) {
+    String tableName = "qprofile_edit_users";
+    IntegerColumnDef userIdCol = newIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(false).build();
+    VarcharColumnDef qProfileUuidCol = newVarcharColumnBuilder("qprofile_uuid").setIsNullable(false).setLimit(255).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+      .addColumn(userIdCol)
+      .addColumn(qProfileUuidCol)
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, tableName + "_qprofile", false, qProfileUuidCol);
+    addIndex(context, tableName, tableName + "_unique", true, userIdCol, qProfileUuidCol);
+  }
+
+  private void createQualityGateConditions(Context context) {
+    context.execute(
+      newTableBuilder("quality_gate_conditions")
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("qgate_id").setIsNullable(true).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("metric_id").setIsNullable(true).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("period").setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("operator").setLimit(3).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("value_error").setLimit(64).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("value_warning").setLimit(64).setIsNullable(true).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
+        .build());
+  }
+
+  private void createQualityGates(Context context) {
+    String tableName = "quality_gates";
+    VarcharColumnDef uuidCol = newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(uuidCol)
+        .addColumn(newLenientVarcharBuilder("name").setLimit(100).setIsNullable(false).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_built_in").setIsNullable(false).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
+        .build());
+    addIndex(context, tableName, "uniq_quality_gates_uuid", true, uuidCol);
+  }
+
+  private void createRulesRepository(Context context) {
+    String tableName = "rule_repositories";
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newLenientVarcharBuilder("kee").setLimit(200).setIsNullable(false).build())
+      .addColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(false).build())
+      .addColumn(newLenientVarcharBuilder("name").setLimit(4_000).setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+  }
+
+  private void createRules(Context context) {
+    VarcharColumnDef pluginRuleKeyCol = newLenientVarcharBuilder("plugin_rule_key").setLimit(200).setIsNullable(false).build();
+    VarcharColumnDef pluginNameCol = newLenientVarcharBuilder("plugin_name").setLimit(255).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder("rules")
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newLenientVarcharBuilder("name").setLimit(200).setIsNullable(true).build())
+        .addColumn(pluginRuleKeyCol)
+        .addColumn(newVarcharColumnBuilder("plugin_key").setLimit(200).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("plugin_config_key").setLimit(200).setIsNullable(true).build())
+        .addColumn(pluginNameCol)
+        .addColumn(newVarcharColumnBuilder("scope").setLimit(20).setIsNullable(false).build())
+        .addColumn(newClobColumnDefBuilder().setColumnName("description").setIsNullable(true).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("priority").setIsNullable(true).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("template_id").setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("status").setLimit(40).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("def_remediation_function").setLimit(20).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("def_remediation_gap_mult").setLimit(20).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("def_remediation_base_effort").setLimit(20).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("gap_description").setLimit(MAX_SIZE).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("system_tags").setLimit(MAX_SIZE).setIsNullable(true).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_template").setIsNullable(false).setDefaultValue(false).build())
+        .addColumn(newLenientVarcharBuilder("description_format").setLimit(20).setIsNullable(true).build())
+        .addColumn(new TinyIntColumnDef.Builder().setColumnName("rule_type").setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("security_standards").setIsNullable(true).setLimit(4_000).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_ad_hoc").setIsNullable(false).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_external").setIsNullable(false).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
+        .build());
+    addIndex(context, "rules", "rules_repo_key", true, pluginRuleKeyCol, pluginNameCol);
+  }
+
+  private void createRulesMetadata(Context context) {
+    String tableName = "rules_metadata";
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newIntegerColumnDefBuilder().setColumnName("rule_id").setIsNullable(false).build())
+      .addPkColumn(newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+      .addColumn(newClobColumnDefBuilder().setColumnName("note_data").setIsNullable(true).build())
+      .addColumn(newVarcharColumnBuilder("note_user_uuid").setLimit(255).setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("note_created_at").setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("note_updated_at").setIsNullable(true).build())
+      .addColumn(newVarcharColumnBuilder("remediation_function").setLimit(20).setIsNullable(true).build())
+      .addColumn(newVarcharColumnBuilder("remediation_gap_mult").setLimit(20).setIsNullable(true).build())
+      .addColumn(newVarcharColumnBuilder("remediation_base_effort").setLimit(20).setIsNullable(true).build())
+      .addColumn(newVarcharColumnBuilder("tags").setLimit(4_000).setIsNullable(true).build())
+      .addColumn(newVarcharColumnBuilder("ad_hoc_name").setLimit(200).setIsNullable(true).build())
+      .addColumn(newClobColumnDefBuilder().setColumnName("ad_hoc_description").setIsNullable(true).build())
+      .addColumn(newVarcharColumnBuilder("ad_hoc_severity").setLimit(10).setIsNullable(true).build())
+      .addColumn(newTinyIntColumnDefBuilder().setColumnName("ad_hoc_type").setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+      .withPkConstraintName("pk_" + tableName)
+      .build());
+  }
+
+  private void createRulesParameters(Context context) {
+    String tableName = "rules_parameters";
+    IntegerColumnDef ruleIdCol = newIntegerColumnDefBuilder().setColumnName("rule_id").setIsNullable(false).build();
+    VarcharColumnDef nameCol = newLenientVarcharBuilder("name").setLimit(128).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(ruleIdCol)
+        .addColumn(nameCol)
+        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("param_type").setLimit(512).setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("default_value").setLimit(MAX_SIZE).setIsNullable(true).build())
+        .build());
+    addIndex(context, tableName, "rules_parameters_rule_id", false, ruleIdCol);
+    addIndex(context, tableName, "rules_parameters_unique", true, ruleIdCol, nameCol);
+  }
+
+  private void createRulesProfiles(Context context) {
+    VarcharColumnDef keeCol = newLenientVarcharBuilder("kee").setLimit(255).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder("rules_profiles")
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newLenientVarcharBuilder("name").setLimit(100).setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(true).build())
+        .addColumn(keeCol)
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_built_in").setIsNullable(false).build())
+        .addColumn(newLenientVarcharBuilder("rules_updated_at").setLimit(100).setIsNullable(true).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
+        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
+        .build());
+    addIndex(context, "rules_profiles", "uniq_qprof_key", true, keeCol);
+  }
+
+  private void createSnapshots(Context context) {
+    String tableName = "snapshots";
+    VarcharColumnDef uuidCol = newLenientVarcharBuilder("uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(uuidCol)
+        .addColumn(componentUuidCol)
+        .addColumn(newLenientVarcharBuilder("status").setLimit(4).setIsNullable(false).setDefaultValue("U").build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("islast").setIsNullable(false).setDefaultValue(false).build())
+        .addColumn(newLenientVarcharBuilder("version").setLimit(500).setIsNullable(true).build())
+        .addColumn(newIntegerColumnDefBuilder().setColumnName("purge_status").setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("build_string").setLimit(100).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("revision").setLimit(100).setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("build_date").setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period1_mode").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period1_param").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period2_mode").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period2_param").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period3_mode").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period3_param").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period4_mode").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period4_param").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period5_mode").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("period5_param").setLimit(100).setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period1_date").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period2_date").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period3_date").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period4_date").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period5_date").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
+        .build());
+    addIndex(context, tableName, "analyses_uuid", true, uuidCol);
+    addIndex(context, tableName, "snapshot_component", false, componentUuidCol);
+  }
+
+  private void createUserProperties(Context context) {
+    String tableName = "user_properties";
+    VarcharColumnDef userUuidCol = newVarcharColumnBuilder("user_uuid").setLimit(255).setIsNullable(false).build();
+    VarcharColumnDef keyCol = newVarcharColumnBuilder("kee").setLimit(100).setIsNullable(false).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+      .addColumn(userUuidCol)
+      .addColumn(keyCol)
+      .addColumn(newVarcharColumnBuilder("text_value").setLimit(4_000).setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "user_properties_user_uuid_kee", true, userUuidCol, keyCol);
+  }
+
+  private void createUserRoles(Context context) {
+    String tableName = "user_roles";
+    IntegerColumnDef userIdCol = newIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(true).build();
+    IntegerColumnDef resourceIdCol = newIntegerColumnDefBuilder().setColumnName("resource_id").setIsNullable(true).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(newLenientVarcharBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+        .addColumn(userIdCol)
+        .addColumn(resourceIdCol)
+        .addColumn(newLenientVarcharBuilder("role").setLimit(64).setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "user_roles_resource", false, resourceIdCol);
+    addIndex(context, tableName, "user_roles_user", false, userIdCol);
+  }
+
+  private void createUserTokens(Context context) {
+    String tableName = "user_tokens";
+    VarcharColumnDef userUuidCol = newVarcharColumnBuilder("user_uuid").setLimit(255).setIsNullable(false).build();
+    VarcharColumnDef nameCol = newVarcharColumnBuilder("name").setLimit(100).setIsNullable(false).build();
+    VarcharColumnDef tokenHashCol = newVarcharColumnBuilder("token_hash").setLimit(255).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(userUuidCol)
+        .addColumn(nameCol)
+        .addColumn(tokenHashCol)
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_connection_date").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+        .build());
+    addIndex(context, tableName, "user_tokens_user_uuid_name", true, userUuidCol, nameCol);
+    addIndex(context, tableName, "user_tokens_token_hash", true, tokenHashCol);
+  }
+
+  private void createUsers(Context context) {
+    String tableName = "users";
+    VarcharColumnDef uuidCol = newVarcharColumnBuilder("uuid").setLimit(255).setIsNullable(false).build();
+    VarcharColumnDef loginCol = newLenientVarcharBuilder("login").setLimit(255).setIsNullable(false).build();
+    BigIntegerColumnDef updatedAtCol = newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build();
+    VarcharColumnDef externalLoginCol = newLenientVarcharBuilder("external_login").setLimit(255).setIsNullable(false).build();
+    VarcharColumnDef externalIdentityProviderCol = newLenientVarcharBuilder("external_identity_provider").setLimit(100).setIsNullable(false).build();
+    VarcharColumnDef externalIdCol = newVarcharColumnBuilder("external_id").setLimit(255).setIsNullable(false).build();
+    context.execute(
+      newTableBuilder(tableName)
+        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
+        .addColumn(uuidCol)
+        .addColumn(loginCol)
+        .addColumn(newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("name").setLimit(200).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("email").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("crypted_password").setLimit(100).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("salt").setLimit(40).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("hash_method").setLimit(10).setIsNullable(true).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("active").setDefaultValue(true).setIsNullable(true).build())
+        .addColumn(newLenientVarcharBuilder("scm_accounts").setLimit(MAX_SIZE).build())
+        .addColumn(externalLoginCol)
+        .addColumn(externalIdentityProviderCol)
+        .addColumn(externalIdCol)
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_root").setIsNullable(false).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("user_local").setIsNullable(true).build())
+        .addColumn(newBooleanColumnDefBuilder().setColumnName("onboarded").setIsNullable(false).build())
+        .addColumn(newVarcharColumnBuilder("homepage_type").setLimit(40).setIsNullable(true).build())
+        .addColumn(newVarcharColumnBuilder("homepage_parameter").setLimit(40).setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_connection_date").setIsNullable(true).build())
+        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
+        .addColumn(updatedAtCol)
+        .build());
+    addIndex(context, tableName, "users_login", true, loginCol);
+    addIndex(context, tableName, "users_updated_at", false, updatedAtCol);
+    addIndex(context, tableName, "users_uuid", true, uuidCol);
+    addIndex(context, tableName, "uniq_external_id", true, externalIdentityProviderCol, externalIdCol);
+    addIndex(context, tableName, "uniq_external_login", true, externalIdentityProviderCol, externalLoginCol);
+  }
+
+  private void createWebhookDeliveries(Context context) {
+    String tableName = "webhook_deliveries";
+    VarcharColumnDef componentUuidColumn = newLenientVarcharBuilder("component_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
+    VarcharColumnDef ceTaskUuidColumn = newLenientVarcharBuilder("ce_task_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+      .addColumn(newVarcharColumnBuilder("webhook_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+      .addColumn(componentUuidColumn)
+      .addColumn(ceTaskUuidColumn)
+      .addColumn(newVarcharColumnBuilder("analysis_uuid").setLimit(UUID_SIZE).setIsNullable(true).build())
+      .addColumn(newLenientVarcharBuilder("name").setLimit(100).setIsNullable(false).build())
+      .addColumn(newLenientVarcharBuilder("url").setLimit(2_000).setIsNullable(false).build())
+      .addColumn(newBooleanColumnDefBuilder().setColumnName("success").setIsNullable(false).build())
+      .addColumn(newIntegerColumnDefBuilder().setColumnName("http_status").setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("duration_ms").setIsNullable(false).build())
+      .addColumn(newClobColumnDefBuilder().setColumnName("payload").setIsNullable(false).build())
+      .addColumn(newClobColumnDefBuilder().setColumnName("error_stacktrace").setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .build());
+    addIndex(context, tableName, "component_uuid", false, componentUuidColumn);
+    addIndex(context, tableName, "ce_task_uuid", false, ceTaskUuidColumn);
+  }
+
+  private void createWebhooks(Context context) {
+    String tableName = "webhooks";
+    VarcharColumnDef organizationUuidCol = newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
+    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
+    context.execute(newTableBuilder(tableName)
+      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
+      .addColumn(organizationUuidCol)
+      .addColumn(projectUuidCol)
+      .addColumn(newVarcharColumnBuilder("name").setLimit(100).setIsNullable(false).build())
+      .addColumn(newVarcharColumnBuilder("url").setLimit(2_000).setIsNullable(false).build())
+      .addColumn(newVarcharColumnBuilder("secret").setLimit(200).setIsNullable(true).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
+      .build());
+    addIndex(context, tableName, "organization_webhook", false, organizationUuidCol);
+    addIndex(context, tableName, "project_webhook", false, projectUuidCol);
+  }
+
+  private static void addIndex(Context context, String table, String index, boolean unique, ColumnDef... columns) {
+    CreateIndexBuilder builder = new CreateIndexBuilder()
+      .setTable(table)
+      .setName(index)
+      .setUnique(unique);
+    for (ColumnDef column : columns) {
+      builder.addColumn(column);
+    }
+    context.execute(builder.build());
+  }
+
+  private static VarcharColumnDef.Builder newLenientVarcharBuilder(String column) {
+    return new VarcharColumnDef.Builder().setColumnName(column).setIgnoreOracleUnit(true);
+  }
+
+  private static VarcharColumnDef.Builder newVarcharColumnBuilder(String column) {
+    return newVarcharColumnDefBuilder().setColumnName(column);
+  }
+
+  private CreateTableBuilder newTableBuilder(String tableName) {
+    return new CreateTableBuilder(getDialect(), tableName);
+  }
+}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/DbVersion00.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/DbVersion00.java
new file mode 100644 (file)
index 0000000..fc1b14b
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * 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.version.v00;
+
+import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
+import org.sonar.server.platform.db.migration.version.DbVersion;
+
+public class DbVersion00 implements DbVersion {
+  @Override
+  public void addSteps(MigrationStepRegistry registry) {
+    registry
+      .add(1, "Create initial schema", CreateInitialSchema.class)
+      .add(2, "Populate initial schema", PopulateInitialSchema.class);
+  }
+}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchema.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchema.java
new file mode 100644 (file)
index 0000000..66c3ff3
--- /dev/null
@@ -0,0 +1,276 @@
+/*
+ * 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.version.v00;
+
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import org.sonar.api.SonarRuntime;
+import org.sonar.api.utils.System2;
+import org.sonar.core.util.UuidFactory;
+import org.sonar.db.Database;
+import org.sonar.server.platform.db.migration.step.DataChange;
+import org.sonar.server.platform.db.migration.step.Upsert;
+
+public class PopulateInitialSchema extends DataChange {
+
+  private static final String ADMINS_GROUP = "sonar-administrators";
+  private static final String USERS_GROUP = "sonar-users";
+  private static final String ADMIN_USER = "admin";
+  private static final List<String> ADMIN_ROLES = Arrays.asList("admin", "profileadmin", "gateadmin", "provisioning", "applicationcreator", "portfoliocreator");
+
+  private final System2 system2;
+  private final UuidFactory uuidFactory;
+  private final SonarRuntime sonarRuntime;
+
+  public PopulateInitialSchema(Database db, System2 system2, UuidFactory uuidFactory, SonarRuntime sonarRuntime) {
+    super(db);
+    this.system2 = system2;
+    this.uuidFactory = uuidFactory;
+    this.sonarRuntime = sonarRuntime;
+  }
+
+  @Override
+  public void execute(Context context) throws SQLException {
+    String organizationUuid = uuidFactory.create();
+
+    int adminUserId = insertAdminUser(context);
+    Groups groups = insertGroups(context, organizationUuid);
+    String defaultQGUuid = insertQualityGate(context);
+    insertOrganization(context, organizationUuid, groups, defaultQGUuid);
+    insertOrgQualityGate(context, organizationUuid, defaultQGUuid);
+    insertInternalProperty(context, organizationUuid);
+    insertGroupRoles(context, organizationUuid, groups);
+    insertGroupUsers(context, adminUserId, groups);
+    insertOrganizationMember(context, adminUserId, organizationUuid);
+  }
+
+  private int insertAdminUser(Context context) throws SQLException {
+    truncateTable(context, "users");
+
+    long now = system2.now();
+    context.prepareUpsert("insert into users " +
+      "(uuid, login, name, email, external_id, external_login, external_identity_provider, user_local, crypted_password, salt, hash_method, is_root, onboarded, created_at, updated_at)"
+      +
+      " values " +
+      "(?, ?, 'Administrator', null, 'admin', 'admin', 'sonarqube', ?, '$2a$12$uCkkXmhW5ThVK8mpBvnXOOJRLd64LJeHTeCkSuB3lfaR2N0AYBaSi', null, 'BCRYPT', ?, ?, ?, ?)")
+      .setString(1, uuidFactory.create())
+      .setString(2, ADMIN_USER)
+      .setBoolean(3, true)
+      .setBoolean(4, false)
+      .setBoolean(5, true)
+      .setLong(6, now)
+      .setLong(7, now)
+      .execute()
+      .commit();
+
+    return context.prepareSelect("select id from users where login=?")
+      .setString(1, ADMIN_USER)
+      .get(t -> t.getInt(1));
+  }
+
+  private void insertOrganization(Context context, String organizationUuid, Groups groups, String defaultQGUuid) throws SQLException {
+    truncateTable(context, "organizations");
+
+    long now = system2.now();
+    context.prepareUpsert("insert into organizations " +
+      "(uuid, kee, name, guarded, new_project_private, default_group_id, default_quality_gate_uuid, subscription, created_at, updated_at)" +
+      " values " +
+      "(?, 'default-organization', 'Default Organization', ?, ?, ?, ?, 'SONARQUBE', ?, ?)")
+      .setString(1, organizationUuid)
+      .setBoolean(2, true)
+      .setBoolean(3, false)
+      .setInt(4, groups.getUserGroupId())
+      .setString(5, defaultQGUuid)
+      .setLong(6, now)
+      .setLong(7, now)
+      .execute()
+      .commit();
+  }
+
+  private void insertOrgQualityGate(Context context, String organizationUuid, String defaultQGUuid) throws SQLException {
+    truncateTable(context, "org_quality_gates");
+
+    context.prepareUpsert("insert into org_quality_gates " +
+      "(uuid, organization_uuid, quality_gate_uuid)" +
+      " values " +
+      "(?, ?, ?)")
+      .setString(1, uuidFactory.create())
+      .setString(2, organizationUuid)
+      .setString(3, defaultQGUuid)
+      .execute()
+      .commit();
+  }
+
+  private void insertInternalProperty(Context context, String organizationUuid) throws SQLException {
+    truncateTable(context, "internal_properties");
+
+    long now = system2.now();
+    Upsert upsert = context.prepareUpsert("insert into internal_properties " +
+      "(kee, is_empty, text_value, created_at)" +
+      " values" +
+      " (?, ?, ?, ?)");
+    upsert
+      .setString(1, "organization.default")
+      .setBoolean(2, false)
+      .setString(3, organizationUuid)
+      .setLong(4, now)
+      .addBatch();
+    upsert
+      .setString(1, "installation.date")
+      .setBoolean(2, false)
+      .setString(3, String.valueOf(system2.now()))
+      .setLong(4, now)
+      .addBatch();
+    upsert
+      .setString(1, "installation.version")
+      .setBoolean(2, false)
+      .setString(3, sonarRuntime.getApiVersion().toString())
+      .setLong(4, now)
+      .addBatch();
+    upsert
+      .execute()
+      .commit();
+  }
+
+  private Groups insertGroups(Context context, String organizationUuid) throws SQLException {
+    truncateTable(context, "groups");
+
+    Date now = new Date(system2.now());
+    Upsert upsert = context.prepareUpsert("insert into groups (organization_uuid, name, description, created_at, updated_at) values (?, ?, ?, ?, ?)");
+    upsert
+      .setString(1, organizationUuid)
+      .setString(2, ADMINS_GROUP)
+      .setString(3, "System administrators")
+      .setDate(4, now)
+      .setDate(5, now)
+      .addBatch();
+    upsert
+      .setString(1, organizationUuid)
+      .setString(2, USERS_GROUP)
+      .setString(3, "Any new users created will automatically join this group")
+      .setDate(4, now)
+      .setDate(5, now)
+      .addBatch();
+    upsert
+      .execute()
+      .commit();
+
+    return new Groups(getGroupId(context, ADMINS_GROUP), getGroupId(context, USERS_GROUP));
+  }
+
+  private static int getGroupId(Context context, String groupName) throws SQLException {
+    return context.prepareSelect("select id from groups where name=?")
+      .setString(1, groupName)
+      .get(t -> t.getInt(1));
+  }
+
+  private String insertQualityGate(Context context) throws SQLException {
+    truncateTable(context, "quality_gates");
+
+    String uuid = uuidFactory.create();
+    Date now = new Date(system2.now());
+    context.prepareUpsert("insert into quality_gates " +
+      "(uuid, name, is_built_in, created_at, updated_at)" +
+      " values " +
+      "(?, 'Sonar way', ?, ?, ?)")
+      .setString(1, uuid)
+      .setBoolean(2, true)
+      .setDate(3, now)
+      .setDate(4, now)
+      .execute()
+      .commit();
+    return uuid;
+  }
+
+  private static final class Groups {
+    private final int adminGroupId;
+    private final int userGroupId;
+
+    private Groups(int adminGroupId, int userGroupId) {
+      this.adminGroupId = adminGroupId;
+      this.userGroupId = userGroupId;
+    }
+
+    public int getAdminGroupId() {
+      return adminGroupId;
+    }
+
+    public int getUserGroupId() {
+      return userGroupId;
+    }
+  }
+
+  private static void insertGroupRoles(Context context, String organizationUuid, Groups groups) throws SQLException {
+    truncateTable(context, "group_roles");
+
+    Upsert upsert = context.prepareUpsert("insert into group_roles (organization_uuid, group_id, role) values (?, ?, ?)");
+    for (String adminRole : ADMIN_ROLES) {
+      upsert
+        .setString(1, organizationUuid)
+        .setInt(2, groups.getAdminGroupId())
+        .setString(3, adminRole)
+        .addBatch();
+    }
+    for (String anyoneRole : Arrays.asList("scan", "provisioning")) {
+      upsert
+        .setString(1, organizationUuid)
+        .setInt(2, null)
+        .setString(3, anyoneRole)
+        .addBatch();
+    }
+    upsert
+      .execute()
+      .commit();
+  }
+
+  private static void insertGroupUsers(Context context, int adminUserId, Groups groups) throws SQLException {
+    truncateTable(context, "groups_users");
+
+    Upsert upsert = context.prepareUpsert("insert into groups_users (user_id, group_id) values (?,?)");
+    upsert
+      .setInt(1, adminUserId)
+      .setInt(2, groups.getUserGroupId())
+      .addBatch();
+    upsert
+      .setInt(1, adminUserId)
+      .setInt(2, groups.getAdminGroupId())
+      .addBatch();
+    upsert
+      .execute()
+      .commit();
+  }
+
+  private static void insertOrganizationMember(Context context, int adminUserId, String organizationUuid) throws SQLException {
+    truncateTable(context, "organization_members");
+
+    context.prepareUpsert("insert into organization_members(organization_uuid, user_id) values (?, ?)")
+      .setString(1, organizationUuid)
+      .setInt(2, adminUserId)
+      .execute()
+      .commit();
+  }
+
+  private static void truncateTable(Context context, String table) throws SQLException {
+    context.prepareUpsert("truncate table " + table).execute().commit();
+  }
+
+}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/package-info.java
new file mode 100644 (file)
index 0000000..539483a
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+@ParametersAreNonnullByDefault
+package org.sonar.server.platform.db.migration.version.v00;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/CreateInitialSchema.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/CreateInitialSchema.java
deleted file mode 100644 (file)
index b6e36d5..0000000
+++ /dev/null
@@ -1,1375 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v79;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.BigIntegerColumnDef;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.IntegerColumnDef;
-import org.sonar.server.platform.db.migration.def.TinyIntColumnDef;
-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.BigIntegerColumnDef.newBigIntegerColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.BlobColumnDef.newBlobColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.BooleanColumnDef.newBooleanColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.ClobColumnDef.newClobColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.DecimalColumnDef.newDecimalColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.IntegerColumnDef.newIntegerColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.TimestampColumnDef.newTimestampColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.TinyIntColumnDef.newTinyIntColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.MAX_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_VARCHAR_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.sql.CreateTableBuilder.ColumnFlag.AUTO_INCREMENT;
-
-public class CreateInitialSchema extends DdlChange {
-
-  public CreateInitialSchema(Database db) {
-    super(db);
-  }
-
-  @Override
-  public void execute(Context context) throws SQLException {
-    createActiveRuleParameters(context);
-    createActiveRules(context);
-    createAlmAppInstalls(context);
-    createAnalysisProperties(context);
-    createCeActivity(context);
-    createCeQueue(context);
-    createCeScannerContext(context);
-    createCeTaskCharacteristics(context);
-    createCeTaskInput(context);
-    createCeTaskMessage(context);
-    createDefaultQProfiles(context);
-    createDeprecatedRuleKeys(context);
-    createDuplicationsIndex(context);
-    createEsQueue(context);
-    createEventComponentChanges(context);
-    createEvents(context);
-    createFileSources(context);
-    createGroupRoles(context);
-    createGroups(context);
-    createGroupsUsers(context);
-    createInternalComponentProps(context);
-    createInternalProperties(context);
-    createIssueChanges(context);
-    createIssues(context);
-    createLiveMeasures(context);
-    createManualMeasures(context);
-    createMetrics(context);
-    createNotifications(context);
-    createOrgQProfiles(context);
-    createOrgQualityGates(context);
-    createOrganizationAlmBindings(context);
-    createOrganizationMembers(context);
-    createOrganizations(context);
-    createPermTemplatesGroups(context);
-    createPermTemplatesUsers(context);
-    createPermTemplatesCharacteristics(context);
-    createPermissionTemplates(context);
-    createPlugins(context);
-    createProjectAlmBindings(context);
-    createProjectBranches(context);
-    createProjectLinks(context);
-    createProjectMappings(context);
-    createProjectMeasures(context);
-    createProjectQprofiles(context);
-    createProjects(context);
-    createProperties(context);
-    createQProfileChanges(context);
-    createQProfileEditGroups(context);
-    createQProfileEditUsers(context);
-    createQualityGateConditions(context);
-    createQualityGates(context);
-    createRulesRepository(context);
-    createRules(context);
-    createRulesMetadata(context);
-    createRulesParameters(context);
-    createRulesProfiles(context);
-    createSnapshots(context);
-    createUserProperties(context);
-    createUserRoles(context);
-    createUserTokens(context);
-    createUsers(context);
-    createWebhookDeliveries(context);
-    createWebhooks(context);
-  }
-
-  private void createActiveRuleParameters(Context context) {
-    String tableName = "active_rule_parameters";
-    IntegerColumnDef activeRuleIdColumnDef = newIntegerColumnDefBuilder().setColumnName("active_rule_id").setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(activeRuleIdColumnDef)
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("rules_parameter_id").setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("value").setLimit(MAX_SIZE).build())
-        .addColumn(newLenientVarcharBuilder("rules_parameter_key").setLimit(128).build())
-        .build());
-    addIndex(context, tableName, "ix_arp_on_active_rule_id", false, activeRuleIdColumnDef);
-  }
-
-  private void createActiveRules(Context context) {
-    IntegerColumnDef profileIdCol = newIntegerColumnDefBuilder().setColumnName("profile_id").setIsNullable(false).build();
-    IntegerColumnDef ruleIdCol = newIntegerColumnDefBuilder().setColumnName("rule_id").setIsNullable(false).build();
-    context.execute(
-      newTableBuilder("active_rules")
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(profileIdCol)
-        .addColumn(ruleIdCol)
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("failure_level").setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("inheritance").setLimit(10).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").build())
-        .build());
-    addIndex(context, "active_rules", "uniq_profile_rule_ids", true, profileIdCol, ruleIdCol);
-  }
-
-  private void createAlmAppInstalls(Context context) {
-    String tableName = "alm_app_installs";
-    VarcharColumnDef almIdCol = newVarcharColumnBuilder("alm_id").setIsNullable(false).setLimit(UUID_SIZE).build();
-    VarcharColumnDef ownerCol = newVarcharColumnBuilder("owner_id").setIsNullable(false).setLimit(MAX_SIZE).build();
-    VarcharColumnDef installCol = newVarcharColumnBuilder("install_id").setIsNullable(false).setLimit(MAX_SIZE).build();
-    VarcharColumnDef userExternalIdCol = newVarcharColumnBuilder("user_external_id").setLimit(255).setIsNullable(true).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-      .addColumn(almIdCol)
-      .addColumn(ownerCol)
-      .addColumn(installCol)
-      .addColumn(newBooleanColumnDefBuilder().setColumnName("is_owner_user").setIsNullable(false).build())
-      .addColumn(userExternalIdCol)
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "alm_app_installs_owner", true, almIdCol, ownerCol);
-    addIndex(context, tableName, "alm_app_installs_install", true, almIdCol, installCol);
-    addIndex(context, tableName, "alm_app_installs_external_id", false, userExternalIdCol);
-  }
-
-  private void createAnalysisProperties(Context context) {
-    String tableName = "analysis_properties";
-    VarcharColumnDef snapshotUuidColumn = newVarcharColumnBuilder("snapshot_uuid")
-      .setIsNullable(false)
-      .setLimit(UUID_SIZE)
-      .build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-        .addColumn(snapshotUuidColumn)
-        .addColumn(newVarcharColumnBuilder("kee").setIsNullable(false).setLimit(512).build())
-        .addColumn(newVarcharColumnBuilder("text_value").setIsNullable(true).setLimit(MAX_SIZE).build())
-        .addColumn(newClobColumnDefBuilder().setColumnName("clob_value").setIsNullable(true).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_empty").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "ix_snapshot_uuid", false, snapshotUuidColumn);
-  }
-
-  private void createCeActivity(Context context) {
-    String tableName = "ce_activity";
-    VarcharColumnDef uuidCol = newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
-    VarcharColumnDef mainComponentUuidCol = newVarcharColumnBuilder("main_component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
-    VarcharColumnDef componentUuidCol = newVarcharColumnBuilder("component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
-    VarcharColumnDef statusCol = newLenientVarcharBuilder("status").setLimit(15).setIsNullable(false).build();
-    BooleanColumnDef isLastCol = newBooleanColumnDefBuilder().setColumnName("is_last").setIsNullable(false).build();
-    VarcharColumnDef isLastKeyCol = newLenientVarcharBuilder("is_last_key").setLimit(55).setIsNullable(false).build();
-    BooleanColumnDef mainIsLastCol = newBooleanColumnDefBuilder().setColumnName("main_is_last").setIsNullable(false).build();
-    VarcharColumnDef mainIsLastKeyCol = newLenientVarcharBuilder("main_is_last_key").setLimit(55).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(uuidCol)
-        .addColumn(newLenientVarcharBuilder("task_type").setLimit(15).setIsNullable(false).build())
-        .addColumn(mainComponentUuidCol)
-        .addColumn(componentUuidCol)
-        .addColumn(statusCol)
-        .addColumn(mainIsLastCol)
-        .addColumn(mainIsLastKeyCol)
-        .addColumn(isLastCol)
-        .addColumn(isLastKeyCol)
-        .addColumn(newLenientVarcharBuilder("submitter_uuid").setLimit(255).setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("submitted_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("started_at").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("executed_at").setIsNullable(true).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("execution_count").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("execution_time_ms").setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("error_message").setLimit(1_000).setIsNullable(true).build())
-        .addColumn(newClobColumnDefBuilder().setColumnName("error_stacktrace").setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("error_type").setLimit(20).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("worker_uuid").setLimit(UUID_SIZE).setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "ce_activity_component", false, componentUuidCol);
-    addIndex(context, tableName, "ce_activity_islast", false, isLastCol, statusCol);
-    addIndex(context, tableName, "ce_activity_islast_key", false, isLastKeyCol);
-    addIndex(context, tableName, "ce_activity_main_component", false, mainComponentUuidCol);
-    addIndex(context, tableName, "ce_activity_main_islast", false, mainIsLastCol, statusCol);
-    addIndex(context, tableName, "ce_activity_main_islast_key", false, mainIsLastKeyCol);
-    addIndex(context, tableName, "ce_activity_uuid", true, uuidCol);
-  }
-
-  private void createCeQueue(Context context) {
-    String tableName = "ce_queue";
-    VarcharColumnDef uuidCol = newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
-    VarcharColumnDef mainComponentUuidCol = newLenientVarcharBuilder("main_component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
-    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(uuidCol)
-        .addColumn(newLenientVarcharBuilder("task_type").setLimit(15).setIsNullable(false).build())
-        .addColumn(mainComponentUuidCol)
-        .addColumn(componentUuidCol)
-        .addColumn(newLenientVarcharBuilder("status").setLimit(15).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("submitter_uuid").setLimit(255).setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("started_at").setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("worker_uuid").setLimit(UUID_SIZE).setIsNullable(true).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("execution_count").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "ce_queue_main_component", false, mainComponentUuidCol);
-    addIndex(context, tableName, "ce_queue_component", false, componentUuidCol);
-    addIndex(context, tableName, "ce_queue_uuid", true, uuidCol);
-  }
-
-  private void createCeScannerContext(Context context) {
-    context.execute(
-      newTableBuilder("ce_scanner_context")
-        .addPkColumn(newLenientVarcharBuilder("task_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addColumn(newBlobColumnDefBuilder().setColumnName("context_data").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-  }
-
-  private void createCeTaskCharacteristics(Context context) {
-    String tableName = "ce_task_characteristics";
-    VarcharColumnDef ceTaskUuidColumn = newLenientVarcharBuilder("task_uuid")
-      .setLimit(UUID_SIZE)
-      .setIsNullable(false)
-      .build();
-
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addColumn(ceTaskUuidColumn)
-        .addColumn(newLenientVarcharBuilder("kee").setLimit(512).setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("text_value").setLimit(512).setIsNullable(true).build())
-        .build());
-    addIndex(context, tableName, "ce_characteristics_" + ceTaskUuidColumn.getName(), false, ceTaskUuidColumn);
-  }
-
-  private void createCeTaskInput(Context context) {
-    context.execute(
-      newTableBuilder("ce_task_input")
-        .addPkColumn(newLenientVarcharBuilder("task_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addColumn(newBlobColumnDefBuilder().setColumnName("input_data").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-  }
-
-  private void createCeTaskMessage(Context context) {
-    String tableName = "ce_task_message";
-    VarcharColumnDef taskUuidCol = newVarcharColumnBuilder("task_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(taskUuidCol)
-      .addColumn(newVarcharColumnBuilder("message").setIsNullable(false).setLimit(MAX_SIZE).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, tableName + "_task", false, taskUuidCol);
-  }
-
-  private void createDefaultQProfiles(Context context) {
-    String tableName = "default_qprofiles";
-    VarcharColumnDef profileUuidColumn = newLenientVarcharBuilder("qprofile_uuid")
-      .setLimit(255)
-      .setIsNullable(false)
-      .build();
-
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newLenientVarcharBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addPkColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(false).build())
-        .addColumn(profileUuidColumn)
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "uniq_default_qprofiles_uuid", true, profileUuidColumn);
-  }
-
-  private void createDeprecatedRuleKeys(Context context) {
-    String tableName = "deprecated_rule_keys";
-    IntegerColumnDef ruleIdCol = newIntegerColumnDefBuilder().setColumnName("rule_id").setIsNullable(false).build();
-    VarcharColumnDef oldRepositoryKeyCol = newVarcharColumnBuilder("old_repository_key").setIsNullable(false).setLimit(255).build();
-    VarcharColumnDef oldRuleKeyCol = newVarcharColumnBuilder("old_rule_key").setIsNullable(false).setLimit(200).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(ruleIdCol)
-      .addColumn(oldRepositoryKeyCol)
-      .addColumn(oldRuleKeyCol)
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "uniq_deprecated_rule_keys", true, oldRepositoryKeyCol, oldRuleKeyCol);
-    addIndex(context, tableName, "rule_id_deprecated_rule_keys", true, ruleIdCol);
-  }
-
-  private void createDuplicationsIndex(Context context) {
-    String tableName = "duplications_index";
-    VarcharColumnDef hashCol = newLenientVarcharBuilder("hash").setLimit(50).setIsNullable(false).build();
-    VarcharColumnDef analysisUuidCol = newLenientVarcharBuilder("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(analysisUuidCol)
-        .addColumn(componentUuidCol)
-        .addColumn(hashCol)
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("index_in_file").setIsNullable(false).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("start_line").setIsNullable(false).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("end_line").setIsNullable(false).build())
-        .build());
-
-    addIndex(context, tableName, "duplications_index_hash", false, hashCol);
-    addIndex(context, tableName, "duplication_analysis_component", false, analysisUuidCol, componentUuidCol);
-  }
-
-  private void createEsQueue(Context context) {
-    String tableName = "es_queue";
-    BigIntegerColumnDef createdAtCol = newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-        .addColumn(newVarcharColumnBuilder("doc_type").setIsNullable(false).setLimit(40).build())
-        .addColumn(newVarcharColumnBuilder("doc_id").setIsNullable(false).setLimit(MAX_SIZE).build())
-        .addColumn(newVarcharColumnBuilder("doc_id_type").setIsNullable(true).setLimit(20).build())
-        .addColumn(newVarcharColumnBuilder("doc_routing").setIsNullable(true).setLimit(MAX_SIZE).build())
-        .addColumn(createdAtCol)
-        .build());
-    addIndex(context, tableName, "es_queue_created_at", false, createdAtCol);
-  }
-
-  private void createEventComponentChanges(Context context) {
-    String tableName = "event_component_changes";
-    VarcharColumnDef eventUuidCol = newVarcharColumnBuilder("event_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
-    VarcharColumnDef eventComponentUuidCol = newVarcharColumnBuilder("event_component_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
-    VarcharColumnDef eventAnalysisUuidCol = newVarcharColumnBuilder("event_analysis_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
-    VarcharColumnDef changeCategoryCol = newVarcharColumnBuilder("change_category").setIsNullable(false).setLimit(12).build();
-    VarcharColumnDef componentUuidCol = newVarcharColumnBuilder("component_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(eventUuidCol)
-      .addColumn(eventComponentUuidCol)
-      .addColumn(eventAnalysisUuidCol)
-      .addColumn(changeCategoryCol)
-      .addColumn(componentUuidCol)
-      .addColumn(newVarcharColumnBuilder("component_key").setIsNullable(false).setLimit(400).build())
-      .addColumn(newVarcharColumnBuilder("component_name").setIsNullable(false).setLimit(2000).build())
-      .addColumn(newVarcharColumnBuilder("component_branch_key").setIsNullable(true).setLimit(255).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, tableName + "_unique", true, eventUuidCol, changeCategoryCol, componentUuidCol);
-    addIndex(context, tableName, "event_cpnt_changes_cpnt", false, eventComponentUuidCol);
-    addIndex(context, tableName, "event_cpnt_changes_analysis", false, eventAnalysisUuidCol);
-  }
-
-  private void createEvents(Context context) {
-    String tableName = "events";
-    VarcharColumnDef uuidCol = newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
-    VarcharColumnDef analysisUuidCol = newLenientVarcharBuilder("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    VarcharColumnDef componentUuid = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(uuidCol)
-        .addColumn(analysisUuidCol)
-        .addColumn(newLenientVarcharBuilder("name").setLimit(400).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("category").setLimit(50).build())
-        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).build())
-        .addColumn(newLenientVarcharBuilder("event_data").setLimit(MAX_SIZE).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("event_date").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(componentUuid)
-        .build());
-    addIndex(context, tableName, "events_uuid", true, uuidCol);
-    addIndex(context, tableName, "events_analysis", false, analysisUuidCol);
-    addIndex(context, tableName, "events_component_uuid", false, componentUuid);
-  }
-
-  private void createFileSources(Context context) {
-    String tableName = "file_sources";
-    VarcharColumnDef projectUuidCol = newLenientVarcharBuilder("project_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    BigIntegerColumnDef updatedAtCol = newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build();
-    VarcharColumnDef fileUuidCol = newLenientVarcharBuilder("file_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(projectUuidCol)
-        .addColumn(fileUuidCol)
-        .addColumn(newClobColumnDefBuilder().setColumnName("line_hashes").setIsNullable(true).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("line_hashes_version").setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("data_hash").setLimit(50).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("src_hash").setLimit(50).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("revision").setLimit(100).setIsNullable(true).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("line_count").setIsNullable(false).build())
-        .addColumn(newBlobColumnDefBuilder().setColumnName("binary_data").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(updatedAtCol)
-        .build());
-    addIndex(context, tableName, "file_sources_file_uuid", true, fileUuidCol);
-    addIndex(context, tableName, "file_sources_project_uuid", false, projectUuidCol);
-    addIndex(context, tableName, "file_sources_updated_at", false, updatedAtCol);
-  }
-
-  private void createGroupRoles(Context context) {
-    String tableName = "group_roles";
-    IntegerColumnDef groupIdCol = newIntegerColumnDefBuilder().setColumnName("group_id").setIsNullable(true).build();
-    IntegerColumnDef resourceIdCol = newIntegerColumnDefBuilder().setColumnName("resource_id").setIsNullable(true).build();
-    VarcharColumnDef roleCol = newLenientVarcharBuilder("role").setLimit(64).setIsNullable(false).build();
-    VarcharColumnDef organizationUuidCol = newLenientVarcharBuilder("organization_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(organizationUuidCol)
-        .addColumn(groupIdCol)
-        .addColumn(resourceIdCol)
-        .addColumn(roleCol)
-        .build());
-    addIndex(context, tableName, "uniq_group_roles", true, organizationUuidCol, groupIdCol, resourceIdCol, roleCol);
-    addIndex(context, tableName, "group_roles_resource", false, resourceIdCol);
-  }
-
-  private void createGroups(Context context) {
-    context.execute(
-      newTableBuilder("groups")
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newLenientVarcharBuilder("organization_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-        .addColumn(newLenientVarcharBuilder("name").setLimit(500).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("description").setLimit(200).setIsNullable(true).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
-        .build());
-  }
-
-  private void createGroupsUsers(Context context) {
-    String tableName = "groups_users";
-    BigIntegerColumnDef userIdCol = newBigIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(true).build();
-    BigIntegerColumnDef groupIdCol = newBigIntegerColumnDefBuilder().setColumnName("group_id").setIsNullable(true).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addColumn(userIdCol)
-        .addColumn(groupIdCol)
-        .build());
-    addIndex(context, tableName, "index_groups_users_on_user_id", false, userIdCol);
-    addIndex(context, tableName, "index_groups_users_on_group_id", false, groupIdCol);
-    addIndex(context, tableName, "groups_users_unique", true, groupIdCol, userIdCol);
-  }
-
-  private void createInternalComponentProps(Context context) {
-    String tableName = "internal_component_props";
-    VarcharColumnDef componentUuidCol = newVarcharColumnBuilder("component_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
-    VarcharColumnDef keeCol = newVarcharColumnBuilder("kee").setIsNullable(false).setLimit(512).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(componentUuidCol)
-      .addColumn(keeCol)
-      .addColumn(newVarcharColumnBuilder("value").setIsNullable(true).setLimit(MAX_SIZE).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "unique_component_uuid_kee", true, componentUuidCol, keeCol);
-  }
-
-  private void createInternalProperties(Context context) {
-    context.execute(
-      newTableBuilder("internal_properties")
-        .addPkColumn(newLenientVarcharBuilder("kee").setLimit(20).setIsNullable(false).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_empty").setIsNullable(false).build())
-        .addColumn(newVarcharColumnDefBuilder().setColumnName("text_value").setLimit(MAX_SIZE).setIgnoreOracleUnit(true).build())
-        .addColumn(newClobColumnDefBuilder().setColumnName("clob_value").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .build());
-  }
-
-  private void createIssueChanges(Context context) {
-    String tableName = "issue_changes";
-    VarcharColumnDef issueKeyCol = newLenientVarcharBuilder("issue_key").setLimit(50).setIsNullable(false).build();
-    VarcharColumnDef keeCol = newLenientVarcharBuilder("kee").setLimit(50).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(keeCol)
-        .addColumn(issueKeyCol)
-        .addColumn(newLenientVarcharBuilder("user_login").setLimit(255).build())
-        .addColumn(newLenientVarcharBuilder("change_type").setLimit(20).build())
-        .addColumn(newClobColumnDefBuilder().setColumnName("change_data").build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("issue_change_creation_date").build())
-        .build());
-    addIndex(context, tableName, "issue_changes_issue_key", false, issueKeyCol);
-    addIndex(context, tableName, "issue_changes_kee", false, keeCol);
-  }
-
-  private void createIssues(Context context) {
-    VarcharColumnDef assigneeCol = newLenientVarcharBuilder("assignee").setLimit(255).build();
-    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(50).build();
-    BigIntegerColumnDef issueCreationDateCol = newBigIntegerColumnDefBuilder().setColumnName("issue_creation_date").build();
-    VarcharColumnDef keeCol = newLenientVarcharBuilder("kee").setLimit(50).setIsNullable(false).build();
-    VarcharColumnDef projectUuidCol = newLenientVarcharBuilder("project_uuid").setLimit(50).build();
-    VarcharColumnDef resolutionCol = newLenientVarcharBuilder("resolution").setLimit(20).build();
-    IntegerColumnDef ruleIdCol = newIntegerColumnDefBuilder().setColumnName("rule_id").build();
-    BigIntegerColumnDef updatedAtCol = newBigIntegerColumnDefBuilder().setColumnName("updated_at").build();
-    context.execute(
-      newTableBuilder("issues")
-        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(keeCol)
-        .addColumn(ruleIdCol)
-        .addColumn(newLenientVarcharBuilder("severity").setLimit(10).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("manual_severity").setIsNullable(false).build())
-        // unit has been fixed in SonarQube 5.6 (see migration 1151, SONAR-7493)
-        .addColumn(newVarcharColumnBuilder("message").setLimit(MAX_SIZE).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("line").build())
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("gap").setPrecision(30).setScale(20).build())
-        .addColumn(newLenientVarcharBuilder("status").setLimit(20).build())
-        .addColumn(resolutionCol)
-        .addColumn(newLenientVarcharBuilder("checksum").setLimit(1000).build())
-        .addColumn(newLenientVarcharBuilder("reporter").setLimit(255).build())
-        .addColumn(assigneeCol)
-        .addColumn(newLenientVarcharBuilder("author_login").setLimit(255).build())
-        .addColumn(newLenientVarcharBuilder("action_plan_key").setLimit(50).build())
-        .addColumn(newLenientVarcharBuilder("issue_attributes").setLimit(MAX_SIZE).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("effort").build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").build())
-        .addColumn(updatedAtCol)
-        .addColumn(issueCreationDateCol)
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("issue_update_date").build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("issue_close_date").build())
-        .addColumn(newLenientVarcharBuilder("tags").setLimit(MAX_SIZE).build())
-        .addColumn(componentUuidCol)
-        .addColumn(projectUuidCol)
-        .addColumn(newBlobColumnDefBuilder().setColumnName("locations").build())
-        .addColumn(new TinyIntColumnDef.Builder().setColumnName("issue_type").build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("from_hotspot").setIsNullable(true).build())
-        .build());
-    addIndex(context, "issues", "issues_assignee", false, assigneeCol);
-    addIndex(context, "issues", "issues_component_uuid", false, componentUuidCol);
-    addIndex(context, "issues", "issues_creation_date", false, issueCreationDateCol);
-    addIndex(context, "issues", "issues_kee", true, keeCol);
-    addIndex(context, "issues", "issues_project_uuid", false, projectUuidCol);
-    addIndex(context, "issues", "issues_resolution", false, resolutionCol);
-    addIndex(context, "issues", "issues_rule_id", false, ruleIdCol);
-    addIndex(context, "issues", "issues_updated_at", false, updatedAtCol);
-  }
-
-  private void createLiveMeasures(Context context) {
-    String tableName = "live_measures";
-    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
-    VarcharColumnDef componentUuidCol = newVarcharColumnBuilder("component_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
-    IntegerColumnDef metricIdCol = newIntegerColumnDefBuilder().setColumnName("metric_id").setIsNullable(false).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(projectUuidCol)
-      .addColumn(componentUuidCol)
-      .addColumn(metricIdCol)
-      .addColumn(newDecimalColumnDefBuilder().setColumnName("value").setPrecision(38).setScale(20).build())
-      .addColumn(newVarcharColumnBuilder("text_value").setIsNullable(true).setLimit(MAX_SIZE).build())
-      .addColumn(newDecimalColumnDefBuilder().setColumnName("variation").setPrecision(38).setScale(20).build())
-      .addColumn(newBlobColumnDefBuilder().setColumnName("measure_data").setIsNullable(true).build())
-      .addColumn(newVarcharColumnBuilder("update_marker").setIsNullable(true).setLimit(UUID_SIZE).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "live_measures_project", false, projectUuidCol);
-    addIndex(context, tableName, "live_measures_component", true, componentUuidCol, metricIdCol);
-  }
-
-  private void createManualMeasures(Context context) {
-    String tableName = "manual_measures";
-    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("metric_id").setIsNullable(false).build())
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("value").setPrecision(38).setScale(20).build())
-        .addColumn(newLenientVarcharBuilder("text_value").setLimit(MAX_SIZE).build())
-        .addColumn(newLenientVarcharBuilder("user_uuid").setLimit(255).build())
-        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").build())
-        .addColumn(componentUuidCol)
-        .build());
-    addIndex(context, tableName, "manual_measures_component_uuid", false, componentUuidCol);
-  }
-
-  private void createMetrics(Context context) {
-    String tableName = "metrics";
-    VarcharColumnDef nameCol = newLenientVarcharBuilder("name").setLimit(64).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(nameCol)
-        .addColumn(newLenientVarcharBuilder("description").setLimit(255).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("direction").setIsNullable(false).setDefaultValue(0).build())
-        .addColumn(newLenientVarcharBuilder("domain").setLimit(64).build())
-        .addColumn(newLenientVarcharBuilder("short_name").setLimit(64).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("qualitative").setDefaultValue(false).setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("val_type").setLimit(8).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("user_managed").setDefaultValue(false).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("enabled").setDefaultValue(true).build())
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("worst_value").setPrecision(38).setScale(20).build())
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("best_value").setPrecision(38).setScale(20).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("optimized_best_value").build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("hidden").build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("delete_historical_data").build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("decimal_scale").build())
-        .build());
-    addIndex(context, tableName, "metrics_unique_name", true, nameCol);
-  }
-
-  private void createNotifications(Context context) {
-    context.execute(
-      newTableBuilder("notifications")
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newBlobColumnDefBuilder().setColumnName("data").build())
-        .build());
-  }
-
-  private void createOrgQProfiles(Context context) {
-    String tableName = "org_qprofiles";
-    int profileUuidSize = 255;
-    VarcharColumnDef organizationCol = newLenientVarcharBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
-    VarcharColumnDef rulesProfileUuidCol = newLenientVarcharBuilder("rules_profile_uuid").setLimit(profileUuidSize).setIsNullable(false).build();
-    VarcharColumnDef parentUuidCol = newLenientVarcharBuilder("parent_uuid").setLimit(profileUuidSize).setIsNullable(true).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(profileUuidSize).setIsNullable(false).build())
-        .addColumn(organizationCol)
-        .addColumn(rulesProfileUuidCol)
-        .addColumn(parentUuidCol)
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_used").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("user_updated_at").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "qprofiles_org_uuid", false, organizationCol);
-    addIndex(context, tableName, "qprofiles_rp_uuid", false, rulesProfileUuidCol);
-    addIndex(context, tableName, "org_qprofiles_parent_uuid", false, parentUuidCol);
-  }
-
-  private void createOrgQualityGates(Context context) {
-    String tableName = "org_quality_gates";
-    VarcharColumnDef organizationUuidCol = newVarcharColumnBuilder("organization_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
-    VarcharColumnDef qualityGateUuidCol = newVarcharColumnBuilder("quality_gate_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(organizationUuidCol)
-      .addColumn(qualityGateUuidCol)
-      .build());
-    addIndex(context, tableName, "uniq_org_quality_gates", true, organizationUuidCol, qualityGateUuidCol);
-  }
-
-  private void createOrganizationAlmBindings(Context context) {
-    String tableName = "organization_alm_bindings";
-    VarcharColumnDef organizationUuidCol = newVarcharColumnBuilder("organization_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
-    VarcharColumnDef almAppInstallUuidCol = newVarcharColumnBuilder("alm_app_install_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(organizationUuidCol)
-      .addColumn(almAppInstallUuidCol)
-      .addColumn(newVarcharColumnBuilder("alm_id").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(newVarcharColumnBuilder("url").setIsNullable(false).setLimit(2000).build())
-      .addColumn(newVarcharColumnBuilder("user_uuid").setIsNullable(false).setLimit(255).build())
-      .addColumn(newBooleanColumnDefBuilder().setColumnName("members_sync_enabled").setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "org_alm_bindings_org", true, organizationUuidCol);
-    addIndex(context, tableName, "org_alm_bindings_install", true, almAppInstallUuidCol);
-  }
-
-  private void createOrganizationMembers(Context context) {
-    String tableName = "organization_members";
-    IntegerColumnDef userIdCol = newIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addPkColumn(userIdCol)
-        .build());
-    addIndex(context, tableName, "ix_org_members_on_user_id", false, userIdCol);
-  }
-
-  private void createOrganizations(Context context) {
-    String tableName = "organizations";
-    VarcharColumnDef keeColumn = newLenientVarcharBuilder("kee").setLimit(255).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addColumn(keeColumn)
-        .addColumn(newLenientVarcharBuilder("name").setLimit(255).setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("description").setLimit(256).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("url").setLimit(256).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("avatar_url").setLimit(256).setIsNullable(true).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("guarded").setIsNullable(false).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("default_group_id").setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("default_quality_gate_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addColumn(newVarcharColumnBuilder("default_perm_template_project").setLimit(UUID_SIZE).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("default_perm_template_app").setLimit(UUID_SIZE).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("default_perm_template_port").setLimit(UUID_SIZE).setIsNullable(true).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("new_project_private").setIsNullable(false).build())
-        .addColumn(newVarcharColumnBuilder("subscription").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "organization_key", true, keeColumn);
-  }
-
-  private void createPermTemplatesGroups(Context context) {
-    context.execute(
-      newTableBuilder("perm_templates_groups")
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("group_id").build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("template_id").setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("permission_reference").setLimit(64).setIsNullable(false).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").build())
-        .build());
-  }
-
-  private void createPermTemplatesUsers(Context context) {
-    context.execute(
-      newTableBuilder("perm_templates_users")
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(false).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("template_id").setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("permission_reference").setLimit(64).setIsNullable(false).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").build())
-        .build());
-  }
-
-  private void createPermTemplatesCharacteristics(Context context) {
-    String tableName = "perm_tpl_characteristics";
-    IntegerColumnDef templateIdColumn = newIntegerColumnDefBuilder().setColumnName("template_id").setIsNullable(false).build();
-    VarcharColumnDef permissionKeyColumn = newLenientVarcharBuilder("permission_key").setLimit(64).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(templateIdColumn)
-        .addColumn(permissionKeyColumn)
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("with_project_creator").setIsNullable(false).setDefaultValue(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-
-    addIndex(context, tableName, "uniq_perm_tpl_charac", true, templateIdColumn, permissionKeyColumn);
-  }
-
-  private void createPermissionTemplates(Context context) {
-    context.execute(
-      newTableBuilder("permission_templates")
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newLenientVarcharBuilder("organization_uuid").setIsNullable(false).setLimit(40).build())
-        .addColumn(newLenientVarcharBuilder("name").setLimit(100).setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("kee").setLimit(100).setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").build())
-        .addColumn(newLenientVarcharBuilder("key_pattern").setLimit(500).build())
-        .build());
-  }
-
-  private void createPlugins(Context context) {
-    int pluginKeyMaxSize = 200;
-    String tableName = "plugins";
-    VarcharColumnDef keyColumn = newVarcharColumnBuilder("kee").setLimit(pluginKeyMaxSize).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addColumn(keyColumn)
-        .addColumn(newVarcharColumnBuilder("base_plugin_key").setLimit(pluginKeyMaxSize).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("file_hash").setLimit(200).setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "plugins_key", true, keyColumn);
-  }
-
-  private void createProjectAlmBindings(Context context) {
-    String tableName = "project_alm_bindings";
-    VarcharColumnDef almIdCol = newVarcharColumnDefBuilder().setColumnName("alm_id").setIsNullable(false).setLimit(40).build();
-    VarcharColumnDef repoIdCol = newVarcharColumnDefBuilder().setColumnName("repo_id").setIsNullable(false).setLimit(256).build();
-    VarcharColumnDef projectUuidCol = newVarcharColumnDefBuilder().setColumnName("project_uuid").setIsNullable(false).setLimit(40).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-      .addColumn(almIdCol)
-      .addColumn(repoIdCol)
-      .addColumn(projectUuidCol)
-      .addColumn(newVarcharColumnBuilder("github_slug").setIsNullable(true).setLimit(256).build())
-      .addColumn(newVarcharColumnBuilder("url").setIsNullable(false).setLimit(2000).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, tableName + "_alm_repo", true, almIdCol, repoIdCol);
-    addIndex(context, tableName, tableName + "_project", true, projectUuidCol);
-  }
-
-  private void createProjectBranches(Context context) {
-    String tableName = "project_branches";
-    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build();
-    VarcharColumnDef keeCol = newVarcharColumnBuilder("kee").setIsNullable(false).setLimit(255).build();
-    VarcharColumnDef keyTypeCol = newVarcharColumnBuilder("key_type").setIsNullable(false).setLimit(12).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_VARCHAR_SIZE).build())
-        .addColumn(projectUuidCol)
-        .addColumn(keeCol)
-        .addColumn(newVarcharColumnBuilder("branch_type").setIsNullable(true).setLimit(12).build())
-        .addColumn(newVarcharColumnBuilder("merge_branch_uuid").setIsNullable(true).setLimit(UUID_VARCHAR_SIZE).build())
-        .addColumn(keyTypeCol)
-        .addColumn(newBlobColumnDefBuilder().setColumnName("pull_request_binary").setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("manual_baseline_analysis_uuid").setIsNullable(true).setLimit(UUID_SIZE).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "project_branches_kee_key_type", true, projectUuidCol, keeCol, keyTypeCol);
-  }
-
-  private void createProjectLinks(Context context) {
-    String tableName = "project_links";
-    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-      .addColumn(projectUuidCol)
-      .addColumn(newVarcharColumnBuilder("link_type").setLimit(20).setIsNullable(false).build())
-      .addColumn(newVarcharColumnBuilder("name").setLimit(128).setIsNullable(true).build())
-      .addColumn(newVarcharColumnBuilder("href").setLimit(2048).setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "project_links_project", false, projectUuidCol);
-  }
-
-  private void createProjectMappings(Context context) {
-    String tableName = "project_mappings";
-    VarcharColumnDef keyTypeCol = newVarcharColumnBuilder("key_type").setIsNullable(false).setLimit(200).build();
-    VarcharColumnDef keyCol = newVarcharColumnBuilder("kee").setIsNullable(false).setLimit(MAX_SIZE).build();
-    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(keyTypeCol)
-      .addColumn(keyCol)
-      .addColumn(projectUuidCol)
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "key_type_kee", true, keyTypeCol, keyCol);
-    addIndex(context, tableName, "project_uuid", false, projectUuidCol);
-  }
-
-  private void createProjectMeasures(Context context) {
-    String tableName = "project_measures";
-    IntegerColumnDef personIdCol = newIntegerColumnDefBuilder().setColumnName("person_id").build();
-    IntegerColumnDef metricIdCol = newIntegerColumnDefBuilder().setColumnName("metric_id").setIsNullable(false).build();
-    VarcharColumnDef analysisUuidCol = newLenientVarcharBuilder("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newBigIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("value").setPrecision(38).setScale(20).build())
-        .addColumn(metricIdCol)
-        .addColumn(analysisUuidCol)
-        .addColumn(componentUuidCol)
-        .addColumn(newLenientVarcharBuilder("text_value").setLimit(MAX_SIZE).build())
-        .addColumn(newLenientVarcharBuilder("alert_status").setLimit(5).build())
-        .addColumn(newLenientVarcharBuilder("alert_text").setLimit(MAX_SIZE).build())
-        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).build())
-        .addColumn(personIdCol)
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_1").setPrecision(38).setScale(20).build())
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_2").setPrecision(38).setScale(20).build())
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_3").setPrecision(38).setScale(20).build())
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_4").setPrecision(38).setScale(20).build())
-        .addColumn(newDecimalColumnDefBuilder().setColumnName("variation_value_5").setPrecision(38).setScale(20).build())
-        .addColumn(newBlobColumnDefBuilder().setColumnName("measure_data").build())
-        .build());
-    addIndex(context, tableName, "measures_analysis_metric", false, analysisUuidCol, metricIdCol);
-    addIndex(context, tableName, "measures_component_uuid", false, componentUuidCol);
-  }
-
-  private void createProjectQprofiles(Context context) {
-    String tableName = "project_qprofiles";
-    VarcharColumnDef projectUuid = newLenientVarcharBuilder("project_uuid").setLimit(50).setIsNullable(false).build();
-    VarcharColumnDef profileKey = newLenientVarcharBuilder("profile_key").setLimit(50).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(projectUuid)
-        .addColumn(profileKey)
-        .build());
-    addIndex(context, tableName, "uniq_project_qprofiles", true, projectUuid, profileKey);
-  }
-
-  private void createProjects(Context context) {
-    String tableName = "projects";
-    VarcharColumnDef uuidCol = newLenientVarcharBuilder("uuid").setLimit(50).setIsNullable(false).build();
-    VarcharColumnDef organizationUuidCol = newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
-    VarcharColumnDef keeCol = newLenientVarcharBuilder("kee").setLimit(400).setIsNullable(true).build();
-    VarcharColumnDef qualifierCol = newLenientVarcharBuilder("qualifier").setLimit(10).setIsNullable(true).build();
-    VarcharColumnDef rootUuidCol = newVarcharColumnBuilder("root_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    VarcharColumnDef projectUuidCol = newLenientVarcharBuilder("project_uuid").setLimit(50).setIsNullable(false).build();
-    VarcharColumnDef moduleUuidCol = newLenientVarcharBuilder("module_uuid").setLimit(50).setIsNullable(true).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(uuidCol)
-        .addColumn(organizationUuidCol)
-        .addColumn(keeCol)
-        .addColumn(newLenientVarcharBuilder("deprecated_kee").setLimit(400).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("name").setLimit(2_000).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("long_name").setLimit(2_000).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("description").setLimit(2_000).setIsNullable(true).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("enabled").setDefaultValue(true).setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("scope").setLimit(3).setIsNullable(true).build())
-        .addColumn(qualifierCol)
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("private").setIsNullable(false).build())
-        .addColumn(rootUuidCol)
-        .addColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("copy_component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("developer_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("path").setLimit(2_000).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("uuid_path").setLimit(1_500).setIsNullable(false).build())
-        .addColumn(projectUuidCol)
-        .addColumn(moduleUuidCol)
-        .addColumn(newLenientVarcharBuilder("module_uuid_path").setLimit(1_500).setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("authorization_updated_at").setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("tags").setLimit(500).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("main_branch_project_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("b_changed").setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_name").setLimit(500).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_long_name").setLimit(500).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_description").setLimit(2_000).setIsNullable(true).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("b_enabled").setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_qualifier").setLimit(10).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_language").setLimit(20).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_copy_component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_path").setLimit(2_000).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_uuid_path").setLimit(1_500).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_module_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("b_module_uuid_path").setLimit(1_500).setIsNullable(true).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
-        .build());
-    addIndex(context, tableName, "projects_organization", false, organizationUuidCol);
-    addIndex(context, tableName, "projects_kee", true, keeCol);
-    addIndex(context, tableName, "projects_module_uuid", false, moduleUuidCol);
-    addIndex(context, tableName, "projects_project_uuid", false, projectUuidCol);
-    addIndex(context, tableName, "projects_qualifier", false, qualifierCol);
-    addIndex(context, tableName, "projects_root_uuid", false, rootUuidCol);
-    // see SONAR-12341, index projects_uuid should actually be unique
-    addIndex(context, tableName, "projects_uuid", false, uuidCol);
-  }
-
-  private void createProperties(Context context) {
-    String tableName = "properties";
-    VarcharColumnDef propKey = newLenientVarcharBuilder("prop_key").setLimit(512).setIsNullable(false).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-      .addColumn(propKey)
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("resource_id").setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(true).build())
-      .addColumn(newBooleanColumnDefBuilder().setColumnName("is_empty").setIsNullable(false).build())
-      .addColumn(newLenientVarcharBuilder("text_value").setLimit(MAX_SIZE).build())
-      .addColumn(newClobColumnDefBuilder().setColumnName("clob_value").setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      // table with be renamed to properties in following migration, use final constraint name right away
-      .withPkConstraintName("pk_properties")
-      .build());
-    addIndex(context, tableName, "properties_key", false, propKey);
-  }
-
-  private void createQProfileChanges(Context context) {
-    String tableName = "qprofile_changes";
-    VarcharColumnDef rulesProfileUuidCol = newLenientVarcharBuilder("rules_profile_uuid").setLimit(255).setIsNullable(false).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newLenientVarcharBuilder("kee").setLimit(UUID_SIZE).setIsNullable(false).build())
-      .addColumn(rulesProfileUuidCol)
-      .addColumn(newLenientVarcharBuilder("change_type").setLimit(20).setIsNullable(false).build())
-      .addColumn(newLenientVarcharBuilder("user_uuid").setLimit(255).setIsNullable(true).build())
-      .addColumn(newClobColumnDefBuilder().setColumnName("change_data").setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "qp_changes_rules_profile_uuid", false, rulesProfileUuidCol);
-  }
-
-  private void createQProfileEditGroups(Context context) {
-    String tableName = "qprofile_edit_groups";
-    IntegerColumnDef groupCol = newIntegerColumnDefBuilder().setColumnName("group_id").setIsNullable(false).build();
-    VarcharColumnDef qProfileUuidCol = newVarcharColumnBuilder("qprofile_uuid").setIsNullable(false).setLimit(255).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(groupCol)
-      .addColumn(qProfileUuidCol)
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, tableName + "_qprofile", false, qProfileUuidCol);
-    addIndex(context, tableName, tableName + "_unique", true, groupCol, qProfileUuidCol);
-  }
-
-  private void createQProfileEditUsers(Context context) {
-    String tableName = "qprofile_edit_users";
-    IntegerColumnDef userIdCol = newIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(false).build();
-    VarcharColumnDef qProfileUuidCol = newVarcharColumnBuilder("qprofile_uuid").setIsNullable(false).setLimit(255).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
-      .addColumn(userIdCol)
-      .addColumn(qProfileUuidCol)
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, tableName + "_qprofile", false, qProfileUuidCol);
-    addIndex(context, tableName, tableName + "_unique", true, userIdCol, qProfileUuidCol);
-  }
-
-  private void createQualityGateConditions(Context context) {
-    context.execute(
-      newTableBuilder("quality_gate_conditions")
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("qgate_id").setIsNullable(true).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("metric_id").setIsNullable(true).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("period").setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("operator").setLimit(3).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("value_error").setLimit(64).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("value_warning").setLimit(64).setIsNullable(true).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
-        .build());
-  }
-
-  private void createQualityGates(Context context) {
-    String tableName = "quality_gates";
-    VarcharColumnDef uuidCol = newVarcharColumnBuilder("uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(uuidCol)
-        .addColumn(newLenientVarcharBuilder("name").setLimit(100).setIsNullable(false).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_built_in").setIsNullable(false).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
-        .build());
-    addIndex(context, tableName, "uniq_quality_gates_uuid", true, uuidCol);
-  }
-
-  private void createRulesRepository(Context context) {
-    String tableName = "rule_repositories";
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newLenientVarcharBuilder("kee").setLimit(200).setIsNullable(false).build())
-      .addColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(false).build())
-      .addColumn(newLenientVarcharBuilder("name").setLimit(4_000).setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-  }
-
-  private void createRules(Context context) {
-    VarcharColumnDef pluginRuleKeyCol = newLenientVarcharBuilder("plugin_rule_key").setLimit(200).setIsNullable(false).build();
-    VarcharColumnDef pluginNameCol = newLenientVarcharBuilder("plugin_name").setLimit(255).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder("rules")
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newLenientVarcharBuilder("name").setLimit(200).setIsNullable(true).build())
-        .addColumn(pluginRuleKeyCol)
-        .addColumn(newVarcharColumnBuilder("plugin_key").setLimit(200).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("plugin_config_key").setLimit(200).setIsNullable(true).build())
-        .addColumn(pluginNameCol)
-        .addColumn(newVarcharColumnBuilder("scope").setLimit(20).setIsNullable(false).build())
-        .addColumn(newClobColumnDefBuilder().setColumnName("description").setIsNullable(true).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("priority").setIsNullable(true).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("template_id").setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("status").setLimit(40).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("def_remediation_function").setLimit(20).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("def_remediation_gap_mult").setLimit(20).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("def_remediation_base_effort").setLimit(20).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("gap_description").setLimit(MAX_SIZE).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("system_tags").setLimit(MAX_SIZE).setIsNullable(true).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_template").setIsNullable(false).setDefaultValue(false).build())
-        .addColumn(newLenientVarcharBuilder("description_format").setLimit(20).setIsNullable(true).build())
-        .addColumn(new TinyIntColumnDef.Builder().setColumnName("rule_type").setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("security_standards").setIsNullable(true).setLimit(4_000).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_ad_hoc").setIsNullable(false).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_external").setIsNullable(false).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
-        .build());
-    addIndex(context, "rules", "rules_repo_key", true, pluginRuleKeyCol, pluginNameCol);
-  }
-
-  private void createRulesMetadata(Context context) {
-    String tableName = "rules_metadata";
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newIntegerColumnDefBuilder().setColumnName("rule_id").setIsNullable(false).build())
-      .addPkColumn(newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-      .addColumn(newClobColumnDefBuilder().setColumnName("note_data").setIsNullable(true).build())
-      .addColumn(newVarcharColumnBuilder("note_user_uuid").setLimit(255).setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("note_created_at").setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("note_updated_at").setIsNullable(true).build())
-      .addColumn(newVarcharColumnBuilder("remediation_function").setLimit(20).setIsNullable(true).build())
-      .addColumn(newVarcharColumnBuilder("remediation_gap_mult").setLimit(20).setIsNullable(true).build())
-      .addColumn(newVarcharColumnBuilder("remediation_base_effort").setLimit(20).setIsNullable(true).build())
-      .addColumn(newVarcharColumnBuilder("tags").setLimit(4_000).setIsNullable(true).build())
-      .addColumn(newVarcharColumnBuilder("ad_hoc_name").setLimit(200).setIsNullable(true).build())
-      .addColumn(newClobColumnDefBuilder().setColumnName("ad_hoc_description").setIsNullable(true).build())
-      .addColumn(newVarcharColumnBuilder("ad_hoc_severity").setLimit(10).setIsNullable(true).build())
-      .addColumn(newTinyIntColumnDefBuilder().setColumnName("ad_hoc_type").setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-      .withPkConstraintName("pk_" + tableName)
-      .build());
-  }
-
-  private void createRulesParameters(Context context) {
-    String tableName = "rules_parameters";
-    IntegerColumnDef ruleIdCol = newIntegerColumnDefBuilder().setColumnName("rule_id").setIsNullable(false).build();
-    VarcharColumnDef nameCol = newLenientVarcharBuilder("name").setLimit(128).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(ruleIdCol)
-        .addColumn(nameCol)
-        .addColumn(newLenientVarcharBuilder("description").setLimit(MAX_SIZE).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("param_type").setLimit(512).setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("default_value").setLimit(MAX_SIZE).setIsNullable(true).build())
-        .build());
-    addIndex(context, tableName, "rules_parameters_rule_id", false, ruleIdCol);
-    addIndex(context, tableName, "rules_parameters_unique", true, ruleIdCol, nameCol);
-  }
-
-  private void createRulesProfiles(Context context) {
-    VarcharColumnDef keeCol = newLenientVarcharBuilder("kee").setLimit(255).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder("rules_profiles")
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newLenientVarcharBuilder("name").setLimit(100).setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("language").setLimit(20).setIsNullable(true).build())
-        .addColumn(keeCol)
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_built_in").setIsNullable(false).build())
-        .addColumn(newLenientVarcharBuilder("rules_updated_at").setLimit(100).setIsNullable(true).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
-        .addColumn(newTimestampColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
-        .build());
-    addIndex(context, "rules_profiles", "uniq_qprof_key", true, keeCol);
-  }
-
-  private void createSnapshots(Context context) {
-    String tableName = "snapshots";
-    VarcharColumnDef uuidCol = newLenientVarcharBuilder("uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    VarcharColumnDef componentUuidCol = newLenientVarcharBuilder("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(uuidCol)
-        .addColumn(componentUuidCol)
-        .addColumn(newLenientVarcharBuilder("status").setLimit(4).setIsNullable(false).setDefaultValue("U").build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("islast").setIsNullable(false).setDefaultValue(false).build())
-        .addColumn(newLenientVarcharBuilder("version").setLimit(500).setIsNullable(true).build())
-        .addColumn(newIntegerColumnDefBuilder().setColumnName("purge_status").setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("build_string").setLimit(100).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("revision").setLimit(100).setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("build_date").setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period1_mode").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period1_param").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period2_mode").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period2_param").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period3_mode").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period3_param").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period4_mode").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period4_param").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period5_mode").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("period5_param").setLimit(100).setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period1_date").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period2_date").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period3_date").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period4_date").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("period5_date").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
-        .build());
-    addIndex(context, tableName, "analyses_uuid", true, uuidCol);
-    addIndex(context, tableName, "snapshot_component", false, componentUuidCol);
-  }
-
-  private void createUserProperties(Context context) {
-    String tableName = "user_properties";
-    VarcharColumnDef userUuidCol = newVarcharColumnBuilder("user_uuid").setLimit(255).setIsNullable(false).build();
-    VarcharColumnDef keyCol = newVarcharColumnBuilder("kee").setLimit(100).setIsNullable(false).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-      .addColumn(userUuidCol)
-      .addColumn(keyCol)
-      .addColumn(newVarcharColumnBuilder("text_value").setLimit(4_000).setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "user_properties_user_uuid_kee", true, userUuidCol, keyCol);
-  }
-
-  private void createUserRoles(Context context) {
-    String tableName = "user_roles";
-    IntegerColumnDef userIdCol = newIntegerColumnDefBuilder().setColumnName("user_id").setIsNullable(true).build();
-    IntegerColumnDef resourceIdCol = newIntegerColumnDefBuilder().setColumnName("resource_id").setIsNullable(true).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(newLenientVarcharBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-        .addColumn(userIdCol)
-        .addColumn(resourceIdCol)
-        .addColumn(newLenientVarcharBuilder("role").setLimit(64).setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "user_roles_resource", false, resourceIdCol);
-    addIndex(context, tableName, "user_roles_user", false, userIdCol);
-  }
-
-  private void createUserTokens(Context context) {
-    String tableName = "user_tokens";
-    VarcharColumnDef userUuidCol = newVarcharColumnBuilder("user_uuid").setLimit(255).setIsNullable(false).build();
-    VarcharColumnDef nameCol = newVarcharColumnBuilder("name").setLimit(100).setIsNullable(false).build();
-    VarcharColumnDef tokenHashCol = newVarcharColumnBuilder("token_hash").setLimit(255).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(userUuidCol)
-        .addColumn(nameCol)
-        .addColumn(tokenHashCol)
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_connection_date").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-        .build());
-    addIndex(context, tableName, "user_tokens_user_uuid_name", true, userUuidCol, nameCol);
-    addIndex(context, tableName, "user_tokens_token_hash", true, tokenHashCol);
-  }
-
-  private void createUsers(Context context) {
-    String tableName = "users";
-    VarcharColumnDef uuidCol = newVarcharColumnBuilder("uuid").setLimit(255).setIsNullable(false).build();
-    VarcharColumnDef loginCol = newLenientVarcharBuilder("login").setLimit(255).setIsNullable(false).build();
-    BigIntegerColumnDef updatedAtCol = newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build();
-    VarcharColumnDef externalLoginCol = newLenientVarcharBuilder("external_login").setLimit(255).setIsNullable(false).build();
-    VarcharColumnDef externalIdentityProviderCol = newLenientVarcharBuilder("external_identity_provider").setLimit(100).setIsNullable(false).build();
-    VarcharColumnDef externalIdCol = newVarcharColumnBuilder("external_id").setLimit(255).setIsNullable(false).build();
-    context.execute(
-      newTableBuilder(tableName)
-        .addPkColumn(newIntegerColumnDefBuilder().setColumnName("id").setIsNullable(false).build(), AUTO_INCREMENT)
-        .addColumn(uuidCol)
-        .addColumn(loginCol)
-        .addColumn(newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("name").setLimit(200).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("email").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("crypted_password").setLimit(100).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("salt").setLimit(40).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("hash_method").setLimit(10).setIsNullable(true).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("active").setDefaultValue(true).setIsNullable(true).build())
-        .addColumn(newLenientVarcharBuilder("scm_accounts").setLimit(MAX_SIZE).build())
-        .addColumn(externalLoginCol)
-        .addColumn(externalIdentityProviderCol)
-        .addColumn(externalIdCol)
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("is_root").setIsNullable(false).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("user_local").setIsNullable(true).build())
-        .addColumn(newBooleanColumnDefBuilder().setColumnName("onboarded").setIsNullable(false).build())
-        .addColumn(newVarcharColumnBuilder("homepage_type").setLimit(40).setIsNullable(true).build())
-        .addColumn(newVarcharColumnBuilder("homepage_parameter").setLimit(40).setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_connection_date").setIsNullable(true).build())
-        .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(true).build())
-        .addColumn(updatedAtCol)
-        .build());
-    addIndex(context, tableName, "users_login", true, loginCol);
-    addIndex(context, tableName, "users_updated_at", false, updatedAtCol);
-    addIndex(context, tableName, "users_uuid", true, uuidCol);
-    addIndex(context, tableName, "uniq_external_id", true, externalIdentityProviderCol, externalIdCol);
-    addIndex(context, tableName, "uniq_external_login", true, externalIdentityProviderCol, externalLoginCol);
-  }
-
-  private void createWebhookDeliveries(Context context) {
-    String tableName = "webhook_deliveries";
-    VarcharColumnDef componentUuidColumn = newLenientVarcharBuilder("component_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
-    VarcharColumnDef ceTaskUuidColumn = newLenientVarcharBuilder("ce_task_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newLenientVarcharBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-      .addColumn(newVarcharColumnBuilder("webhook_uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-      .addColumn(componentUuidColumn)
-      .addColumn(ceTaskUuidColumn)
-      .addColumn(newVarcharColumnBuilder("analysis_uuid").setLimit(UUID_SIZE).setIsNullable(true).build())
-      .addColumn(newLenientVarcharBuilder("name").setLimit(100).setIsNullable(false).build())
-      .addColumn(newLenientVarcharBuilder("url").setLimit(2_000).setIsNullable(false).build())
-      .addColumn(newBooleanColumnDefBuilder().setColumnName("success").setIsNullable(false).build())
-      .addColumn(newIntegerColumnDefBuilder().setColumnName("http_status").setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("duration_ms").setIsNullable(false).build())
-      .addColumn(newClobColumnDefBuilder().setColumnName("payload").setIsNullable(false).build())
-      .addColumn(newClobColumnDefBuilder().setColumnName("error_stacktrace").setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .build());
-    addIndex(context, tableName, "component_uuid", false, componentUuidColumn);
-    addIndex(context, tableName, "ce_task_uuid", false, ceTaskUuidColumn);
-  }
-
-  private void createWebhooks(Context context) {
-    String tableName = "webhooks";
-    VarcharColumnDef organizationUuidCol = newVarcharColumnBuilder("organization_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
-    VarcharColumnDef projectUuidCol = newVarcharColumnBuilder("project_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
-    context.execute(newTableBuilder(tableName)
-      .addPkColumn(newVarcharColumnBuilder("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
-      .addColumn(organizationUuidCol)
-      .addColumn(projectUuidCol)
-      .addColumn(newVarcharColumnBuilder("name").setLimit(100).setIsNullable(false).build())
-      .addColumn(newVarcharColumnBuilder("url").setLimit(2_000).setIsNullable(false).build())
-      .addColumn(newVarcharColumnBuilder("secret").setLimit(200).setIsNullable(true).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
-      .addColumn(newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(true).build())
-      .build());
-    addIndex(context, tableName, "organization_webhook", false, organizationUuidCol);
-    addIndex(context, tableName, "project_webhook", false, projectUuidCol);
-  }
-
-  private static void addIndex(Context context, String table, String index, boolean unique, ColumnDef... columns) {
-    CreateIndexBuilder builder = new CreateIndexBuilder()
-      .setTable(table)
-      .setName(index)
-      .setUnique(unique);
-    for (ColumnDef column : columns) {
-      builder.addColumn(column);
-    }
-    context.execute(builder.build());
-  }
-
-  private static VarcharColumnDef.Builder newLenientVarcharBuilder(String column) {
-    return new VarcharColumnDef.Builder().setColumnName(column).setIgnoreOracleUnit(true);
-  }
-
-  private static VarcharColumnDef.Builder newVarcharColumnBuilder(String column) {
-    return newVarcharColumnDefBuilder().setColumnName(column);
-  }
-
-  private CreateTableBuilder newTableBuilder(String tableName) {
-    return new CreateTableBuilder(getDialect(), tableName);
-  }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/DbVersion79.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/DbVersion79.java
deleted file mode 100644 (file)
index 741aa24..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v79;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-public class DbVersion79 implements DbVersion {
-  @Override
-  public void addSteps(MigrationStepRegistry registry) {
-    registry
-      .add(1, "Create initial schema", CreateInitialSchema.class)
-      .add(2, "Populate initial schema", PopulateInitialSchema.class);
-  }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/PopulateInitialSchema.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/PopulateInitialSchema.java
deleted file mode 100644 (file)
index 4d18e3b..0000000
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v79;
-
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import org.sonar.api.SonarRuntime;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-public class PopulateInitialSchema extends DataChange {
-
-  private static final String ADMINS_GROUP = "sonar-administrators";
-  private static final String USERS_GROUP = "sonar-users";
-  private static final String ADMIN_USER = "admin";
-  private static final List<String> ADMIN_ROLES = Arrays.asList("admin", "profileadmin", "gateadmin", "provisioning", "applicationcreator", "portfoliocreator");
-
-  private final System2 system2;
-  private final UuidFactory uuidFactory;
-  private final SonarRuntime sonarRuntime;
-
-  public PopulateInitialSchema(Database db, System2 system2, UuidFactory uuidFactory, SonarRuntime sonarRuntime) {
-    super(db);
-    this.system2 = system2;
-    this.uuidFactory = uuidFactory;
-    this.sonarRuntime = sonarRuntime;
-  }
-
-  @Override
-  public void execute(Context context) throws SQLException {
-    String organizationUuid = uuidFactory.create();
-
-    int adminUserId = insertAdminUser(context);
-    Groups groups = insertGroups(context, organizationUuid);
-    String defaultQGUuid = insertQualityGate(context);
-    insertOrganization(context, organizationUuid, groups, defaultQGUuid);
-    insertOrgQualityGate(context, organizationUuid, defaultQGUuid);
-    insertInternalProperty(context, organizationUuid);
-    insertGroupRoles(context, organizationUuid, groups);
-    insertGroupUsers(context, adminUserId, groups);
-    insertOrganizationMember(context, adminUserId, organizationUuid);
-  }
-
-  private int insertAdminUser(Context context) throws SQLException {
-    truncateTable(context, "users");
-
-    long now = system2.now();
-    context.prepareUpsert("insert into users " +
-      "(uuid, login, name, email, external_id, external_login, external_identity_provider, user_local, crypted_password, salt, hash_method, is_root, onboarded, created_at, updated_at)"
-      +
-      " values " +
-      "(?, ?, 'Administrator', null, 'admin', 'admin', 'sonarqube', ?, '$2a$12$uCkkXmhW5ThVK8mpBvnXOOJRLd64LJeHTeCkSuB3lfaR2N0AYBaSi', null, 'BCRYPT', ?, ?, ?, ?)")
-      .setString(1, uuidFactory.create())
-      .setString(2, ADMIN_USER)
-      .setBoolean(3, true)
-      .setBoolean(4, false)
-      .setBoolean(5, true)
-      .setLong(6, now)
-      .setLong(7, now)
-      .execute()
-      .commit();
-
-    return context.prepareSelect("select id from users where login=?")
-      .setString(1, ADMIN_USER)
-      .get(t -> t.getInt(1));
-  }
-
-  private void insertOrganization(Context context, String organizationUuid, Groups groups, String defaultQGUuid) throws SQLException {
-    truncateTable(context, "organizations");
-
-    long now = system2.now();
-    context.prepareUpsert("insert into organizations " +
-      "(uuid, kee, name, guarded, new_project_private, default_group_id, default_quality_gate_uuid, subscription, created_at, updated_at)" +
-      " values " +
-      "(?, 'default-organization', 'Default Organization', ?, ?, ?, ?, 'SONARQUBE', ?, ?)")
-      .setString(1, organizationUuid)
-      .setBoolean(2, true)
-      .setBoolean(3, false)
-      .setInt(4, groups.getUserGroupId())
-      .setString(5, defaultQGUuid)
-      .setLong(6, now)
-      .setLong(7, now)
-      .execute()
-      .commit();
-  }
-
-  private void insertOrgQualityGate(Context context, String organizationUuid, String defaultQGUuid) throws SQLException {
-    truncateTable(context, "org_quality_gates");
-
-    context.prepareUpsert("insert into org_quality_gates " +
-      "(uuid, organization_uuid, quality_gate_uuid)" +
-      " values " +
-      "(?, ?, ?)")
-      .setString(1, uuidFactory.create())
-      .setString(2, organizationUuid)
-      .setString(3, defaultQGUuid)
-      .execute()
-      .commit();
-  }
-
-  private void insertInternalProperty(Context context, String organizationUuid) throws SQLException {
-    truncateTable(context, "internal_properties");
-
-    long now = system2.now();
-    Upsert upsert = context.prepareUpsert("insert into internal_properties " +
-      "(kee, is_empty, text_value, created_at)" +
-      " values" +
-      " (?, ?, ?, ?)");
-    upsert
-      .setString(1, "organization.default")
-      .setBoolean(2, false)
-      .setString(3, organizationUuid)
-      .setLong(4, now)
-      .addBatch();
-    upsert
-      .setString(1, "installation.date")
-      .setBoolean(2, false)
-      .setString(3, String.valueOf(system2.now()))
-      .setLong(4, now)
-      .addBatch();
-    upsert
-      .setString(1, "installation.version")
-      .setBoolean(2, false)
-      .setString(3, sonarRuntime.getApiVersion().toString())
-      .setLong(4, now)
-      .addBatch();
-    upsert
-      .execute()
-      .commit();
-  }
-
-  private Groups insertGroups(Context context, String organizationUuid) throws SQLException {
-    truncateTable(context, "groups");
-
-    Date now = new Date(system2.now());
-    Upsert upsert = context.prepareUpsert("insert into groups (organization_uuid, name, description, created_at, updated_at) values (?, ?, ?, ?, ?)");
-    upsert
-      .setString(1, organizationUuid)
-      .setString(2, ADMINS_GROUP)
-      .setString(3, "System administrators")
-      .setDate(4, now)
-      .setDate(5, now)
-      .addBatch();
-    upsert
-      .setString(1, organizationUuid)
-      .setString(2, USERS_GROUP)
-      .setString(3, "Any new users created will automatically join this group")
-      .setDate(4, now)
-      .setDate(5, now)
-      .addBatch();
-    upsert
-      .execute()
-      .commit();
-
-    return new Groups(getGroupId(context, ADMINS_GROUP), getGroupId(context, USERS_GROUP));
-  }
-
-  private static int getGroupId(Context context, String groupName) throws SQLException {
-    return context.prepareSelect("select id from groups where name=?")
-      .setString(1, groupName)
-      .get(t -> t.getInt(1));
-  }
-
-  private String insertQualityGate(Context context) throws SQLException {
-    truncateTable(context, "quality_gates");
-
-    String uuid = uuidFactory.create();
-    Date now = new Date(system2.now());
-    context.prepareUpsert("insert into quality_gates " +
-      "(uuid, name, is_built_in, created_at, updated_at)" +
-      " values " +
-      "(?, 'Sonar way', ?, ?, ?)")
-      .setString(1, uuid)
-      .setBoolean(2, true)
-      .setDate(3, now)
-      .setDate(4, now)
-      .execute()
-      .commit();
-    return uuid;
-  }
-
-  private static final class Groups {
-    private final int adminGroupId;
-    private final int userGroupId;
-
-    private Groups(int adminGroupId, int userGroupId) {
-      this.adminGroupId = adminGroupId;
-      this.userGroupId = userGroupId;
-    }
-
-    public int getAdminGroupId() {
-      return adminGroupId;
-    }
-
-    public int getUserGroupId() {
-      return userGroupId;
-    }
-  }
-
-  private static void insertGroupRoles(Context context, String organizationUuid, Groups groups) throws SQLException {
-    truncateTable(context, "group_roles");
-
-    Upsert upsert = context.prepareUpsert("insert into group_roles (organization_uuid, group_id, role) values (?, ?, ?)");
-    for (String adminRole : ADMIN_ROLES) {
-      upsert
-        .setString(1, organizationUuid)
-        .setInt(2, groups.getAdminGroupId())
-        .setString(3, adminRole)
-        .addBatch();
-    }
-    for (String anyoneRole : Arrays.asList("scan", "provisioning")) {
-      upsert
-        .setString(1, organizationUuid)
-        .setInt(2, null)
-        .setString(3, anyoneRole)
-        .addBatch();
-    }
-    upsert
-      .execute()
-      .commit();
-  }
-
-  private static void insertGroupUsers(Context context, int adminUserId, Groups groups) throws SQLException {
-    truncateTable(context, "groups_users");
-
-    Upsert upsert = context.prepareUpsert("insert into groups_users (user_id, group_id) values (?,?)");
-    upsert
-      .setInt(1, adminUserId)
-      .setInt(2, groups.getUserGroupId())
-      .addBatch();
-    upsert
-      .setInt(1, adminUserId)
-      .setInt(2, groups.getAdminGroupId())
-      .addBatch();
-    upsert
-      .execute()
-      .commit();
-  }
-
-  private static void insertOrganizationMember(Context context, int adminUserId, String organizationUuid) throws SQLException {
-    truncateTable(context, "organization_members");
-
-    context.prepareUpsert("insert into organization_members(organization_uuid, user_id) values (?, ?)")
-      .setString(1, organizationUuid)
-      .setInt(2, adminUserId)
-      .execute()
-      .commit();
-  }
-
-  private static void truncateTable(Context context, String table) throws SQLException {
-    context.prepareUpsert("truncate table " + table).execute().commit();
-  }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v79/package-info.java
deleted file mode 100644 (file)
index 1bcbde1..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v79;
-
-import javax.annotation.ParametersAreNonnullByDefault;
-
index dcf576234aa876a71be56bd752e771ea92ad0228..f7f1788d7e05bcb0604a8f92222a58bdb7031ed3 100644 (file)
@@ -22,14 +22,11 @@ package org.sonar.server.platform.db.migration.charset;
 import java.sql.Connection;
 import java.util.List;
 import java.util.Map;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.db.CoreDbTester;
-import org.sonar.db.dialect.H2;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assume.assumeTrue;
 
 public class SqlExecutorTest {
 
@@ -43,14 +40,6 @@ public class SqlExecutorTest {
   @Rule
   public CoreDbTester dbTester = CoreDbTester.createForSchema(SqlExecutorTest.class, "users_table.sql");
 
-  @Before
-  public void disableIfNotH2() {
-    // TODO dbTester.selectFirst() returns keys with different case
-    // depending on target db (lower-case for MySQL but upper-case for H2).
-    // It has to be fixed in order to reactive this test for all dbs.
-    assumeTrue(dbTester.database().getDialect().getId().equals(H2.ID));
-  }
-
   @Test
   public void executeSelect_executes_PreparedStatement() throws Exception {
     dbTester.executeInsert(USERS_DB_TABLE, LOGIN_DB_COLUMN, "login1", NAME_DB_COLUMN, "name one", IS_ROOT_DB_COLUMN, false);
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaTest.java
new file mode 100644 (file)
index 0000000..1f4e830
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * 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.version.v00;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import org.junit.Rule;
+import org.junit.Test;
+import org.sonar.db.CoreDbTester;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CreateInitialSchemaTest {
+
+  @Rule
+  public final CoreDbTester dbTester = CoreDbTester.createForSchema(CreateInitialSchemaTest.class, "empty.sql");
+
+  private CreateInitialSchema underTest = new CreateInitialSchema(dbTester.database());
+
+  @Test
+  public void creates_tables_on_empty_db() throws Exception {
+    underTest.execute();
+
+    List<String> tables = new ArrayList<>();
+    try (Connection connection = dbTester.openConnection();
+      ResultSet rs = connection.getMetaData().getTables(null, null, null, new String[] {"TABLE"})) {
+
+      while (rs.next()) {
+        tables.add(rs.getString("TABLE_NAME").toLowerCase(Locale.ENGLISH));
+      }
+    }
+    assertThat(tables).containsOnly(
+      "active_rules",
+      "active_rule_parameters",
+      "alm_app_installs",
+      "analysis_properties",
+      "ce_activity",
+      "ce_queue",
+      "ce_scanner_context",
+      "ce_task_characteristics",
+      "ce_task_input",
+      "ce_task_message",
+      "default_qprofiles",
+      "deprecated_rule_keys",
+      "duplications_index",
+      "es_queue",
+      "events",
+      "event_component_changes",
+      "file_sources",
+      "groups",
+      "groups_users",
+      "group_roles",
+      "internal_component_props",
+      "internal_properties",
+      "issues",
+      "issue_changes",
+      "live_measures",
+      "manual_measures",
+      "metrics",
+      "notifications",
+      "organizations",
+      "organization_alm_bindings",
+      "organization_members",
+      "org_qprofiles",
+      "org_quality_gates",
+      "permission_templates",
+      "perm_templates_groups",
+      "perm_templates_users",
+      "perm_tpl_characteristics",
+      "plugins",
+      "projects",
+      "project_alm_bindings",
+      "project_branches",
+      "project_links",
+      "project_mappings",
+      "project_measures",
+      "project_qprofiles",
+      "properties",
+      "qprofile_changes",
+      "qprofile_edit_groups",
+      "qprofile_edit_users",
+      "quality_gates",
+      "quality_gate_conditions",
+      "rules",
+      "rules_metadata",
+      "rules_parameters",
+      "rules_profiles",
+      "rule_repositories",
+      "snapshots",
+      "users",
+      "user_properties",
+      "user_roles",
+      "user_tokens",
+      "webhooks",
+      "webhook_deliveries");
+  }
+
+}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/DbVersion00Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/DbVersion00Test.java
new file mode 100644 (file)
index 0000000..15ccec9
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * 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.version.v00;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationCount;
+import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
+
+public class DbVersion00Test {
+  private DbVersion00 underTest = new DbVersion00();
+
+  @Test
+  public void verify_no_support_component() {
+    assertThat(underTest.getSupportComponents()).isEmpty();
+  }
+
+  @Test
+  public void migrationNumber_starts_at_1153() {
+    verifyMinimumMigrationNumber(underTest, 1);
+  }
+
+  @Test
+  public void verify_migration_count() {
+    verifyMigrationCount(underTest, 2);
+  }
+
+
+}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaTest.java
new file mode 100644 (file)
index 0000000..166d955
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+ * 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.version.v00;
+
+import java.sql.SQLException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.stream.Stream;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.api.SonarRuntime;
+import org.sonar.api.utils.System2;
+import org.sonar.api.utils.Version;
+import org.sonar.core.util.UuidFactory;
+import org.sonar.core.util.UuidFactoryFast;
+import org.sonar.core.util.stream.MoreCollectors;
+import org.sonar.db.CoreDbTester;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class PopulateInitialSchemaTest {
+
+  private static final long NOW = 1_500L;
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  private final Random random = new Random();
+  private final Version version = Version.create(1 + random.nextInt(10), 1 + random.nextInt(10), random.nextInt(10));
+  private UuidFactory uuidFactory = UuidFactoryFast.getInstance();
+  private System2 system2 = mock(System2.class);
+  private SonarRuntime sonarRuntime = mock(SonarRuntime.class);
+
+  @Rule
+  public CoreDbTester db = CoreDbTester.createForSchema(PopulateInitialSchemaTest.class, "v79.sql");
+
+  private PopulateInitialSchema underTest = new PopulateInitialSchema(db.database(), system2, uuidFactory, sonarRuntime);
+
+  @Before
+  public void setUp() {
+    when(sonarRuntime.getApiVersion()).thenReturn(version);
+  }
+
+  @Test
+  public void migration_inserts_users_and_groups() throws SQLException {
+    when(system2.now()).thenReturn(NOW);
+
+    underTest.execute();
+
+    verifyAdminUser();
+    long userGroupId = verifyGroup("sonar-users", "Any new users created will automatically join this group");
+    verifyGroup("sonar-administrators", "System administrators");
+    String qgUuid = verifyQualityGate();
+    String orgUuid = verifyDefaultOrganization(userGroupId, qgUuid);
+    verifyOrgQualityGate(orgUuid, qgUuid);
+    verifyInternalProperties(orgUuid);
+    verifyRolesOfAdminsGroup();
+    verifyRolesOfUsersGroup();
+    verifyRolesOfAnyone();
+    verifyMembershipOfAdminUser();
+  }
+
+  private void verifyAdminUser() {
+    Map<String, Object> cols = db.selectFirst("select " +
+      "login as \"LOGIN\", " +
+      "name as \"NAME\", " +
+      "email as \"EMAIL\", " +
+      "external_id as \"EXTERNAL_ID\", " +
+      "external_login as \"EXTERNAL_LOGIN\", " +
+      "external_identity_provider as \"EXT_IDENT_PROVIDER\", " +
+      "user_local as \"USER_LOCAL\", " +
+      "crypted_password as \"CRYPTED_PASSWORD\", " +
+      "salt as \"SALT\", " +
+      "hash_method as \"HASH_METHOD\", " +
+      "is_root as \"IS_ROOT\", " +
+      "onboarded as \"ONBOARDED\", " +
+      "created_at as \"CREATED_AT\", " +
+      "updated_at as \"UPDATED_AT\" " +
+      "from users where login='admin'");
+    assertThat(cols.get("LOGIN")).isEqualTo("admin");
+    assertThat(cols.get("NAME")).isEqualTo("Administrator");
+    assertThat(cols.get("EMAIL")).isNull();
+    assertThat(cols.get("EXTERNAL_ID")).isEqualTo("admin");
+    assertThat(cols.get("EXTERNAL_LOGIN")).isEqualTo("admin");
+    assertThat(cols.get("EXT_IDENT_PROVIDER")).isEqualTo("sonarqube");
+    assertThat(cols.get("USER_LOCAL")).isEqualTo(true);
+    assertThat(cols.get("CRYPTED_PASSWORD")).isEqualTo("$2a$12$uCkkXmhW5ThVK8mpBvnXOOJRLd64LJeHTeCkSuB3lfaR2N0AYBaSi");
+    assertThat(cols.get("SALT")).isNull();
+    assertThat(cols.get("HASH_METHOD")).isEqualTo("BCRYPT");
+    assertThat(cols.get("IS_ROOT")).isEqualTo(false);
+    assertThat(cols.get("ONBOARDED")).isEqualTo(true);
+    assertThat(cols.get("CREATED_AT")).isEqualTo(NOW);
+    assertThat(cols.get("UPDATED_AT")).isEqualTo(NOW);
+  }
+
+  private long verifyGroup(String expectedName, String expectedDescription) {
+    List<Map<String, Object>> rows = db.select("select " +
+      "id as \"ID\"," +
+      "name as \"name\", " +
+      "description as \"description\", " +
+      "created_at as \"CREATED_AT\", " +
+      "updated_at as \"UPDATED_AT\" " +
+      "from groups where name='" + expectedName + "'");
+    assertThat(rows).hasSize(1);
+
+    Map<String, Object> row = rows.get(0);
+    assertThat(row.get("name")).isEqualTo(expectedName);
+    assertThat(row.get("description")).isEqualTo(expectedDescription);
+    assertThat(((Date) row.get("CREATED_AT")).getTime()).isEqualTo(NOW);
+    assertThat(((Date) row.get("UPDATED_AT")).getTime()).isEqualTo(NOW);
+
+    return (long) row.get("ID");
+  }
+
+  private String verifyQualityGate() {
+    List<Map<String, Object>> rows = db.select("select " +
+      "uuid as \"UUID\", " +
+      "name as \"NAME\", " +
+      "is_built_in as \"BUILTIN\"," +
+      "created_at as \"CREATED_AT\", " +
+      "updated_at as \"UPDATED_AT\"" +
+      " from quality_gates");
+    assertThat(rows).hasSize(1);
+
+    Map<String, Object> row = rows.get(0);
+    assertThat(row.get("NAME")).isEqualTo("Sonar way");
+    assertThat(row.get("BUILTIN")).isEqualTo(true);
+    assertThat(((Date) row.get("CREATED_AT")).getTime()).isEqualTo(NOW);
+    assertThat(((Date) row.get("UPDATED_AT")).getTime()).isEqualTo(NOW);
+    return (String) row.get("UUID");
+  }
+
+  private String verifyDefaultOrganization(long userGroupId, String defaultQQUuid) {
+    List<Map<String, Object>> rows = db.select("select " +
+      "uuid as \"UUID\", " +
+      "kee as \"KEE\", " +
+      "name as \"NAME\", " +
+      "guarded as \"GUARDED\", " +
+      "new_project_private as \"PRIVATE\", " +
+      "default_group_id as \"GROUP_ID\", " +
+      "default_quality_gate_uuid as \"QG_UUID\", " +
+      "subscription as \"SUBSCRIPTION\", " +
+      "created_at as \"CREATED_AT\", " +
+      "updated_at as \"UPDATED_AT\"" +
+      " from organizations");
+    assertThat(rows).hasSize(1);
+
+    Map<String, Object> row = rows.get(0);
+    assertThat(row.get("KEE")).isEqualTo("default-organization");
+    assertThat(row.get("NAME")).isEqualTo("Default Organization");
+    assertThat(row.get("GUARDED")).isEqualTo(true);
+    assertThat(row.get("PRIVATE")).isEqualTo(false);
+    assertThat(row.get("GROUP_ID")).isEqualTo(userGroupId);
+    assertThat(row.get("QG_UUID")).isEqualTo(defaultQQUuid);
+    assertThat(row.get("SUBSCRIPTION")).isEqualTo("SONARQUBE");
+    assertThat(row.get("CREATED_AT")).isEqualTo(NOW);
+    assertThat(row.get("UPDATED_AT")).isEqualTo(NOW);
+    return (String) row.get("UUID");
+  }
+
+  private void verifyOrgQualityGate(String orgUuid, String qgUuid) {
+    List<Map<String, Object>> rows = db.select("select " +
+      "uuid as \"UUID\", " +
+      "organization_uuid as \"ORG\", " +
+      "quality_gate_uuid as \"QG\"" +
+      " from org_quality_gates");
+    assertThat(rows).hasSize(1);
+
+    Map<String, Object> row = rows.get(0);
+    assertThat(row.get("UUID")).isNotNull();
+    assertThat(row.get("ORG")).isEqualTo(orgUuid);
+    assertThat(row.get("QG")).isEqualTo(qgUuid);
+  }
+
+  private void verifyInternalProperties(String orgUuid) {
+    List<Map<String, Object>> rows = db.select("select " +
+      "kee as \"KEE\", " +
+      "is_empty as \"EMPTY\", " +
+      "text_value as \"VAL\"," +
+      "created_at as \"CREATED_AT\" " +
+      " from internal_properties");
+    assertThat(rows).hasSize(3);
+
+    Map<String, Map<String, Object>> rowsByKey = rows.stream().collect(MoreCollectors.uniqueIndex(t -> (String) t.get("KEE")));
+    verifyInternalProperty(rowsByKey, "organization.default", orgUuid);
+    verifyInternalProperty(rowsByKey, "installation.date", String.valueOf(system2.now()));
+    verifyInternalProperty(rowsByKey, "installation.version", version.toString());
+  }
+
+  private static void verifyInternalProperty(Map<String, Map<String, Object>> rowsByKey, String key, String val) {
+    Map<String, Object> row = rowsByKey.get(key);
+    assertThat(row.get("KEE")).isEqualTo(key);
+    assertThat(row.get("EMPTY")).isEqualTo(false);
+    assertThat(row.get("VAL")).isEqualTo(val);
+    assertThat(row.get("CREATED_AT")).isEqualTo(NOW);
+  }
+
+  private void verifyRolesOfAdminsGroup() {
+    assertThat(selectRoles("sonar-administrators")).containsOnly("admin", "profileadmin", "gateadmin", "provisioning", "applicationcreator", "portfoliocreator");
+  }
+
+  private void verifyRolesOfUsersGroup() {
+    assertThat(selectRoles("sonar-users")).isEmpty();
+  }
+
+  private void verifyRolesOfAnyone() {
+    List<Map<String, Object>> rows = db.select("select gr.role as \"role\" " +
+      "from group_roles gr where gr.group_id is null");
+    Stream<String> roles = rows.stream()
+      .map(row -> (String) row.get("role"));
+    assertThat(roles).containsOnly("provisioning", "scan");
+  }
+
+  private Stream<String> selectRoles(String groupName) {
+    List<Map<String, Object>> rows = db.select("select gr.role as \"role\" " +
+      "from group_roles gr " +
+      "inner join groups g on gr.group_id = g.id " +
+      "where g.name='" + groupName + "'");
+    return rows.stream()
+      .map(row -> (String) row.get("role"));
+  }
+
+  private void verifyMembershipOfAdminUser() {
+    List<Map<String, Object>> rows = db.select("select g.name as \"groupName\" from groups g " +
+      "inner join groups_users gu on gu.group_id = g.id " +
+      "inner join users u on gu.user_id = u.id " +
+      "where u.login='admin'");
+    List<String> groupNames = rows.stream()
+      .map(row -> (String) row.get("groupName"))
+      .collect(MoreCollectors.toArrayList());
+    assertThat(groupNames).containsOnly("sonar-administrators", "sonar-users");
+  }
+
+}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v79/CreateInitialSchemaTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v79/CreateInitialSchemaTest.java
deleted file mode 100644 (file)
index af0b1b7..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v79;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import org.junit.Rule;
-import org.junit.Test;
-import org.sonar.db.CoreDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class CreateInitialSchemaTest {
-
-  @Rule
-  public final CoreDbTester dbTester = CoreDbTester.createForSchema(CreateInitialSchemaTest.class, "empty.sql");
-
-  private CreateInitialSchema underTest = new CreateInitialSchema(dbTester.database());
-
-  @Test
-  public void creates_tables_on_empty_db() throws Exception {
-    underTest.execute();
-
-    List<String> tables = new ArrayList<>();
-    try (Connection connection = dbTester.openConnection();
-      ResultSet rs = connection.getMetaData().getTables(null, null, null, new String[] {"TABLE"})) {
-
-      while (rs.next()) {
-        tables.add(rs.getString("TABLE_NAME").toLowerCase(Locale.ENGLISH));
-      }
-    }
-    assertThat(tables).containsOnly(
-      "active_rules",
-      "active_rule_parameters",
-      "alm_app_installs",
-      "analysis_properties",
-      "ce_activity",
-      "ce_queue",
-      "ce_scanner_context",
-      "ce_task_characteristics",
-      "ce_task_input",
-      "ce_task_message",
-      "default_qprofiles",
-      "deprecated_rule_keys",
-      "duplications_index",
-      "es_queue",
-      "events",
-      "event_component_changes",
-      "file_sources",
-      "groups",
-      "groups_users",
-      "group_roles",
-      "internal_component_props",
-      "internal_properties",
-      "issues",
-      "issue_changes",
-      "live_measures",
-      "manual_measures",
-      "metrics",
-      "notifications",
-      "organizations",
-      "organization_alm_bindings",
-      "organization_members",
-      "org_qprofiles",
-      "org_quality_gates",
-      "permission_templates",
-      "perm_templates_groups",
-      "perm_templates_users",
-      "perm_tpl_characteristics",
-      "plugins",
-      "projects",
-      "project_alm_bindings",
-      "project_branches",
-      "project_links",
-      "project_mappings",
-      "project_measures",
-      "project_qprofiles",
-      "properties",
-      "qprofile_changes",
-      "qprofile_edit_groups",
-      "qprofile_edit_users",
-      "quality_gates",
-      "quality_gate_conditions",
-      "rules",
-      "rules_metadata",
-      "rules_parameters",
-      "rules_profiles",
-      "rule_repositories",
-      "snapshots",
-      "users",
-      "user_properties",
-      "user_roles",
-      "user_tokens",
-      "webhooks",
-      "webhook_deliveries");
-  }
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v79/DbVersion79Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v79/DbVersion79Test.java
deleted file mode 100644 (file)
index 51fa25d..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v79;
-
-import org.junit.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationCount;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
-
-public class DbVersion79Test {
-  private DbVersion79 underTest = new DbVersion79();
-
-  @Test
-  public void verify_no_support_component() {
-    assertThat(underTest.getSupportComponents()).isEmpty();
-  }
-
-  @Test
-  public void migrationNumber_starts_at_1153() {
-    verifyMinimumMigrationNumber(underTest, 1);
-  }
-
-  @Test
-  public void verify_migration_count() {
-    verifyMigrationCount(underTest, 2);
-  }
-
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v79/PopulateInitialSchemaTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v79/PopulateInitialSchemaTest.java
deleted file mode 100644 (file)
index 7817f52..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v79;
-
-import java.sql.SQLException;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.stream.Stream;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.sonar.api.SonarRuntime;
-import org.sonar.api.utils.System2;
-import org.sonar.api.utils.Version;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.core.util.stream.MoreCollectors;
-import org.sonar.db.CoreDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class PopulateInitialSchemaTest {
-
-  private static final long NOW = 1_500L;
-
-  @Rule
-  public ExpectedException expectedException = ExpectedException.none();
-
-  private final Random random = new Random();
-  private final Version version = Version.create(1 + random.nextInt(10), 1 + random.nextInt(10), random.nextInt(10));
-  private UuidFactory uuidFactory = UuidFactoryFast.getInstance();
-  private System2 system2 = mock(System2.class);
-  private SonarRuntime sonarRuntime = mock(SonarRuntime.class);
-
-  @Rule
-  public CoreDbTester db = CoreDbTester.createForSchema(PopulateInitialSchemaTest.class, "v79.sql");
-
-  private PopulateInitialSchema underTest = new PopulateInitialSchema(db.database(), system2, uuidFactory, sonarRuntime);
-
-  @Before
-  public void setUp() {
-    when(sonarRuntime.getApiVersion()).thenReturn(version);
-  }
-
-  @Test
-  public void migration_inserts_users_and_groups() throws SQLException {
-    when(system2.now()).thenReturn(NOW);
-
-    underTest.execute();
-
-    verifyAdminUser();
-    long userGroupId = verifyGroup("sonar-users", "Any new users created will automatically join this group");
-    verifyGroup("sonar-administrators", "System administrators");
-    String qgUuid = verifyQualityGate();
-    String orgUuid = verifyDefaultOrganization(userGroupId, qgUuid);
-    verifyOrgQualityGate(orgUuid, qgUuid);
-    verifyInternalProperties(orgUuid);
-    verifyRolesOfAdminsGroup();
-    verifyRolesOfUsersGroup();
-    verifyRolesOfAnyone();
-    verifyMembershipOfAdminUser();
-  }
-
-  private void verifyAdminUser() {
-    Map<String, Object> cols = db.selectFirst("select " +
-      "login as \"LOGIN\", " +
-      "name as \"NAME\", " +
-      "email as \"EMAIL\", " +
-      "external_id as \"EXTERNAL_ID\", " +
-      "external_login as \"EXTERNAL_LOGIN\", " +
-      "external_identity_provider as \"EXT_IDENT_PROVIDER\", " +
-      "user_local as \"USER_LOCAL\", " +
-      "crypted_password as \"CRYPTED_PASSWORD\", " +
-      "salt as \"SALT\", " +
-      "hash_method as \"HASH_METHOD\", " +
-      "is_root as \"IS_ROOT\", " +
-      "onboarded as \"ONBOARDED\", " +
-      "created_at as \"CREATED_AT\", " +
-      "updated_at as \"UPDATED_AT\" " +
-      "from users where login='admin'");
-    assertThat(cols.get("LOGIN")).isEqualTo("admin");
-    assertThat(cols.get("NAME")).isEqualTo("Administrator");
-    assertThat(cols.get("EMAIL")).isNull();
-    assertThat(cols.get("EXTERNAL_ID")).isEqualTo("admin");
-    assertThat(cols.get("EXTERNAL_LOGIN")).isEqualTo("admin");
-    assertThat(cols.get("EXT_IDENT_PROVIDER")).isEqualTo("sonarqube");
-    assertThat(cols.get("USER_LOCAL")).isEqualTo(true);
-    assertThat(cols.get("CRYPTED_PASSWORD")).isEqualTo("$2a$12$uCkkXmhW5ThVK8mpBvnXOOJRLd64LJeHTeCkSuB3lfaR2N0AYBaSi");
-    assertThat(cols.get("SALT")).isNull();
-    assertThat(cols.get("HASH_METHOD")).isEqualTo("BCRYPT");
-    assertThat(cols.get("IS_ROOT")).isEqualTo(false);
-    assertThat(cols.get("ONBOARDED")).isEqualTo(true);
-    assertThat(cols.get("CREATED_AT")).isEqualTo(NOW);
-    assertThat(cols.get("UPDATED_AT")).isEqualTo(NOW);
-  }
-
-  private long verifyGroup(String expectedName, String expectedDescription) {
-    List<Map<String, Object>> rows = db.select("select " +
-      "id as \"ID\"," +
-      "name as \"name\", " +
-      "description as \"description\", " +
-      "created_at as \"CREATED_AT\", " +
-      "updated_at as \"UPDATED_AT\" " +
-      "from groups where name='" + expectedName + "'");
-    assertThat(rows).hasSize(1);
-
-    Map<String, Object> row = rows.get(0);
-    assertThat(row.get("name")).isEqualTo(expectedName);
-    assertThat(row.get("description")).isEqualTo(expectedDescription);
-    assertThat(((Date) row.get("CREATED_AT")).getTime()).isEqualTo(NOW);
-    assertThat(((Date) row.get("UPDATED_AT")).getTime()).isEqualTo(NOW);
-
-    return (long) row.get("ID");
-  }
-
-  private String verifyQualityGate() {
-    List<Map<String, Object>> rows = db.select("select " +
-      "uuid as \"UUID\", " +
-      "name as \"NAME\", " +
-      "is_built_in as \"BUILTIN\"," +
-      "created_at as \"CREATED_AT\", " +
-      "updated_at as \"UPDATED_AT\"" +
-      " from quality_gates");
-    assertThat(rows).hasSize(1);
-
-    Map<String, Object> row = rows.get(0);
-    assertThat(row.get("NAME")).isEqualTo("Sonar way");
-    assertThat(row.get("BUILTIN")).isEqualTo(true);
-    assertThat(((Date) row.get("CREATED_AT")).getTime()).isEqualTo(NOW);
-    assertThat(((Date) row.get("UPDATED_AT")).getTime()).isEqualTo(NOW);
-    return (String) row.get("UUID");
-  }
-
-  private String verifyDefaultOrganization(long userGroupId, String defaultQQUuid) {
-    List<Map<String, Object>> rows = db.select("select " +
-      "uuid as \"UUID\", " +
-      "kee as \"KEE\", " +
-      "name as \"NAME\", " +
-      "guarded as \"GUARDED\", " +
-      "new_project_private as \"PRIVATE\", " +
-      "default_group_id as \"GROUP_ID\", " +
-      "default_quality_gate_uuid as \"QG_UUID\", " +
-      "subscription as \"SUBSCRIPTION\", " +
-      "created_at as \"CREATED_AT\", " +
-      "updated_at as \"UPDATED_AT\"" +
-      " from organizations");
-    assertThat(rows).hasSize(1);
-
-    Map<String, Object> row = rows.get(0);
-    assertThat(row.get("KEE")).isEqualTo("default-organization");
-    assertThat(row.get("NAME")).isEqualTo("Default Organization");
-    assertThat(row.get("GUARDED")).isEqualTo(true);
-    assertThat(row.get("PRIVATE")).isEqualTo(false);
-    assertThat(row.get("GROUP_ID")).isEqualTo(userGroupId);
-    assertThat(row.get("QG_UUID")).isEqualTo(defaultQQUuid);
-    assertThat(row.get("SUBSCRIPTION")).isEqualTo("SONARQUBE");
-    assertThat(row.get("CREATED_AT")).isEqualTo(NOW);
-    assertThat(row.get("UPDATED_AT")).isEqualTo(NOW);
-    return (String) row.get("UUID");
-  }
-
-  private void verifyOrgQualityGate(String orgUuid, String qgUuid) {
-    List<Map<String, Object>> rows = db.select("select " +
-      "uuid as \"UUID\", " +
-      "organization_uuid as \"ORG\", " +
-      "quality_gate_uuid as \"QG\"" +
-      " from org_quality_gates");
-    assertThat(rows).hasSize(1);
-
-    Map<String, Object> row = rows.get(0);
-    assertThat(row.get("UUID")).isNotNull();
-    assertThat(row.get("ORG")).isEqualTo(orgUuid);
-    assertThat(row.get("QG")).isEqualTo(qgUuid);
-  }
-
-  private void verifyInternalProperties(String orgUuid) {
-    List<Map<String, Object>> rows = db.select("select " +
-      "kee as \"KEE\", " +
-      "is_empty as \"EMPTY\", " +
-      "text_value as \"VAL\"," +
-      "created_at as \"CREATED_AT\" " +
-      " from internal_properties");
-    assertThat(rows).hasSize(3);
-
-    Map<String, Map<String, Object>> rowsByKey = rows.stream().collect(MoreCollectors.uniqueIndex(t -> (String) t.get("KEE")));
-    verifyInternalProperty(rowsByKey, "organization.default", orgUuid);
-    verifyInternalProperty(rowsByKey, "installation.date", String.valueOf(system2.now()));
-    verifyInternalProperty(rowsByKey, "installation.version", version.toString());
-  }
-
-  private static void verifyInternalProperty(Map<String, Map<String, Object>> rowsByKey, String key, String val) {
-    Map<String, Object> row = rowsByKey.get(key);
-    assertThat(row.get("KEE")).isEqualTo(key);
-    assertThat(row.get("EMPTY")).isEqualTo(false);
-    assertThat(row.get("VAL")).isEqualTo(val);
-    assertThat(row.get("CREATED_AT")).isEqualTo(NOW);
-  }
-
-  private void verifyRolesOfAdminsGroup() {
-    assertThat(selectRoles("sonar-administrators")).containsOnly("admin", "profileadmin", "gateadmin", "provisioning", "applicationcreator", "portfoliocreator");
-  }
-
-  private void verifyRolesOfUsersGroup() {
-    assertThat(selectRoles("sonar-users")).isEmpty();
-  }
-
-  private void verifyRolesOfAnyone() {
-    List<Map<String, Object>> rows = db.select("select gr.role as \"role\" " +
-      "from group_roles gr where gr.group_id is null");
-    Stream<String> roles = rows.stream()
-      .map(row -> (String) row.get("role"));
-    assertThat(roles).containsOnly("provisioning", "scan");
-  }
-
-  private Stream<String> selectRoles(String groupName) {
-    List<Map<String, Object>> rows = db.select("select gr.role as \"role\" " +
-      "from group_roles gr " +
-      "inner join groups g on gr.group_id = g.id " +
-      "where g.name='" + groupName + "'");
-    return rows.stream()
-      .map(row -> (String) row.get("role"));
-  }
-
-  private void verifyMembershipOfAdminUser() {
-    List<Map<String, Object>> rows = db.select("select g.name as \"groupName\" from groups g " +
-      "inner join groups_users gu on gu.group_id = g.id " +
-      "inner join users u on gu.user_id = u.id " +
-      "where u.login='admin'");
-    List<String> groupNames = rows.stream()
-      .map(row -> (String) row.get("groupName"))
-      .collect(MoreCollectors.toArrayList());
-    assertThat(groupNames).containsOnly("sonar-administrators", "sonar-users");
-  }
-
-}
diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaTest/empty.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaTest/empty.sql
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaTest/v79.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaTest/v79.sql
new file mode 100644 (file)
index 0000000..26147e6
--- /dev/null
@@ -0,0 +1,968 @@
+CREATE TABLE "ORGANIZATIONS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "KEE" VARCHAR(300) NOT NULL,
+  "NAME" VARCHAR(300) NOT NULL,
+  "DESCRIPTION" VARCHAR(256),
+  "URL" VARCHAR(256),
+  "AVATAR_URL" VARCHAR(256),
+  "GUARDED" BOOLEAN NOT NULL,
+  "DEFAULT_PERM_TEMPLATE_PROJECT" VARCHAR(40),
+  "DEFAULT_PERM_TEMPLATE_APP" VARCHAR(40),
+  "DEFAULT_PERM_TEMPLATE_PORT" VARCHAR(40),
+  "DEFAULT_GROUP_ID" INTEGER,
+  "DEFAULT_QUALITY_GATE_UUID" VARCHAR(40) NOT NULL,
+  "NEW_PROJECT_PRIVATE" BOOLEAN NOT NULL,
+  "SUBSCRIPTION" VARCHAR(40) NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_ORGANIZATIONS" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "ORGANIZATION_KEY" ON "ORGANIZATIONS" ("KEE");
+
+CREATE TABLE "ORGANIZATION_MEMBERS" (
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "USER_ID" INTEGER NOT NULL,
+
+  CONSTRAINT "PK_ORGANIZATION_MEMBERS" PRIMARY KEY ("ORGANIZATION_UUID", "USER_ID")
+);
+CREATE INDEX "IX_ORG_MEMBERS_ON_USER_ID" ON "ORGANIZATION_MEMBERS" ("USER_ID");
+
+CREATE TABLE "GROUPS_USERS" (
+  "USER_ID" INTEGER,
+  "GROUP_ID" INTEGER
+);
+CREATE INDEX "INDEX_GROUPS_USERS_ON_GROUP_ID" ON "GROUPS_USERS" ("GROUP_ID");
+CREATE INDEX "INDEX_GROUPS_USERS_ON_USER_ID" ON "GROUPS_USERS" ("USER_ID");
+CREATE UNIQUE INDEX "GROUPS_USERS_UNIQUE" ON "GROUPS_USERS" ("GROUP_ID", "USER_ID");
+
+
+CREATE TABLE "RULES_PARAMETERS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "RULE_ID" INTEGER NOT NULL,
+  "NAME" VARCHAR(128) NOT NULL,
+  "PARAM_TYPE" VARCHAR(512) NOT NULL,
+  "DEFAULT_VALUE" VARCHAR(4000),
+  "DESCRIPTION" VARCHAR(4000)
+);
+CREATE INDEX "RULES_PARAMETERS_RULE_ID" ON "RULES_PARAMETERS" ("RULE_ID");
+CREATE UNIQUE INDEX "RULES_PARAMETERS_UNIQUE" ON "RULES_PARAMETERS" ("RULE_ID", "NAME");
+
+
+CREATE TABLE "RULES_PROFILES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "NAME" VARCHAR(100) NOT NULL,
+  "LANGUAGE" VARCHAR(20),
+  "KEE" VARCHAR(255) NOT NULL,
+  "RULES_UPDATED_AT" VARCHAR(100),
+  "CREATED_AT" TIMESTAMP,
+  "UPDATED_AT" TIMESTAMP,
+  "IS_BUILT_IN" BOOLEAN NOT NULL
+);
+CREATE UNIQUE INDEX "UNIQ_QPROF_KEY" ON "RULES_PROFILES" ("KEE");
+
+
+CREATE TABLE "ORG_QPROFILES" (
+  "UUID" VARCHAR(255) NOT NULL,
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "RULES_PROFILE_UUID" VARCHAR(255) NOT NULL,
+  "PARENT_UUID" VARCHAR(255),
+  "LAST_USED" BIGINT,
+  "USER_UPDATED_AT" BIGINT,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_ORG_QPROFILES" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "ORG_QPROFILES_ORG_UUID" ON "ORG_QPROFILES" ("ORGANIZATION_UUID");
+CREATE INDEX "ORG_QPROFILES_RP_UUID" ON "ORG_QPROFILES" ("RULES_PROFILE_UUID");
+CREATE INDEX "ORG_QPROFILES_PARENT_UUID" ON "ORG_QPROFILES" ("PARENT_UUID");
+
+
+CREATE TABLE "DEFAULT_QPROFILES" (
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "LANGUAGE" VARCHAR(20) NOT NULL,
+  "QPROFILE_UUID" VARCHAR(255) NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_DEFAULT_QPROFILES" PRIMARY KEY ("ORGANIZATION_UUID", "LANGUAGE")
+);
+CREATE UNIQUE INDEX "UNIQ_DEFAULT_QPROFILES_UUID" ON "DEFAULT_QPROFILES" ("QPROFILE_UUID");
+
+
+CREATE TABLE "PROJECT_QPROFILES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "PROJECT_UUID" VARCHAR(50) NOT NULL,
+  "PROFILE_KEY" VARCHAR(50) NOT NULL
+);
+CREATE UNIQUE INDEX "UNIQ_PROJECT_QPROFILES" ON "PROJECT_QPROFILES" ("PROJECT_UUID", "PROFILE_KEY");
+
+
+CREATE TABLE "QPROFILE_EDIT_USERS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "USER_ID" INTEGER NOT NULL,
+  "QPROFILE_UUID" VARCHAR(255) NOT NULL,
+  "CREATED_AT" BIGINT,
+
+  CONSTRAINT "PK_QPROFILE_EDIT_USERS" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "QPROFILE_EDIT_USERS_QPROFILE" ON "QPROFILE_EDIT_USERS" ("QPROFILE_UUID");
+CREATE UNIQUE INDEX "QPROFILE_EDIT_USERS_UNIQUE" ON "QPROFILE_EDIT_USERS" ("USER_ID", "QPROFILE_UUID");
+
+
+CREATE TABLE "QPROFILE_EDIT_GROUPS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "GROUP_ID" INTEGER NOT NULL,
+  "QPROFILE_UUID" VARCHAR(255) NOT NULL,
+  "CREATED_AT" BIGINT,
+
+  CONSTRAINT "PK_QPROFILE_EDIT_GROUPS" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "QPROFILE_EDIT_GROUPS_QPROFILE" ON "QPROFILE_EDIT_GROUPS" ("QPROFILE_UUID");
+CREATE UNIQUE INDEX "QPROFILE_EDIT_GROUPS_UNIQUE" ON "QPROFILE_EDIT_GROUPS" ("GROUP_ID", "QPROFILE_UUID");
+
+
+CREATE TABLE "GROUPS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "NAME" VARCHAR(500),
+  "DESCRIPTION" VARCHAR(200),
+  "CREATED_AT" TIMESTAMP,
+  "UPDATED_AT" TIMESTAMP
+);
+
+
+CREATE TABLE "SNAPSHOTS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "UUID" VARCHAR(50) NOT NULL,
+  "CREATED_AT" BIGINT,
+  "BUILD_DATE" BIGINT,
+  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
+  "STATUS" VARCHAR(4) NOT NULL DEFAULT 'U',
+  "PURGE_STATUS" INTEGER,
+  "ISLAST" BOOLEAN NOT NULL DEFAULT FALSE,
+  "VERSION" VARCHAR(500),
+  "BUILD_STRING" VARCHAR(100),
+  "PERIOD1_MODE" VARCHAR(100),
+  "PERIOD1_PARAM" VARCHAR(100),
+  "PERIOD1_DATE" BIGINT,
+  "PERIOD2_MODE" VARCHAR(100),
+  "PERIOD2_PARAM" VARCHAR(100),
+  "PERIOD2_DATE" BIGINT,
+  "PERIOD3_MODE" VARCHAR(100),
+  "PERIOD3_PARAM" VARCHAR(100),
+  "PERIOD3_DATE" BIGINT,
+  "PERIOD4_MODE" VARCHAR(100),
+  "PERIOD4_PARAM" VARCHAR(100),
+  "PERIOD4_DATE" BIGINT,
+  "PERIOD5_MODE" VARCHAR(100),
+  "PERIOD5_PARAM" VARCHAR(100),
+  "PERIOD5_DATE" BIGINT,
+  "REVISION" VARCHAR(100)
+);
+CREATE INDEX "SNAPSHOT_COMPONENT" ON "SNAPSHOTS" ("COMPONENT_UUID");
+CREATE UNIQUE INDEX "ANALYSES_UUID" ON "SNAPSHOTS" ("UUID");
+
+CREATE TABLE "GROUP_ROLES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "GROUP_ID" INTEGER,
+  "RESOURCE_ID" INTEGER,
+  "ROLE" VARCHAR(64) NOT NULL
+);
+CREATE INDEX "GROUP_ROLES_RESOURCE" ON "GROUP_ROLES" ("RESOURCE_ID");
+CREATE UNIQUE INDEX "UNIQ_GROUP_ROLES" ON "GROUP_ROLES" ("ORGANIZATION_UUID", "GROUP_ID", "RESOURCE_ID", "ROLE");
+
+
+CREATE TABLE "RULE_REPOSITORIES" (
+  "KEE" VARCHAR(200) NOT NULL,
+  "LANGUAGE" VARCHAR(20) NOT NULL,
+  "NAME" VARCHAR(4000) NOT NULL,
+  "CREATED_AT" BIGINT,
+
+  CONSTRAINT "PK_RULE_REPOSITORIES" PRIMARY KEY ("KEE")
+);
+
+CREATE TABLE "DEPRECATED_RULE_KEYS" (
+  "UUID"  VARCHAR(40) NOT NULL,
+  "RULE_ID" INTEGER NOT NULL,
+  "OLD_REPOSITORY_KEY" VARCHAR(200) NOT NULL,
+  "OLD_RULE_KEY" VARCHAR(255) NOT NULL,
+  "CREATED_AT" BIGINT,
+
+  CONSTRAINT "PK_DEPRECATED_RULE_KEYS" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "UNIQ_DEPRECATED_RULE_KEYS" ON "DEPRECATED_RULE_KEYS" ("OLD_REPOSITORY_KEY", "OLD_RULE_KEY");
+CREATE INDEX "RULE_ID_DEPRECATED_RULE_KEYS" ON "DEPRECATED_RULE_KEYS" ("RULE_ID");
+
+CREATE TABLE "RULES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "PLUGIN_KEY" VARCHAR(200),
+  "PLUGIN_RULE_KEY" VARCHAR(200) NOT NULL,
+  "PLUGIN_NAME" VARCHAR(255) NOT NULL,
+  "DESCRIPTION" VARCHAR(16777215),
+  "DESCRIPTION_FORMAT" VARCHAR(20),
+  "PRIORITY" INTEGER,
+  "IS_TEMPLATE" BOOLEAN DEFAULT FALSE,
+  "IS_EXTERNAL" BOOLEAN NOT NULL,
+  "IS_AD_HOC" BOOLEAN NOT NULL,
+  "TEMPLATE_ID" INTEGER,
+  "PLUGIN_CONFIG_KEY" VARCHAR(200),
+  "NAME" VARCHAR(200),
+  "STATUS" VARCHAR(40),
+  "LANGUAGE" VARCHAR(20),
+  "SCOPE" VARCHAR(20) NOT NULL,
+  "DEF_REMEDIATION_FUNCTION" VARCHAR(20),
+  "DEF_REMEDIATION_GAP_MULT" VARCHAR(20),
+  "DEF_REMEDIATION_BASE_EFFORT" VARCHAR(20),
+  "GAP_DESCRIPTION" VARCHAR(4000),
+  "SYSTEM_TAGS" VARCHAR(4000),
+  "SECURITY_STANDARDS" VARCHAR(4000),
+  "RULE_TYPE" TINYINT,
+  "CREATED_AT" BIGINT,
+  "UPDATED_AT" BIGINT
+);
+CREATE UNIQUE INDEX "RULES_REPO_KEY" ON "RULES" ("PLUGIN_NAME", "PLUGIN_RULE_KEY");
+
+CREATE TABLE "RULES_METADATA" (
+  "RULE_ID" INTEGER NOT NULL,
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "NOTE_DATA" CLOB,
+  "NOTE_USER_UUID" VARCHAR(255),
+  "NOTE_CREATED_AT" BIGINT,
+  "NOTE_UPDATED_AT" BIGINT,
+  "REMEDIATION_FUNCTION" VARCHAR(20),
+  "REMEDIATION_GAP_MULT" VARCHAR(20),
+  "REMEDIATION_BASE_EFFORT" VARCHAR(20),
+  "TAGS" VARCHAR(4000),
+  "AD_HOC_NAME" VARCHAR(200),
+  "AD_HOC_DESCRIPTION" VARCHAR(16777215),
+  "AD_HOC_SEVERITY" VARCHAR(10),
+  "AD_HOC_TYPE" TINYINT,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_RULES_METADATA" PRIMARY KEY ("RULE_ID", "ORGANIZATION_UUID")
+);
+
+CREATE TABLE "EVENTS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "UUID" VARCHAR(40) NOT NULL,
+  "NAME" VARCHAR(400),
+  "ANALYSIS_UUID" VARCHAR(50) NOT NULL,
+  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
+  "CATEGORY" VARCHAR(50),
+  "EVENT_DATE" BIGINT NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "DESCRIPTION" VARCHAR(4000),
+  "EVENT_DATA"  VARCHAR(4000)
+);
+CREATE INDEX "EVENTS_ANALYSIS" ON "EVENTS" ("ANALYSIS_UUID");
+CREATE INDEX "EVENTS_COMPONENT_UUID" ON "EVENTS" ("COMPONENT_UUID");
+CREATE UNIQUE INDEX "EVENTS_UUID" ON "EVENTS" ("UUID");
+
+CREATE TABLE "EVENT_COMPONENT_CHANGES" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "EVENT_UUID" VARCHAR(40) NOT NULL,
+  "EVENT_COMPONENT_UUID" VARCHAR(50) NOT NULL,
+  "EVENT_ANALYSIS_UUID" VARCHAR(50) NOT NULL,
+  "CHANGE_CATEGORY" VARCHAR(20) NOT NULL,
+  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
+  "COMPONENT_KEY" VARCHAR(400) NOT NULL,
+  "COMPONENT_NAME" VARCHAR(2000) NOT NULL,
+  "COMPONENT_BRANCH_KEY" VARCHAR(255),
+  "CREATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_EVENT_COMPONENT_CHANGES" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "EVENT_COMPONENT_CHANGES_UNIQUE" ON "EVENT_COMPONENT_CHANGES" ("EVENT_UUID", "CHANGE_CATEGORY", "COMPONENT_UUID");
+CREATE INDEX "EVENT_CPNT_CHANGES_CPNT" ON "EVENT_COMPONENT_CHANGES" ("EVENT_COMPONENT_UUID");
+CREATE INDEX "EVENT_CPNT_CHANGES_ANALYSIS" ON "EVENT_COMPONENT_CHANGES" ("EVENT_ANALYSIS_UUID");
+
+
+CREATE TABLE "QUALITY_GATES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "UUID" VARCHAR(40) NOT NULL,
+  "NAME" VARCHAR(100) NOT NULL,
+  "IS_BUILT_IN" BOOLEAN NOT NULL,
+  "CREATED_AT" TIMESTAMP,
+  "UPDATED_AT" TIMESTAMP,
+);
+CREATE UNIQUE INDEX "UNIQ_QUALITY_GATES_UUID" ON "QUALITY_GATES" ("UUID");
+
+
+CREATE TABLE "QUALITY_GATE_CONDITIONS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "QGATE_ID" INTEGER,
+  "METRIC_ID" INTEGER,
+  "OPERATOR" VARCHAR(3),
+  "VALUE_ERROR" VARCHAR(64),
+  "VALUE_WARNING" VARCHAR(64),
+  "PERIOD" INTEGER,
+  "CREATED_AT" TIMESTAMP,
+  "UPDATED_AT" TIMESTAMP,
+);
+
+CREATE TABLE "ORG_QUALITY_GATES" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "QUALITY_GATE_UUID" VARCHAR(40) NOT NULL,
+
+  CONSTRAINT "PK_ORG_QUALITY_GATES" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "UNIQ_ORG_QUALITY_GATES" ON "ORG_QUALITY_GATES" ("ORGANIZATION_UUID","QUALITY_GATE_UUID");
+
+CREATE TABLE "PROPERTIES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "PROP_KEY" VARCHAR(512) NOT NULL,
+  "RESOURCE_ID" INTEGER,
+  "USER_ID" INTEGER,
+  "IS_EMPTY" BOOLEAN NOT NULL,
+  "TEXT_VALUE" VARCHAR(4000),
+  "CLOB_VALUE" CLOB,
+  "CREATED_AT" BIGINT
+);
+CREATE INDEX "PROPERTIES_KEY" ON "PROPERTIES" ("PROP_KEY");
+
+
+CREATE TABLE "PROJECT_LINKS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "PROJECT_UUID" VARCHAR(50) NOT NULL,
+  "LINK_TYPE" VARCHAR(20) NOT NULL,
+  "NAME" VARCHAR(128),
+  "HREF" VARCHAR(2048) NOT NULL,
+  "CREATED_AT" BIGINT,
+  "UPDATED_AT" BIGINT,
+
+   CONSTRAINT "PK_PROJECT_LINKS" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "PROJECT_LINKS_PROJECT" ON "PROJECT_LINKS" ("PROJECT_UUID");
+
+
+CREATE TABLE "DUPLICATIONS_INDEX" (
+  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "ANALYSIS_UUID" VARCHAR(50) NOT NULL,
+  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
+  "HASH" VARCHAR(50) NOT NULL,
+  "INDEX_IN_FILE" INTEGER NOT NULL,
+  "START_LINE" INTEGER NOT NULL,
+  "END_LINE" INTEGER NOT NULL
+);
+CREATE INDEX "DUPLICATIONS_INDEX_HASH" ON "DUPLICATIONS_INDEX" ("HASH");
+CREATE INDEX "DUPLICATION_ANALYSIS_COMPONENT" ON "DUPLICATIONS_INDEX" ("ANALYSIS_UUID", "COMPONENT_UUID");
+
+
+CREATE TABLE "LIVE_MEASURES" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "PROJECT_UUID" VARCHAR(50) NOT NULL,
+  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
+  "METRIC_ID" INTEGER NOT NULL,
+  "VALUE" DOUBLE,
+  "TEXT_VALUE" VARCHAR(4000),
+  "VARIATION" DOUBLE,
+  "MEASURE_DATA" BINARY,
+  "UPDATE_MARKER" VARCHAR(40),
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_LIVE_MEASURES" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "LIVE_MEASURES_PROJECT" ON "LIVE_MEASURES" ("PROJECT_UUID");
+CREATE UNIQUE INDEX "LIVE_MEASURES_COMPONENT" ON "LIVE_MEASURES" ("COMPONENT_UUID", "METRIC_ID");
+
+
+CREATE TABLE "PROJECT_MEASURES" (
+  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "VALUE" DOUBLE,
+  "METRIC_ID" INTEGER NOT NULL,
+  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
+  "ANALYSIS_UUID" VARCHAR(50) NOT NULL,
+  "TEXT_VALUE" VARCHAR(4000),
+  "ALERT_STATUS" VARCHAR(5),
+  "ALERT_TEXT" VARCHAR(4000),
+  "DESCRIPTION" VARCHAR(4000),
+  "PERSON_ID" INTEGER,
+  "VARIATION_VALUE_1" DOUBLE,
+  "VARIATION_VALUE_2" DOUBLE,
+  "VARIATION_VALUE_3" DOUBLE,
+  "VARIATION_VALUE_4" DOUBLE,
+  "VARIATION_VALUE_5" DOUBLE,
+  "MEASURE_DATA" BINARY
+);
+CREATE INDEX "MEASURES_COMPONENT_UUID" ON "PROJECT_MEASURES" ("COMPONENT_UUID");
+CREATE INDEX "MEASURES_ANALYSIS_METRIC" ON "PROJECT_MEASURES" ("ANALYSIS_UUID", "METRIC_ID");
+
+
+CREATE TABLE "INTERNAL_PROPERTIES" (
+  "KEE" VARCHAR(20) NOT NULL,
+  "IS_EMPTY" BOOLEAN NOT NULL,
+  "TEXT_VALUE" VARCHAR(4000),
+  "CLOB_VALUE" CLOB,
+  "CREATED_AT" BIGINT,
+
+  CONSTRAINT "PK_INTERNAL_PROPERTIES" PRIMARY KEY ("KEE")
+);
+
+
+CREATE TABLE "PROJECTS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "KEE" VARCHAR(400),
+  "UUID" VARCHAR(50) NOT NULL,
+  "UUID_PATH" VARCHAR(1500) NOT NULL,
+  "ROOT_UUID" VARCHAR(50) NOT NULL,
+  "PROJECT_UUID" VARCHAR(50) NOT NULL,
+  "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(500),
+  "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_ORGANIZATION" ON "PROJECTS" ("ORGANIZATION_UUID");
+CREATE UNIQUE 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");
+
+CREATE TABLE "INTERNAL_COMPONENT_PROPS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
+  "KEE" VARCHAR(512) NOT NULL,
+  "VALUE" VARCHAR(4000),
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+  CONSTRAINT "INTERNAL_COMPONENT_PROPS_UUID" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "UNIQUE_COMPONENT_UUID_KEE" ON "INTERNAL_COMPONENT_PROPS" ("COMPONENT_UUID", "KEE");
+
+CREATE TABLE "MANUAL_MEASURES" (
+  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "METRIC_ID" INTEGER NOT NULL,
+  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
+  "VALUE" DOUBLE,
+  "TEXT_VALUE" VARCHAR(4000),
+  "USER_UUID" VARCHAR(255),
+  "DESCRIPTION" VARCHAR(4000),
+  "CREATED_AT" BIGINT,
+  "UPDATED_AT" BIGINT
+);
+CREATE INDEX "MANUAL_MEASURES_COMPONENT_UUID" ON "MANUAL_MEASURES" ("COMPONENT_UUID");
+
+
+CREATE TABLE "ACTIVE_RULES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "PROFILE_ID" INTEGER NOT NULL,
+  "RULE_ID" INTEGER NOT NULL,
+  "FAILURE_LEVEL" INTEGER NOT NULL,
+  "INHERITANCE" VARCHAR(10),
+  "CREATED_AT" BIGINT,
+  "UPDATED_AT" BIGINT
+);
+CREATE UNIQUE INDEX "ACTIVE_RULES_UNIQUE" ON "ACTIVE_RULES" ("PROFILE_ID","RULE_ID");
+
+
+CREATE TABLE "NOTIFICATIONS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "DATA" BLOB
+);
+
+
+CREATE TABLE "USER_ROLES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "USER_ID" INTEGER,
+  "RESOURCE_ID" INTEGER,
+  "ROLE" VARCHAR(64) NOT NULL
+);
+CREATE INDEX "USER_ROLES_RESOURCE" ON "USER_ROLES" ("RESOURCE_ID");
+CREATE INDEX "USER_ROLES_USER" ON "USER_ROLES" ("USER_ID");
+
+
+CREATE TABLE "ACTIVE_RULE_PARAMETERS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "ACTIVE_RULE_ID" INTEGER NOT NULL,
+  "RULES_PARAMETER_ID" INTEGER NOT NULL,
+  "RULES_PARAMETER_KEY" VARCHAR(128),
+  "VALUE" VARCHAR(4000)
+);
+CREATE INDEX "IX_ARP_ON_ACTIVE_RULE_ID" ON "ACTIVE_RULE_PARAMETERS" ("ACTIVE_RULE_ID");
+
+
+CREATE TABLE "USERS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "UUID" VARCHAR(255) NOT NULL,
+  "LOGIN" VARCHAR(255) NOT NULL,
+  "NAME" VARCHAR(200),
+  "EMAIL" VARCHAR(100),
+  "CRYPTED_PASSWORD" VARCHAR(100),
+  "SALT" VARCHAR(40),
+  "HASH_METHOD" VARCHAR(10),
+  "ACTIVE" BOOLEAN DEFAULT TRUE,
+  "SCM_ACCOUNTS" VARCHAR(4000),
+  "EXTERNAL_ID" VARCHAR(255) NOT NULL,
+  "EXTERNAL_LOGIN" VARCHAR(255) NOT NULL,
+  "EXTERNAL_IDENTITY_PROVIDER" VARCHAR(100) NOT NULL,
+  "IS_ROOT" BOOLEAN NOT NULL,
+  "USER_LOCAL" BOOLEAN,
+  "ONBOARDED" BOOLEAN NOT NULL,
+  "HOMEPAGE_TYPE" VARCHAR(40),
+  "HOMEPAGE_PARAMETER" VARCHAR(40),
+  "ORGANIZATION_UUID" VARCHAR(40),
+  "LAST_CONNECTION_DATE" BIGINT,
+  "CREATED_AT" BIGINT,
+  "UPDATED_AT" BIGINT
+);
+CREATE UNIQUE INDEX "USERS_UUID" ON "USERS" ("UUID");
+CREATE UNIQUE INDEX "USERS_LOGIN" ON "USERS" ("LOGIN");
+CREATE UNIQUE INDEX "UNIQ_EXTERNAL_ID" ON "USERS" ("EXTERNAL_IDENTITY_PROVIDER", "EXTERNAL_ID");
+CREATE UNIQUE INDEX "UNIQ_EXTERNAL_LOGIN" ON "USERS" ("EXTERNAL_IDENTITY_PROVIDER", "EXTERNAL_LOGIN");
+CREATE INDEX "USERS_UPDATED_AT" ON "USERS" ("UPDATED_AT");
+
+
+CREATE TABLE "METRICS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "NAME" VARCHAR(64) NOT NULL,
+  "DESCRIPTION" VARCHAR(255),
+  "DIRECTION" INTEGER NOT NULL DEFAULT 0,
+  "DOMAIN" VARCHAR(64),
+  "SHORT_NAME" VARCHAR(64),
+  "QUALITATIVE" BOOLEAN NOT NULL DEFAULT FALSE,
+  "VAL_TYPE" VARCHAR(8),
+  "USER_MANAGED" BOOLEAN DEFAULT FALSE,
+  "ENABLED" BOOLEAN DEFAULT TRUE,
+  "WORST_VALUE" DOUBLE,
+  "BEST_VALUE" DOUBLE,
+  "OPTIMIZED_BEST_VALUE" BOOLEAN,
+  "HIDDEN" BOOLEAN,
+  "DELETE_HISTORICAL_DATA" BOOLEAN,
+  "DECIMAL_SCALE" INTEGER
+);
+CREATE UNIQUE INDEX "METRICS_UNIQUE_NAME" ON "METRICS" ("NAME");
+
+
+CREATE TABLE "ISSUES" (
+  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "KEE" VARCHAR(50) UNIQUE NOT NULL,
+  "COMPONENT_UUID" VARCHAR(50),
+  "PROJECT_UUID" VARCHAR(50),
+  "RULE_ID" INTEGER,
+  "SEVERITY" VARCHAR(10),
+  "MANUAL_SEVERITY" BOOLEAN NOT NULL,
+  "MESSAGE" VARCHAR(4000),
+  "LINE" INTEGER,
+  "GAP" DOUBLE,
+  "EFFORT" INTEGER,
+  "STATUS" VARCHAR(20),
+  "RESOLUTION" VARCHAR(20),
+  "CHECKSUM" VARCHAR(1000),
+  "REPORTER" VARCHAR(255),
+  "ASSIGNEE" VARCHAR(255),
+  "AUTHOR_LOGIN" VARCHAR(255),
+  "ACTION_PLAN_KEY" VARCHAR(50) NULL,
+  "ISSUE_ATTRIBUTES" VARCHAR(4000),
+  "TAGS" VARCHAR(4000),
+  "ISSUE_CREATION_DATE" BIGINT,
+  "ISSUE_CLOSE_DATE" BIGINT,
+  "ISSUE_UPDATE_DATE" BIGINT,
+  "CREATED_AT" BIGINT,
+  "UPDATED_AT" BIGINT,
+  "LOCATIONS" BLOB,
+  "ISSUE_TYPE" TINYINT,
+  "FROM_HOTSPOT" BOOLEAN NULL
+);
+CREATE UNIQUE INDEX "ISSUES_KEE" ON "ISSUES" ("KEE");
+CREATE INDEX "ISSUES_COMPONENT_UUID" ON "ISSUES" ("COMPONENT_UUID");
+CREATE INDEX "ISSUES_PROJECT_UUID" ON "ISSUES" ("PROJECT_UUID");
+CREATE INDEX "ISSUES_RULE_ID" ON "ISSUES" ("RULE_ID");
+CREATE INDEX "ISSUES_RESOLUTION" ON "ISSUES" ("RESOLUTION");
+CREATE INDEX "ISSUES_ASSIGNEE" ON "ISSUES" ("ASSIGNEE");
+CREATE INDEX "ISSUES_CREATION_DATE" ON "ISSUES" ("ISSUE_CREATION_DATE");
+CREATE INDEX "ISSUES_UPDATED_AT" ON "ISSUES" ("UPDATED_AT");
+
+
+CREATE TABLE "ISSUE_CHANGES" (
+  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "KEE" VARCHAR(50),
+  "ISSUE_KEY" VARCHAR(50) NOT NULL,
+  "USER_LOGIN" VARCHAR(255),
+  "CHANGE_TYPE" VARCHAR(40),
+  "CHANGE_DATA"  VARCHAR(16777215),
+  "CREATED_AT" BIGINT,
+  "UPDATED_AT" BIGINT,
+  "ISSUE_CHANGE_CREATION_DATE" BIGINT
+);
+CREATE INDEX "ISSUE_CHANGES_KEE" ON "ISSUE_CHANGES" ("KEE");
+CREATE INDEX "ISSUE_CHANGES_ISSUE_KEY" ON "ISSUE_CHANGES" ("ISSUE_KEY");
+
+
+CREATE TABLE "PERMISSION_TEMPLATES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "NAME" VARCHAR(100) NOT NULL,
+  "KEE" VARCHAR(100) NOT NULL,
+  "DESCRIPTION" VARCHAR(4000),
+  "KEY_PATTERN" VARCHAR(500),
+  "CREATED_AT" TIMESTAMP,
+  "UPDATED_AT" TIMESTAMP
+);
+
+
+CREATE TABLE "PERM_TPL_CHARACTERISTICS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "TEMPLATE_ID" INTEGER NOT NULL,
+  "PERMISSION_KEY" VARCHAR(64) NOT NULL,
+  "WITH_PROJECT_CREATOR" BOOLEAN NOT NULL DEFAULT FALSE,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL
+);
+CREATE UNIQUE INDEX "UNIQ_PERM_TPL_CHARAC" ON "PERM_TPL_CHARACTERISTICS" ("TEMPLATE_ID", "PERMISSION_KEY");
+
+
+CREATE TABLE "PERM_TEMPLATES_USERS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "USER_ID" INTEGER NOT NULL,
+  "TEMPLATE_ID" INTEGER NOT NULL,
+  "PERMISSION_REFERENCE" VARCHAR(64) NOT NULL,
+  "CREATED_AT" TIMESTAMP,
+  "UPDATED_AT" TIMESTAMP
+);
+
+
+CREATE TABLE "PERM_TEMPLATES_GROUPS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "GROUP_ID" INTEGER,
+  "TEMPLATE_ID" INTEGER NOT NULL,
+  "PERMISSION_REFERENCE" VARCHAR(64) NOT NULL,
+  "CREATED_AT" TIMESTAMP,
+  "UPDATED_AT" TIMESTAMP
+);
+
+
+CREATE TABLE "QPROFILE_CHANGES" (
+  "KEE" VARCHAR(40) NOT NULL,
+  "RULES_PROFILE_UUID" VARCHAR(255) NOT NULL,
+  "CHANGE_TYPE" VARCHAR(20) NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "USER_UUID" VARCHAR(255),
+  "CHANGE_DATA" CLOB,
+
+  CONSTRAINT "PK_QPROFILE_CHANGES" PRIMARY KEY ("KEE")
+);
+CREATE INDEX "QP_CHANGES_RULES_PROFILE_UUID" ON "QPROFILE_CHANGES" ("RULES_PROFILE_UUID");
+
+
+CREATE TABLE "FILE_SOURCES" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "PROJECT_UUID" VARCHAR(50) NOT NULL,
+  "FILE_UUID" VARCHAR(50) NOT NULL,
+  "LINE_HASHES" CLOB,
+  "LINE_HASHES_VERSION" INTEGER,
+  "LINE_COUNT" INTEGER NOT NULL,
+  "BINARY_DATA" BLOB,
+  "DATA_HASH" VARCHAR(50),
+  "SRC_HASH" VARCHAR(50),
+  "REVISION" VARCHAR(100),
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL
+);
+CREATE INDEX "FILE_SOURCES_PROJECT_UUID" ON "FILE_SOURCES" ("PROJECT_UUID");
+CREATE UNIQUE INDEX "FILE_SOURCES_FILE_UUID" ON "FILE_SOURCES" ("FILE_UUID");
+CREATE INDEX "FILE_SOURCES_UPDATED_AT" ON "FILE_SOURCES" ("UPDATED_AT");
+
+
+CREATE TABLE "CE_QUEUE" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "UUID" VARCHAR(40) NOT NULL,
+  "TASK_TYPE" VARCHAR(15) NOT NULL,
+  "COMPONENT_UUID" VARCHAR(40) NULL,
+  "MAIN_COMPONENT_UUID" VARCHAR(40) NULL,
+  "STATUS" VARCHAR(15) NOT NULL,
+  "SUBMITTER_UUID" VARCHAR(255) NULL,
+  "WORKER_UUID" VARCHAR(40) NULL,
+  "EXECUTION_COUNT" INTEGER NOT NULL,
+  "STARTED_AT" BIGINT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL
+);
+CREATE UNIQUE INDEX "CE_QUEUE_UUID" ON "CE_QUEUE" ("UUID");
+CREATE INDEX "CE_QUEUE_COMPONENT" ON "CE_QUEUE" ("COMPONENT_UUID");
+CREATE INDEX "CE_QUEUE_MAIN_COMPONENT" ON "CE_QUEUE" ("MAIN_COMPONENT_UUID");
+CREATE INDEX "CE_QUEUE_STATUS" ON "CE_QUEUE" ("STATUS");
+
+
+CREATE TABLE "CE_ACTIVITY" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "UUID" VARCHAR(40) NOT NULL,
+  "TASK_TYPE" VARCHAR(15) NOT NULL,
+  "COMPONENT_UUID" VARCHAR(40) NULL,
+  "MAIN_COMPONENT_UUID" VARCHAR(40) NULL,
+  "ANALYSIS_UUID" VARCHAR(50) NULL,
+  "STATUS" VARCHAR(15) NOT NULL,
+  "IS_LAST" BOOLEAN,
+  "IS_LAST_KEY" VARCHAR(55),
+  "MAIN_IS_LAST" BOOLEAN,
+  "MAIN_IS_LAST_KEY" VARCHAR(55),
+  "SUBMITTER_UUID" VARCHAR(255) NULL,
+  "WORKER_UUID" VARCHAR(40) NULL,
+  "EXECUTION_COUNT" INTEGER NOT NULL,
+  "SUBMITTED_AT" BIGINT NOT NULL,
+  "STARTED_AT" BIGINT NULL,
+  "EXECUTED_AT" BIGINT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+  "EXECUTION_TIME_MS" BIGINT NULL,
+  "ERROR_MESSAGE" VARCHAR(1000),
+  "ERROR_STACKTRACE" CLOB,
+  "ERROR_TYPE" VARCHAR(20)
+);
+CREATE UNIQUE INDEX "CE_ACTIVITY_UUID" ON "CE_ACTIVITY" ("UUID");
+CREATE INDEX "CE_ACTIVITY_COMPONENT" ON "CE_ACTIVITY" ("COMPONENT_UUID");
+CREATE INDEX "CE_ACTIVITY_MAIN_COMPONENT" ON "CE_ACTIVITY" ("COMPONENT_UUID");
+CREATE INDEX "CE_ACTIVITY_ISLAST_KEY" ON "CE_ACTIVITY" ("IS_LAST_KEY");
+CREATE INDEX "CE_ACTIVITY_ISLAST" ON "CE_ACTIVITY" ("IS_LAST", "STATUS");
+CREATE INDEX "CE_ACTIVITY_MAIN_ISLAST_KEY" ON "CE_ACTIVITY" ("MAIN_IS_LAST_KEY");
+CREATE INDEX "CE_ACTIVITY_MAIN_ISLAST" ON "CE_ACTIVITY" ("MAIN_IS_LAST", "STATUS");
+
+
+CREATE TABLE "CE_TASK_CHARACTERISTICS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "TASK_UUID" VARCHAR(40) NOT NULL,
+  "KEE" VARCHAR(50) NOT NULL,
+  "TEXT_VALUE" VARCHAR(4000),
+
+  CONSTRAINT "PK_CE_TASK_CHARACTERISTICS" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "CE_TASK_CHARACTERISTICS_TASK_UUID" ON "CE_TASK_CHARACTERISTICS" ("TASK_UUID");
+
+
+CREATE TABLE "CE_TASK_INPUT" (
+  "TASK_UUID" VARCHAR(40) NOT NULL,
+  "INPUT_DATA" BLOB,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_CE_TASK_INPUT" PRIMARY KEY ("TASK_UUID")
+);
+
+
+CREATE TABLE "CE_SCANNER_CONTEXT" (
+  "TASK_UUID" VARCHAR(40) NOT NULL,
+  "CONTEXT_DATA" BLOB NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_CE_SCANNER_CONTEXT" PRIMARY KEY ("TASK_UUID")
+);
+
+CREATE TABLE "CE_TASK_MESSAGE" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "TASK_UUID" VARCHAR(40) NOT NULL,
+  "MESSAGE" VARCHAR(4000) NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "CE_TASK_MESSAGE" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "CE_TASK_MESSAGE_TASK" ON "CE_TASK_MESSAGE" ("TASK_UUID");
+
+
+CREATE TABLE "USER_TOKENS" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "USER_UUID" VARCHAR(255) NOT NULL,
+  "NAME" VARCHAR(100) NOT NULL,
+  "TOKEN_HASH" VARCHAR(255) NOT NULL,
+  "LAST_CONNECTION_DATE" BIGINT,
+  "CREATED_AT" BIGINT NOT NULL
+);
+CREATE UNIQUE INDEX "USER_TOKENS_TOKEN_HASH" ON "USER_TOKENS" ("TOKEN_HASH");
+CREATE UNIQUE INDEX "USER_TOKENS_USER_UUID_NAME" ON "USER_TOKENS" ("USER_UUID", "NAME");
+
+
+CREATE TABLE "ES_QUEUE" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "DOC_TYPE" VARCHAR(40) NOT NULL,
+  "DOC_ID" VARCHAR(4000) NOT NULL,
+  "DOC_ID_TYPE" VARCHAR(20),
+  "DOC_ROUTING" VARCHAR(4000),
+  "CREATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_ES_QUEUE" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "ES_QUEUE_CREATED_AT" ON "ES_QUEUE" ("CREATED_AT");
+
+
+CREATE TABLE "PLUGINS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "KEE" VARCHAR(200) NOT NULL,
+  "BASE_PLUGIN_KEY" VARCHAR(200),
+  "FILE_HASH" VARCHAR(200) NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_PLUGINS" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "PLUGINS_KEY" ON "PLUGINS" ("KEE");
+
+
+CREATE TABLE "PROJECT_BRANCHES" (
+  "UUID" VARCHAR(50) NOT NULL,
+  "PROJECT_UUID" VARCHAR(50) NOT NULL,
+  "KEE" VARCHAR(255) NOT NULL,
+  "KEY_TYPE" VARCHAR(12) NOT NULL,
+  "BRANCH_TYPE" VARCHAR(12),
+  "MERGE_BRANCH_UUID" VARCHAR(50),
+  "PULL_REQUEST_BINARY" BLOB,
+  "MANUAL_BASELINE_ANALYSIS_UUID" VARCHAR(40),
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_PROJECT_BRANCHES" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "PROJECT_BRANCHES_KEE_KEY_TYPE" ON "PROJECT_BRANCHES" ("PROJECT_UUID", "KEE", "KEY_TYPE");
+
+
+CREATE TABLE "ANALYSIS_PROPERTIES" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "SNAPSHOT_UUID" VARCHAR(40) NOT NULL,
+  "KEE" VARCHAR(512) NOT NULL,
+  "TEXT_VALUE" VARCHAR(4000),
+  "CLOB_VALUE" CLOB,
+  "IS_EMPTY" BOOLEAN NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_ANALYSIS_PROPERTIES" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "SNAPSHOT_UUID" ON "ANALYSIS_PROPERTIES" ("SNAPSHOT_UUID");
+
+
+CREATE TABLE "WEBHOOKS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "NAME" VARCHAR(100) NOT NULL,
+  "URL" VARCHAR(2000) NOT NULL,
+  "ORGANIZATION_UUID" VARCHAR(40),
+  "PROJECT_UUID" VARCHAR(40),
+  "SECRET" VARCHAR(200),
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_WEBHOOKS" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "ORGANIZATION_WEBHOOK" ON "WEBHOOKS" ("ORGANIZATION_UUID");
+CREATE INDEX "PROJECT_WEBHOOK" ON "WEBHOOKS" ("PROJECT_UUID");
+
+
+CREATE TABLE "WEBHOOK_DELIVERIES" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "WEBHOOK_UUID" VARCHAR(40) NOT NULL,
+  "COMPONENT_UUID" VARCHAR(40) NOT NULL,
+  "ANALYSIS_UUID" VARCHAR(40),
+  "CE_TASK_UUID" VARCHAR(40),
+  "NAME" VARCHAR(100) NOT NULL,
+  "URL" VARCHAR(2000) NOT NULL,
+  "SUCCESS" BOOLEAN NOT NULL,
+  "HTTP_STATUS" INT,
+  "DURATION_MS" INT NOT NULL,
+  "PAYLOAD" CLOB NOT NULL,
+  "ERROR_STACKTRACE" CLOB,
+  "CREATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_WEBHOOK_DELIVERIES" PRIMARY KEY ("UUID")
+);
+CREATE INDEX "COMPONENT_UUID" ON "WEBHOOK_DELIVERIES" ("COMPONENT_UUID");
+CREATE INDEX "CE_TASK_UUID" ON "WEBHOOK_DELIVERIES" ("CE_TASK_UUID");
+CREATE INDEX "ANALYSIS_UUID" ON "WEBHOOK_DELIVERIES" ("ANALYSIS_UUID");
+
+
+CREATE TABLE "ALM_APP_INSTALLS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "ALM_ID" VARCHAR(40) NOT NULL,
+  "OWNER_ID" VARCHAR(4000) NOT NULL,
+  "IS_OWNER_USER" BOOLEAN NOT NULL,
+  "INSTALL_ID" VARCHAR(4000) NOT NULL,
+  "USER_EXTERNAL_ID" VARCHAR(255),
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_ALM_APP_INSTALLS" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "ALM_APP_INSTALLS_OWNER" ON "ALM_APP_INSTALLS" ("ALM_ID", "OWNER_ID");
+CREATE UNIQUE INDEX "ALM_APP_INSTALLS_INSTALL" ON "ALM_APP_INSTALLS" ("ALM_ID", "INSTALL_ID");
+CREATE INDEX "ALM_APP_INSTALLS_EXTERNAL_ID" ON "ALM_APP_INSTALLS" ("USER_EXTERNAL_ID");
+
+CREATE TABLE "PROJECT_ALM_BINDINGS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "ALM_ID" VARCHAR(40) NOT NULL,
+  "REPO_ID" VARCHAR(256) NOT NULL,
+  "PROJECT_UUID" VARCHAR(40) NOT NULL,
+  "GITHUB_SLUG" VARCHAR(256) NULL,
+  "URL" VARCHAR(2000) NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+  CONSTRAINT "PK_PROJECT_ALM_BINDINGS" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "PROJECT_ALM_BINDINGS_ALM_REPO" ON "PROJECT_ALM_BINDINGS" ("ALM_ID", "REPO_ID");
+CREATE UNIQUE INDEX "PROJECT_ALM_BINDINGS_PROJECT" ON "PROJECT_ALM_BINDINGS" ("PROJECT_UUID");
+
+CREATE TABLE "PROJECT_MAPPINGS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "KEY_TYPE" VARCHAR(200) NOT NULL,
+  "KEE" VARCHAR(4000) NOT NULL,
+  "PROJECT_UUID" VARCHAR(40) NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  CONSTRAINT "PK_PROJECT_MAPPINGS" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "KEY_TYPE_KEE" ON "PROJECT_MAPPINGS" ("KEY_TYPE", "KEE");
+CREATE INDEX "PROJECT_UUID" ON "PROJECT_MAPPINGS" ("PROJECT_UUID");
+
+CREATE TABLE "ORGANIZATION_ALM_BINDINGS" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
+  "ALM_APP_INSTALL_UUID" VARCHAR(40) NOT NULL,
+  "ALM_ID" VARCHAR(40) NOT NULL,
+  "URL" VARCHAR(2000) NOT NULL,
+  "USER_UUID" VARCHAR(255) NOT NULL,
+  "MEMBERS_SYNC_ENABLED" BOOLEAN,
+  "CREATED_AT" BIGINT NOT NULL,
+  CONSTRAINT "PK_ORGANIZATION_ALM_BINDINGS" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "ORG_ALM_BINDINGS_ORG" ON "ORGANIZATION_ALM_BINDINGS" ("ORGANIZATION_UUID");
+CREATE UNIQUE INDEX "ORG_ALM_BINDINGS_INSTALL" ON "ORGANIZATION_ALM_BINDINGS" ("ALM_APP_INSTALL_UUID");
+
+CREATE TABLE "USER_PROPERTIES" (
+  "UUID" VARCHAR(40) NOT NULL,
+  "USER_UUID" VARCHAR(255) NOT NULL,
+  "KEE" VARCHAR(100) NOT NULL,
+  "TEXT_VALUE" VARCHAR(4000) NOT NULL,
+  "CREATED_AT" BIGINT NOT NULL,
+  "UPDATED_AT" BIGINT NOT NULL,
+
+  CONSTRAINT "PK_USER_PROPERTIES" PRIMARY KEY ("UUID")
+);
+CREATE UNIQUE INDEX "USER_PROPERTIES_USER_UUID_KEE" ON "USER_PROPERTIES" ("USER_UUID", "KEE");
diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v79/CreateInitialSchemaTest/empty.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v79/CreateInitialSchemaTest/empty.sql
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v79/PopulateInitialSchemaTest/v79.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v79/PopulateInitialSchemaTest/v79.sql
deleted file mode 100644 (file)
index 26147e6..0000000
+++ /dev/null
@@ -1,968 +0,0 @@
-CREATE TABLE "ORGANIZATIONS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(300) NOT NULL,
-  "NAME" VARCHAR(300) NOT NULL,
-  "DESCRIPTION" VARCHAR(256),
-  "URL" VARCHAR(256),
-  "AVATAR_URL" VARCHAR(256),
-  "GUARDED" BOOLEAN NOT NULL,
-  "DEFAULT_PERM_TEMPLATE_PROJECT" VARCHAR(40),
-  "DEFAULT_PERM_TEMPLATE_APP" VARCHAR(40),
-  "DEFAULT_PERM_TEMPLATE_PORT" VARCHAR(40),
-  "DEFAULT_GROUP_ID" INTEGER,
-  "DEFAULT_QUALITY_GATE_UUID" VARCHAR(40) NOT NULL,
-  "NEW_PROJECT_PRIVATE" BOOLEAN NOT NULL,
-  "SUBSCRIPTION" VARCHAR(40) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ORGANIZATIONS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "ORGANIZATION_KEY" ON "ORGANIZATIONS" ("KEE");
-
-CREATE TABLE "ORGANIZATION_MEMBERS" (
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "USER_ID" INTEGER NOT NULL,
-
-  CONSTRAINT "PK_ORGANIZATION_MEMBERS" PRIMARY KEY ("ORGANIZATION_UUID", "USER_ID")
-);
-CREATE INDEX "IX_ORG_MEMBERS_ON_USER_ID" ON "ORGANIZATION_MEMBERS" ("USER_ID");
-
-CREATE TABLE "GROUPS_USERS" (
-  "USER_ID" INTEGER,
-  "GROUP_ID" INTEGER
-);
-CREATE INDEX "INDEX_GROUPS_USERS_ON_GROUP_ID" ON "GROUPS_USERS" ("GROUP_ID");
-CREATE INDEX "INDEX_GROUPS_USERS_ON_USER_ID" ON "GROUPS_USERS" ("USER_ID");
-CREATE UNIQUE INDEX "GROUPS_USERS_UNIQUE" ON "GROUPS_USERS" ("GROUP_ID", "USER_ID");
-
-
-CREATE TABLE "RULES_PARAMETERS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "RULE_ID" INTEGER NOT NULL,
-  "NAME" VARCHAR(128) NOT NULL,
-  "PARAM_TYPE" VARCHAR(512) NOT NULL,
-  "DEFAULT_VALUE" VARCHAR(4000),
-  "DESCRIPTION" VARCHAR(4000)
-);
-CREATE INDEX "RULES_PARAMETERS_RULE_ID" ON "RULES_PARAMETERS" ("RULE_ID");
-CREATE UNIQUE INDEX "RULES_PARAMETERS_UNIQUE" ON "RULES_PARAMETERS" ("RULE_ID", "NAME");
-
-
-CREATE TABLE "RULES_PROFILES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "NAME" VARCHAR(100) NOT NULL,
-  "LANGUAGE" VARCHAR(20),
-  "KEE" VARCHAR(255) NOT NULL,
-  "RULES_UPDATED_AT" VARCHAR(100),
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP,
-  "IS_BUILT_IN" BOOLEAN NOT NULL
-);
-CREATE UNIQUE INDEX "UNIQ_QPROF_KEY" ON "RULES_PROFILES" ("KEE");
-
-
-CREATE TABLE "ORG_QPROFILES" (
-  "UUID" VARCHAR(255) NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "RULES_PROFILE_UUID" VARCHAR(255) NOT NULL,
-  "PARENT_UUID" VARCHAR(255),
-  "LAST_USED" BIGINT,
-  "USER_UPDATED_AT" BIGINT,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ORG_QPROFILES" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "ORG_QPROFILES_ORG_UUID" ON "ORG_QPROFILES" ("ORGANIZATION_UUID");
-CREATE INDEX "ORG_QPROFILES_RP_UUID" ON "ORG_QPROFILES" ("RULES_PROFILE_UUID");
-CREATE INDEX "ORG_QPROFILES_PARENT_UUID" ON "ORG_QPROFILES" ("PARENT_UUID");
-
-
-CREATE TABLE "DEFAULT_QPROFILES" (
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "LANGUAGE" VARCHAR(20) NOT NULL,
-  "QPROFILE_UUID" VARCHAR(255) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_DEFAULT_QPROFILES" PRIMARY KEY ("ORGANIZATION_UUID", "LANGUAGE")
-);
-CREATE UNIQUE INDEX "UNIQ_DEFAULT_QPROFILES_UUID" ON "DEFAULT_QPROFILES" ("QPROFILE_UUID");
-
-
-CREATE TABLE "PROJECT_QPROFILES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "PROFILE_KEY" VARCHAR(50) NOT NULL
-);
-CREATE UNIQUE INDEX "UNIQ_PROJECT_QPROFILES" ON "PROJECT_QPROFILES" ("PROJECT_UUID", "PROFILE_KEY");
-
-
-CREATE TABLE "QPROFILE_EDIT_USERS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "USER_ID" INTEGER NOT NULL,
-  "QPROFILE_UUID" VARCHAR(255) NOT NULL,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_QPROFILE_EDIT_USERS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "QPROFILE_EDIT_USERS_QPROFILE" ON "QPROFILE_EDIT_USERS" ("QPROFILE_UUID");
-CREATE UNIQUE INDEX "QPROFILE_EDIT_USERS_UNIQUE" ON "QPROFILE_EDIT_USERS" ("USER_ID", "QPROFILE_UUID");
-
-
-CREATE TABLE "QPROFILE_EDIT_GROUPS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "GROUP_ID" INTEGER NOT NULL,
-  "QPROFILE_UUID" VARCHAR(255) NOT NULL,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_QPROFILE_EDIT_GROUPS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "QPROFILE_EDIT_GROUPS_QPROFILE" ON "QPROFILE_EDIT_GROUPS" ("QPROFILE_UUID");
-CREATE UNIQUE INDEX "QPROFILE_EDIT_GROUPS_UNIQUE" ON "QPROFILE_EDIT_GROUPS" ("GROUP_ID", "QPROFILE_UUID");
-
-
-CREATE TABLE "GROUPS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(500),
-  "DESCRIPTION" VARCHAR(200),
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP
-);
-
-
-CREATE TABLE "SNAPSHOTS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(50) NOT NULL,
-  "CREATED_AT" BIGINT,
-  "BUILD_DATE" BIGINT,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "STATUS" VARCHAR(4) NOT NULL DEFAULT 'U',
-  "PURGE_STATUS" INTEGER,
-  "ISLAST" BOOLEAN NOT NULL DEFAULT FALSE,
-  "VERSION" VARCHAR(500),
-  "BUILD_STRING" VARCHAR(100),
-  "PERIOD1_MODE" VARCHAR(100),
-  "PERIOD1_PARAM" VARCHAR(100),
-  "PERIOD1_DATE" BIGINT,
-  "PERIOD2_MODE" VARCHAR(100),
-  "PERIOD2_PARAM" VARCHAR(100),
-  "PERIOD2_DATE" BIGINT,
-  "PERIOD3_MODE" VARCHAR(100),
-  "PERIOD3_PARAM" VARCHAR(100),
-  "PERIOD3_DATE" BIGINT,
-  "PERIOD4_MODE" VARCHAR(100),
-  "PERIOD4_PARAM" VARCHAR(100),
-  "PERIOD4_DATE" BIGINT,
-  "PERIOD5_MODE" VARCHAR(100),
-  "PERIOD5_PARAM" VARCHAR(100),
-  "PERIOD5_DATE" BIGINT,
-  "REVISION" VARCHAR(100)
-);
-CREATE INDEX "SNAPSHOT_COMPONENT" ON "SNAPSHOTS" ("COMPONENT_UUID");
-CREATE UNIQUE INDEX "ANALYSES_UUID" ON "SNAPSHOTS" ("UUID");
-
-CREATE TABLE "GROUP_ROLES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "GROUP_ID" INTEGER,
-  "RESOURCE_ID" INTEGER,
-  "ROLE" VARCHAR(64) NOT NULL
-);
-CREATE INDEX "GROUP_ROLES_RESOURCE" ON "GROUP_ROLES" ("RESOURCE_ID");
-CREATE UNIQUE INDEX "UNIQ_GROUP_ROLES" ON "GROUP_ROLES" ("ORGANIZATION_UUID", "GROUP_ID", "RESOURCE_ID", "ROLE");
-
-
-CREATE TABLE "RULE_REPOSITORIES" (
-  "KEE" VARCHAR(200) NOT NULL,
-  "LANGUAGE" VARCHAR(20) NOT NULL,
-  "NAME" VARCHAR(4000) NOT NULL,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_RULE_REPOSITORIES" PRIMARY KEY ("KEE")
-);
-
-CREATE TABLE "DEPRECATED_RULE_KEYS" (
-  "UUID"  VARCHAR(40) NOT NULL,
-  "RULE_ID" INTEGER NOT NULL,
-  "OLD_REPOSITORY_KEY" VARCHAR(200) NOT NULL,
-  "OLD_RULE_KEY" VARCHAR(255) NOT NULL,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_DEPRECATED_RULE_KEYS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "UNIQ_DEPRECATED_RULE_KEYS" ON "DEPRECATED_RULE_KEYS" ("OLD_REPOSITORY_KEY", "OLD_RULE_KEY");
-CREATE INDEX "RULE_ID_DEPRECATED_RULE_KEYS" ON "DEPRECATED_RULE_KEYS" ("RULE_ID");
-
-CREATE TABLE "RULES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PLUGIN_KEY" VARCHAR(200),
-  "PLUGIN_RULE_KEY" VARCHAR(200) NOT NULL,
-  "PLUGIN_NAME" VARCHAR(255) NOT NULL,
-  "DESCRIPTION" VARCHAR(16777215),
-  "DESCRIPTION_FORMAT" VARCHAR(20),
-  "PRIORITY" INTEGER,
-  "IS_TEMPLATE" BOOLEAN DEFAULT FALSE,
-  "IS_EXTERNAL" BOOLEAN NOT NULL,
-  "IS_AD_HOC" BOOLEAN NOT NULL,
-  "TEMPLATE_ID" INTEGER,
-  "PLUGIN_CONFIG_KEY" VARCHAR(200),
-  "NAME" VARCHAR(200),
-  "STATUS" VARCHAR(40),
-  "LANGUAGE" VARCHAR(20),
-  "SCOPE" VARCHAR(20) NOT NULL,
-  "DEF_REMEDIATION_FUNCTION" VARCHAR(20),
-  "DEF_REMEDIATION_GAP_MULT" VARCHAR(20),
-  "DEF_REMEDIATION_BASE_EFFORT" VARCHAR(20),
-  "GAP_DESCRIPTION" VARCHAR(4000),
-  "SYSTEM_TAGS" VARCHAR(4000),
-  "SECURITY_STANDARDS" VARCHAR(4000),
-  "RULE_TYPE" TINYINT,
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT
-);
-CREATE UNIQUE INDEX "RULES_REPO_KEY" ON "RULES" ("PLUGIN_NAME", "PLUGIN_RULE_KEY");
-
-CREATE TABLE "RULES_METADATA" (
-  "RULE_ID" INTEGER NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "NOTE_DATA" CLOB,
-  "NOTE_USER_UUID" VARCHAR(255),
-  "NOTE_CREATED_AT" BIGINT,
-  "NOTE_UPDATED_AT" BIGINT,
-  "REMEDIATION_FUNCTION" VARCHAR(20),
-  "REMEDIATION_GAP_MULT" VARCHAR(20),
-  "REMEDIATION_BASE_EFFORT" VARCHAR(20),
-  "TAGS" VARCHAR(4000),
-  "AD_HOC_NAME" VARCHAR(200),
-  "AD_HOC_DESCRIPTION" VARCHAR(16777215),
-  "AD_HOC_SEVERITY" VARCHAR(10),
-  "AD_HOC_TYPE" TINYINT,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_RULES_METADATA" PRIMARY KEY ("RULE_ID", "ORGANIZATION_UUID")
-);
-
-CREATE TABLE "EVENTS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(400),
-  "ANALYSIS_UUID" VARCHAR(50) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "CATEGORY" VARCHAR(50),
-  "EVENT_DATE" BIGINT NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "DESCRIPTION" VARCHAR(4000),
-  "EVENT_DATA"  VARCHAR(4000)
-);
-CREATE INDEX "EVENTS_ANALYSIS" ON "EVENTS" ("ANALYSIS_UUID");
-CREATE INDEX "EVENTS_COMPONENT_UUID" ON "EVENTS" ("COMPONENT_UUID");
-CREATE UNIQUE INDEX "EVENTS_UUID" ON "EVENTS" ("UUID");
-
-CREATE TABLE "EVENT_COMPONENT_CHANGES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "EVENT_UUID" VARCHAR(40) NOT NULL,
-  "EVENT_COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "EVENT_ANALYSIS_UUID" VARCHAR(50) NOT NULL,
-  "CHANGE_CATEGORY" VARCHAR(20) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "COMPONENT_KEY" VARCHAR(400) NOT NULL,
-  "COMPONENT_NAME" VARCHAR(2000) NOT NULL,
-  "COMPONENT_BRANCH_KEY" VARCHAR(255),
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_EVENT_COMPONENT_CHANGES" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "EVENT_COMPONENT_CHANGES_UNIQUE" ON "EVENT_COMPONENT_CHANGES" ("EVENT_UUID", "CHANGE_CATEGORY", "COMPONENT_UUID");
-CREATE INDEX "EVENT_CPNT_CHANGES_CPNT" ON "EVENT_COMPONENT_CHANGES" ("EVENT_COMPONENT_UUID");
-CREATE INDEX "EVENT_CPNT_CHANGES_ANALYSIS" ON "EVENT_COMPONENT_CHANGES" ("EVENT_ANALYSIS_UUID");
-
-
-CREATE TABLE "QUALITY_GATES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(100) NOT NULL,
-  "IS_BUILT_IN" BOOLEAN NOT NULL,
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP,
-);
-CREATE UNIQUE INDEX "UNIQ_QUALITY_GATES_UUID" ON "QUALITY_GATES" ("UUID");
-
-
-CREATE TABLE "QUALITY_GATE_CONDITIONS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "QGATE_ID" INTEGER,
-  "METRIC_ID" INTEGER,
-  "OPERATOR" VARCHAR(3),
-  "VALUE_ERROR" VARCHAR(64),
-  "VALUE_WARNING" VARCHAR(64),
-  "PERIOD" INTEGER,
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP,
-);
-
-CREATE TABLE "ORG_QUALITY_GATES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "QUALITY_GATE_UUID" VARCHAR(40) NOT NULL,
-
-  CONSTRAINT "PK_ORG_QUALITY_GATES" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "UNIQ_ORG_QUALITY_GATES" ON "ORG_QUALITY_GATES" ("ORGANIZATION_UUID","QUALITY_GATE_UUID");
-
-CREATE TABLE "PROPERTIES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PROP_KEY" VARCHAR(512) NOT NULL,
-  "RESOURCE_ID" INTEGER,
-  "USER_ID" INTEGER,
-  "IS_EMPTY" BOOLEAN NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-  "CLOB_VALUE" CLOB,
-  "CREATED_AT" BIGINT
-);
-CREATE INDEX "PROPERTIES_KEY" ON "PROPERTIES" ("PROP_KEY");
-
-
-CREATE TABLE "PROJECT_LINKS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "LINK_TYPE" VARCHAR(20) NOT NULL,
-  "NAME" VARCHAR(128),
-  "HREF" VARCHAR(2048) NOT NULL,
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT,
-
-   CONSTRAINT "PK_PROJECT_LINKS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "PROJECT_LINKS_PROJECT" ON "PROJECT_LINKS" ("PROJECT_UUID");
-
-
-CREATE TABLE "DUPLICATIONS_INDEX" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ANALYSIS_UUID" VARCHAR(50) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "HASH" VARCHAR(50) NOT NULL,
-  "INDEX_IN_FILE" INTEGER NOT NULL,
-  "START_LINE" INTEGER NOT NULL,
-  "END_LINE" INTEGER NOT NULL
-);
-CREATE INDEX "DUPLICATIONS_INDEX_HASH" ON "DUPLICATIONS_INDEX" ("HASH");
-CREATE INDEX "DUPLICATION_ANALYSIS_COMPONENT" ON "DUPLICATIONS_INDEX" ("ANALYSIS_UUID", "COMPONENT_UUID");
-
-
-CREATE TABLE "LIVE_MEASURES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "METRIC_ID" INTEGER NOT NULL,
-  "VALUE" DOUBLE,
-  "TEXT_VALUE" VARCHAR(4000),
-  "VARIATION" DOUBLE,
-  "MEASURE_DATA" BINARY,
-  "UPDATE_MARKER" VARCHAR(40),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_LIVE_MEASURES" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "LIVE_MEASURES_PROJECT" ON "LIVE_MEASURES" ("PROJECT_UUID");
-CREATE UNIQUE INDEX "LIVE_MEASURES_COMPONENT" ON "LIVE_MEASURES" ("COMPONENT_UUID", "METRIC_ID");
-
-
-CREATE TABLE "PROJECT_MEASURES" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "VALUE" DOUBLE,
-  "METRIC_ID" INTEGER NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "ANALYSIS_UUID" VARCHAR(50) NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-  "ALERT_STATUS" VARCHAR(5),
-  "ALERT_TEXT" VARCHAR(4000),
-  "DESCRIPTION" VARCHAR(4000),
-  "PERSON_ID" INTEGER,
-  "VARIATION_VALUE_1" DOUBLE,
-  "VARIATION_VALUE_2" DOUBLE,
-  "VARIATION_VALUE_3" DOUBLE,
-  "VARIATION_VALUE_4" DOUBLE,
-  "VARIATION_VALUE_5" DOUBLE,
-  "MEASURE_DATA" BINARY
-);
-CREATE INDEX "MEASURES_COMPONENT_UUID" ON "PROJECT_MEASURES" ("COMPONENT_UUID");
-CREATE INDEX "MEASURES_ANALYSIS_METRIC" ON "PROJECT_MEASURES" ("ANALYSIS_UUID", "METRIC_ID");
-
-
-CREATE TABLE "INTERNAL_PROPERTIES" (
-  "KEE" VARCHAR(20) NOT NULL,
-  "IS_EMPTY" BOOLEAN NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-  "CLOB_VALUE" CLOB,
-  "CREATED_AT" BIGINT,
-
-  CONSTRAINT "PK_INTERNAL_PROPERTIES" PRIMARY KEY ("KEE")
-);
-
-
-CREATE TABLE "PROJECTS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(400),
-  "UUID" VARCHAR(50) NOT NULL,
-  "UUID_PATH" VARCHAR(1500) NOT NULL,
-  "ROOT_UUID" VARCHAR(50) NOT NULL,
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "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(500),
-  "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_ORGANIZATION" ON "PROJECTS" ("ORGANIZATION_UUID");
-CREATE UNIQUE 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");
-
-CREATE TABLE "INTERNAL_COMPONENT_PROPS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "KEE" VARCHAR(512) NOT NULL,
-  "VALUE" VARCHAR(4000),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-  CONSTRAINT "INTERNAL_COMPONENT_PROPS_UUID" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "UNIQUE_COMPONENT_UUID_KEE" ON "INTERNAL_COMPONENT_PROPS" ("COMPONENT_UUID", "KEE");
-
-CREATE TABLE "MANUAL_MEASURES" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "METRIC_ID" INTEGER NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50) NOT NULL,
-  "VALUE" DOUBLE,
-  "TEXT_VALUE" VARCHAR(4000),
-  "USER_UUID" VARCHAR(255),
-  "DESCRIPTION" VARCHAR(4000),
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT
-);
-CREATE INDEX "MANUAL_MEASURES_COMPONENT_UUID" ON "MANUAL_MEASURES" ("COMPONENT_UUID");
-
-
-CREATE TABLE "ACTIVE_RULES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PROFILE_ID" INTEGER NOT NULL,
-  "RULE_ID" INTEGER NOT NULL,
-  "FAILURE_LEVEL" INTEGER NOT NULL,
-  "INHERITANCE" VARCHAR(10),
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT
-);
-CREATE UNIQUE INDEX "ACTIVE_RULES_UNIQUE" ON "ACTIVE_RULES" ("PROFILE_ID","RULE_ID");
-
-
-CREATE TABLE "NOTIFICATIONS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "DATA" BLOB
-);
-
-
-CREATE TABLE "USER_ROLES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "USER_ID" INTEGER,
-  "RESOURCE_ID" INTEGER,
-  "ROLE" VARCHAR(64) NOT NULL
-);
-CREATE INDEX "USER_ROLES_RESOURCE" ON "USER_ROLES" ("RESOURCE_ID");
-CREATE INDEX "USER_ROLES_USER" ON "USER_ROLES" ("USER_ID");
-
-
-CREATE TABLE "ACTIVE_RULE_PARAMETERS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ACTIVE_RULE_ID" INTEGER NOT NULL,
-  "RULES_PARAMETER_ID" INTEGER NOT NULL,
-  "RULES_PARAMETER_KEY" VARCHAR(128),
-  "VALUE" VARCHAR(4000)
-);
-CREATE INDEX "IX_ARP_ON_ACTIVE_RULE_ID" ON "ACTIVE_RULE_PARAMETERS" ("ACTIVE_RULE_ID");
-
-
-CREATE TABLE "USERS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(255) NOT NULL,
-  "LOGIN" VARCHAR(255) NOT NULL,
-  "NAME" VARCHAR(200),
-  "EMAIL" VARCHAR(100),
-  "CRYPTED_PASSWORD" VARCHAR(100),
-  "SALT" VARCHAR(40),
-  "HASH_METHOD" VARCHAR(10),
-  "ACTIVE" BOOLEAN DEFAULT TRUE,
-  "SCM_ACCOUNTS" VARCHAR(4000),
-  "EXTERNAL_ID" VARCHAR(255) NOT NULL,
-  "EXTERNAL_LOGIN" VARCHAR(255) NOT NULL,
-  "EXTERNAL_IDENTITY_PROVIDER" VARCHAR(100) NOT NULL,
-  "IS_ROOT" BOOLEAN NOT NULL,
-  "USER_LOCAL" BOOLEAN,
-  "ONBOARDED" BOOLEAN NOT NULL,
-  "HOMEPAGE_TYPE" VARCHAR(40),
-  "HOMEPAGE_PARAMETER" VARCHAR(40),
-  "ORGANIZATION_UUID" VARCHAR(40),
-  "LAST_CONNECTION_DATE" BIGINT,
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT
-);
-CREATE UNIQUE INDEX "USERS_UUID" ON "USERS" ("UUID");
-CREATE UNIQUE INDEX "USERS_LOGIN" ON "USERS" ("LOGIN");
-CREATE UNIQUE INDEX "UNIQ_EXTERNAL_ID" ON "USERS" ("EXTERNAL_IDENTITY_PROVIDER", "EXTERNAL_ID");
-CREATE UNIQUE INDEX "UNIQ_EXTERNAL_LOGIN" ON "USERS" ("EXTERNAL_IDENTITY_PROVIDER", "EXTERNAL_LOGIN");
-CREATE INDEX "USERS_UPDATED_AT" ON "USERS" ("UPDATED_AT");
-
-
-CREATE TABLE "METRICS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "NAME" VARCHAR(64) NOT NULL,
-  "DESCRIPTION" VARCHAR(255),
-  "DIRECTION" INTEGER NOT NULL DEFAULT 0,
-  "DOMAIN" VARCHAR(64),
-  "SHORT_NAME" VARCHAR(64),
-  "QUALITATIVE" BOOLEAN NOT NULL DEFAULT FALSE,
-  "VAL_TYPE" VARCHAR(8),
-  "USER_MANAGED" BOOLEAN DEFAULT FALSE,
-  "ENABLED" BOOLEAN DEFAULT TRUE,
-  "WORST_VALUE" DOUBLE,
-  "BEST_VALUE" DOUBLE,
-  "OPTIMIZED_BEST_VALUE" BOOLEAN,
-  "HIDDEN" BOOLEAN,
-  "DELETE_HISTORICAL_DATA" BOOLEAN,
-  "DECIMAL_SCALE" INTEGER
-);
-CREATE UNIQUE INDEX "METRICS_UNIQUE_NAME" ON "METRICS" ("NAME");
-
-
-CREATE TABLE "ISSUES" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "KEE" VARCHAR(50) UNIQUE NOT NULL,
-  "COMPONENT_UUID" VARCHAR(50),
-  "PROJECT_UUID" VARCHAR(50),
-  "RULE_ID" INTEGER,
-  "SEVERITY" VARCHAR(10),
-  "MANUAL_SEVERITY" BOOLEAN NOT NULL,
-  "MESSAGE" VARCHAR(4000),
-  "LINE" INTEGER,
-  "GAP" DOUBLE,
-  "EFFORT" INTEGER,
-  "STATUS" VARCHAR(20),
-  "RESOLUTION" VARCHAR(20),
-  "CHECKSUM" VARCHAR(1000),
-  "REPORTER" VARCHAR(255),
-  "ASSIGNEE" VARCHAR(255),
-  "AUTHOR_LOGIN" VARCHAR(255),
-  "ACTION_PLAN_KEY" VARCHAR(50) NULL,
-  "ISSUE_ATTRIBUTES" VARCHAR(4000),
-  "TAGS" VARCHAR(4000),
-  "ISSUE_CREATION_DATE" BIGINT,
-  "ISSUE_CLOSE_DATE" BIGINT,
-  "ISSUE_UPDATE_DATE" BIGINT,
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT,
-  "LOCATIONS" BLOB,
-  "ISSUE_TYPE" TINYINT,
-  "FROM_HOTSPOT" BOOLEAN NULL
-);
-CREATE UNIQUE INDEX "ISSUES_KEE" ON "ISSUES" ("KEE");
-CREATE INDEX "ISSUES_COMPONENT_UUID" ON "ISSUES" ("COMPONENT_UUID");
-CREATE INDEX "ISSUES_PROJECT_UUID" ON "ISSUES" ("PROJECT_UUID");
-CREATE INDEX "ISSUES_RULE_ID" ON "ISSUES" ("RULE_ID");
-CREATE INDEX "ISSUES_RESOLUTION" ON "ISSUES" ("RESOLUTION");
-CREATE INDEX "ISSUES_ASSIGNEE" ON "ISSUES" ("ASSIGNEE");
-CREATE INDEX "ISSUES_CREATION_DATE" ON "ISSUES" ("ISSUE_CREATION_DATE");
-CREATE INDEX "ISSUES_UPDATED_AT" ON "ISSUES" ("UPDATED_AT");
-
-
-CREATE TABLE "ISSUE_CHANGES" (
-  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "KEE" VARCHAR(50),
-  "ISSUE_KEY" VARCHAR(50) NOT NULL,
-  "USER_LOGIN" VARCHAR(255),
-  "CHANGE_TYPE" VARCHAR(40),
-  "CHANGE_DATA"  VARCHAR(16777215),
-  "CREATED_AT" BIGINT,
-  "UPDATED_AT" BIGINT,
-  "ISSUE_CHANGE_CREATION_DATE" BIGINT
-);
-CREATE INDEX "ISSUE_CHANGES_KEE" ON "ISSUE_CHANGES" ("KEE");
-CREATE INDEX "ISSUE_CHANGES_ISSUE_KEY" ON "ISSUE_CHANGES" ("ISSUE_KEY");
-
-
-CREATE TABLE "PERMISSION_TEMPLATES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(100) NOT NULL,
-  "KEE" VARCHAR(100) NOT NULL,
-  "DESCRIPTION" VARCHAR(4000),
-  "KEY_PATTERN" VARCHAR(500),
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP
-);
-
-
-CREATE TABLE "PERM_TPL_CHARACTERISTICS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "TEMPLATE_ID" INTEGER NOT NULL,
-  "PERMISSION_KEY" VARCHAR(64) NOT NULL,
-  "WITH_PROJECT_CREATOR" BOOLEAN NOT NULL DEFAULT FALSE,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX "UNIQ_PERM_TPL_CHARAC" ON "PERM_TPL_CHARACTERISTICS" ("TEMPLATE_ID", "PERMISSION_KEY");
-
-
-CREATE TABLE "PERM_TEMPLATES_USERS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "USER_ID" INTEGER NOT NULL,
-  "TEMPLATE_ID" INTEGER NOT NULL,
-  "PERMISSION_REFERENCE" VARCHAR(64) NOT NULL,
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP
-);
-
-
-CREATE TABLE "PERM_TEMPLATES_GROUPS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "GROUP_ID" INTEGER,
-  "TEMPLATE_ID" INTEGER NOT NULL,
-  "PERMISSION_REFERENCE" VARCHAR(64) NOT NULL,
-  "CREATED_AT" TIMESTAMP,
-  "UPDATED_AT" TIMESTAMP
-);
-
-
-CREATE TABLE "QPROFILE_CHANGES" (
-  "KEE" VARCHAR(40) NOT NULL,
-  "RULES_PROFILE_UUID" VARCHAR(255) NOT NULL,
-  "CHANGE_TYPE" VARCHAR(20) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "USER_UUID" VARCHAR(255),
-  "CHANGE_DATA" CLOB,
-
-  CONSTRAINT "PK_QPROFILE_CHANGES" PRIMARY KEY ("KEE")
-);
-CREATE INDEX "QP_CHANGES_RULES_PROFILE_UUID" ON "QPROFILE_CHANGES" ("RULES_PROFILE_UUID");
-
-
-CREATE TABLE "FILE_SOURCES" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "FILE_UUID" VARCHAR(50) NOT NULL,
-  "LINE_HASHES" CLOB,
-  "LINE_HASHES_VERSION" INTEGER,
-  "LINE_COUNT" INTEGER NOT NULL,
-  "BINARY_DATA" BLOB,
-  "DATA_HASH" VARCHAR(50),
-  "SRC_HASH" VARCHAR(50),
-  "REVISION" VARCHAR(100),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL
-);
-CREATE INDEX "FILE_SOURCES_PROJECT_UUID" ON "FILE_SOURCES" ("PROJECT_UUID");
-CREATE UNIQUE INDEX "FILE_SOURCES_FILE_UUID" ON "FILE_SOURCES" ("FILE_UUID");
-CREATE INDEX "FILE_SOURCES_UPDATED_AT" ON "FILE_SOURCES" ("UPDATED_AT");
-
-
-CREATE TABLE "CE_QUEUE" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(40) NOT NULL,
-  "TASK_TYPE" VARCHAR(15) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(40) NULL,
-  "MAIN_COMPONENT_UUID" VARCHAR(40) NULL,
-  "STATUS" VARCHAR(15) NOT NULL,
-  "SUBMITTER_UUID" VARCHAR(255) NULL,
-  "WORKER_UUID" VARCHAR(40) NULL,
-  "EXECUTION_COUNT" INTEGER NOT NULL,
-  "STARTED_AT" BIGINT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX "CE_QUEUE_UUID" ON "CE_QUEUE" ("UUID");
-CREATE INDEX "CE_QUEUE_COMPONENT" ON "CE_QUEUE" ("COMPONENT_UUID");
-CREATE INDEX "CE_QUEUE_MAIN_COMPONENT" ON "CE_QUEUE" ("MAIN_COMPONENT_UUID");
-CREATE INDEX "CE_QUEUE_STATUS" ON "CE_QUEUE" ("STATUS");
-
-
-CREATE TABLE "CE_ACTIVITY" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "UUID" VARCHAR(40) NOT NULL,
-  "TASK_TYPE" VARCHAR(15) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(40) NULL,
-  "MAIN_COMPONENT_UUID" VARCHAR(40) NULL,
-  "ANALYSIS_UUID" VARCHAR(50) NULL,
-  "STATUS" VARCHAR(15) NOT NULL,
-  "IS_LAST" BOOLEAN,
-  "IS_LAST_KEY" VARCHAR(55),
-  "MAIN_IS_LAST" BOOLEAN,
-  "MAIN_IS_LAST_KEY" VARCHAR(55),
-  "SUBMITTER_UUID" VARCHAR(255) NULL,
-  "WORKER_UUID" VARCHAR(40) NULL,
-  "EXECUTION_COUNT" INTEGER NOT NULL,
-  "SUBMITTED_AT" BIGINT NOT NULL,
-  "STARTED_AT" BIGINT NULL,
-  "EXECUTED_AT" BIGINT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-  "EXECUTION_TIME_MS" BIGINT NULL,
-  "ERROR_MESSAGE" VARCHAR(1000),
-  "ERROR_STACKTRACE" CLOB,
-  "ERROR_TYPE" VARCHAR(20)
-);
-CREATE UNIQUE INDEX "CE_ACTIVITY_UUID" ON "CE_ACTIVITY" ("UUID");
-CREATE INDEX "CE_ACTIVITY_COMPONENT" ON "CE_ACTIVITY" ("COMPONENT_UUID");
-CREATE INDEX "CE_ACTIVITY_MAIN_COMPONENT" ON "CE_ACTIVITY" ("COMPONENT_UUID");
-CREATE INDEX "CE_ACTIVITY_ISLAST_KEY" ON "CE_ACTIVITY" ("IS_LAST_KEY");
-CREATE INDEX "CE_ACTIVITY_ISLAST" ON "CE_ACTIVITY" ("IS_LAST", "STATUS");
-CREATE INDEX "CE_ACTIVITY_MAIN_ISLAST_KEY" ON "CE_ACTIVITY" ("MAIN_IS_LAST_KEY");
-CREATE INDEX "CE_ACTIVITY_MAIN_ISLAST" ON "CE_ACTIVITY" ("MAIN_IS_LAST", "STATUS");
-
-
-CREATE TABLE "CE_TASK_CHARACTERISTICS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "TASK_UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(50) NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-
-  CONSTRAINT "PK_CE_TASK_CHARACTERISTICS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "CE_TASK_CHARACTERISTICS_TASK_UUID" ON "CE_TASK_CHARACTERISTICS" ("TASK_UUID");
-
-
-CREATE TABLE "CE_TASK_INPUT" (
-  "TASK_UUID" VARCHAR(40) NOT NULL,
-  "INPUT_DATA" BLOB,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_CE_TASK_INPUT" PRIMARY KEY ("TASK_UUID")
-);
-
-
-CREATE TABLE "CE_SCANNER_CONTEXT" (
-  "TASK_UUID" VARCHAR(40) NOT NULL,
-  "CONTEXT_DATA" BLOB NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_CE_SCANNER_CONTEXT" PRIMARY KEY ("TASK_UUID")
-);
-
-CREATE TABLE "CE_TASK_MESSAGE" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "TASK_UUID" VARCHAR(40) NOT NULL,
-  "MESSAGE" VARCHAR(4000) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "CE_TASK_MESSAGE" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "CE_TASK_MESSAGE_TASK" ON "CE_TASK_MESSAGE" ("TASK_UUID");
-
-
-CREATE TABLE "USER_TOKENS" (
-  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
-  "USER_UUID" VARCHAR(255) NOT NULL,
-  "NAME" VARCHAR(100) NOT NULL,
-  "TOKEN_HASH" VARCHAR(255) NOT NULL,
-  "LAST_CONNECTION_DATE" BIGINT,
-  "CREATED_AT" BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX "USER_TOKENS_TOKEN_HASH" ON "USER_TOKENS" ("TOKEN_HASH");
-CREATE UNIQUE INDEX "USER_TOKENS_USER_UUID_NAME" ON "USER_TOKENS" ("USER_UUID", "NAME");
-
-
-CREATE TABLE "ES_QUEUE" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "DOC_TYPE" VARCHAR(40) NOT NULL,
-  "DOC_ID" VARCHAR(4000) NOT NULL,
-  "DOC_ID_TYPE" VARCHAR(20),
-  "DOC_ROUTING" VARCHAR(4000),
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ES_QUEUE" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "ES_QUEUE_CREATED_AT" ON "ES_QUEUE" ("CREATED_AT");
-
-
-CREATE TABLE "PLUGINS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(200) NOT NULL,
-  "BASE_PLUGIN_KEY" VARCHAR(200),
-  "FILE_HASH" VARCHAR(200) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_PLUGINS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "PLUGINS_KEY" ON "PLUGINS" ("KEE");
-
-
-CREATE TABLE "PROJECT_BRANCHES" (
-  "UUID" VARCHAR(50) NOT NULL,
-  "PROJECT_UUID" VARCHAR(50) NOT NULL,
-  "KEE" VARCHAR(255) NOT NULL,
-  "KEY_TYPE" VARCHAR(12) NOT NULL,
-  "BRANCH_TYPE" VARCHAR(12),
-  "MERGE_BRANCH_UUID" VARCHAR(50),
-  "PULL_REQUEST_BINARY" BLOB,
-  "MANUAL_BASELINE_ANALYSIS_UUID" VARCHAR(40),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_PROJECT_BRANCHES" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "PROJECT_BRANCHES_KEE_KEY_TYPE" ON "PROJECT_BRANCHES" ("PROJECT_UUID", "KEE", "KEY_TYPE");
-
-
-CREATE TABLE "ANALYSIS_PROPERTIES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "SNAPSHOT_UUID" VARCHAR(40) NOT NULL,
-  "KEE" VARCHAR(512) NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000),
-  "CLOB_VALUE" CLOB,
-  "IS_EMPTY" BOOLEAN NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ANALYSIS_PROPERTIES" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "SNAPSHOT_UUID" ON "ANALYSIS_PROPERTIES" ("SNAPSHOT_UUID");
-
-
-CREATE TABLE "WEBHOOKS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "NAME" VARCHAR(100) NOT NULL,
-  "URL" VARCHAR(2000) NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40),
-  "PROJECT_UUID" VARCHAR(40),
-  "SECRET" VARCHAR(200),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_WEBHOOKS" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "ORGANIZATION_WEBHOOK" ON "WEBHOOKS" ("ORGANIZATION_UUID");
-CREATE INDEX "PROJECT_WEBHOOK" ON "WEBHOOKS" ("PROJECT_UUID");
-
-
-CREATE TABLE "WEBHOOK_DELIVERIES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "WEBHOOK_UUID" VARCHAR(40) NOT NULL,
-  "COMPONENT_UUID" VARCHAR(40) NOT NULL,
-  "ANALYSIS_UUID" VARCHAR(40),
-  "CE_TASK_UUID" VARCHAR(40),
-  "NAME" VARCHAR(100) NOT NULL,
-  "URL" VARCHAR(2000) NOT NULL,
-  "SUCCESS" BOOLEAN NOT NULL,
-  "HTTP_STATUS" INT,
-  "DURATION_MS" INT NOT NULL,
-  "PAYLOAD" CLOB NOT NULL,
-  "ERROR_STACKTRACE" CLOB,
-  "CREATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_WEBHOOK_DELIVERIES" PRIMARY KEY ("UUID")
-);
-CREATE INDEX "COMPONENT_UUID" ON "WEBHOOK_DELIVERIES" ("COMPONENT_UUID");
-CREATE INDEX "CE_TASK_UUID" ON "WEBHOOK_DELIVERIES" ("CE_TASK_UUID");
-CREATE INDEX "ANALYSIS_UUID" ON "WEBHOOK_DELIVERIES" ("ANALYSIS_UUID");
-
-
-CREATE TABLE "ALM_APP_INSTALLS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "ALM_ID" VARCHAR(40) NOT NULL,
-  "OWNER_ID" VARCHAR(4000) NOT NULL,
-  "IS_OWNER_USER" BOOLEAN NOT NULL,
-  "INSTALL_ID" VARCHAR(4000) NOT NULL,
-  "USER_EXTERNAL_ID" VARCHAR(255),
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_ALM_APP_INSTALLS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "ALM_APP_INSTALLS_OWNER" ON "ALM_APP_INSTALLS" ("ALM_ID", "OWNER_ID");
-CREATE UNIQUE INDEX "ALM_APP_INSTALLS_INSTALL" ON "ALM_APP_INSTALLS" ("ALM_ID", "INSTALL_ID");
-CREATE INDEX "ALM_APP_INSTALLS_EXTERNAL_ID" ON "ALM_APP_INSTALLS" ("USER_EXTERNAL_ID");
-
-CREATE TABLE "PROJECT_ALM_BINDINGS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "ALM_ID" VARCHAR(40) NOT NULL,
-  "REPO_ID" VARCHAR(256) NOT NULL,
-  "PROJECT_UUID" VARCHAR(40) NOT NULL,
-  "GITHUB_SLUG" VARCHAR(256) NULL,
-  "URL" VARCHAR(2000) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-  CONSTRAINT "PK_PROJECT_ALM_BINDINGS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "PROJECT_ALM_BINDINGS_ALM_REPO" ON "PROJECT_ALM_BINDINGS" ("ALM_ID", "REPO_ID");
-CREATE UNIQUE INDEX "PROJECT_ALM_BINDINGS_PROJECT" ON "PROJECT_ALM_BINDINGS" ("PROJECT_UUID");
-
-CREATE TABLE "PROJECT_MAPPINGS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "KEY_TYPE" VARCHAR(200) NOT NULL,
-  "KEE" VARCHAR(4000) NOT NULL,
-  "PROJECT_UUID" VARCHAR(40) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  CONSTRAINT "PK_PROJECT_MAPPINGS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "KEY_TYPE_KEE" ON "PROJECT_MAPPINGS" ("KEY_TYPE", "KEE");
-CREATE INDEX "PROJECT_UUID" ON "PROJECT_MAPPINGS" ("PROJECT_UUID");
-
-CREATE TABLE "ORGANIZATION_ALM_BINDINGS" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "ORGANIZATION_UUID" VARCHAR(40) NOT NULL,
-  "ALM_APP_INSTALL_UUID" VARCHAR(40) NOT NULL,
-  "ALM_ID" VARCHAR(40) NOT NULL,
-  "URL" VARCHAR(2000) NOT NULL,
-  "USER_UUID" VARCHAR(255) NOT NULL,
-  "MEMBERS_SYNC_ENABLED" BOOLEAN,
-  "CREATED_AT" BIGINT NOT NULL,
-  CONSTRAINT "PK_ORGANIZATION_ALM_BINDINGS" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "ORG_ALM_BINDINGS_ORG" ON "ORGANIZATION_ALM_BINDINGS" ("ORGANIZATION_UUID");
-CREATE UNIQUE INDEX "ORG_ALM_BINDINGS_INSTALL" ON "ORGANIZATION_ALM_BINDINGS" ("ALM_APP_INSTALL_UUID");
-
-CREATE TABLE "USER_PROPERTIES" (
-  "UUID" VARCHAR(40) NOT NULL,
-  "USER_UUID" VARCHAR(255) NOT NULL,
-  "KEE" VARCHAR(100) NOT NULL,
-  "TEXT_VALUE" VARCHAR(4000) NOT NULL,
-  "CREATED_AT" BIGINT NOT NULL,
-  "UPDATED_AT" BIGINT NOT NULL,
-
-  CONSTRAINT "PK_USER_PROPERTIES" PRIMARY KEY ("UUID")
-);
-CREATE UNIQUE INDEX "USER_PROPERTIES_USER_UUID_KEE" ON "USER_PROPERTIES" ("USER_UUID", "KEE");
index a54d45ec9e0daae648ee3a620a86d6c736c8aa97..7327cacb0f21da4bdcf9f7a2884535ec7366b3bd 100644 (file)
  */
 package org.sonar.server.platform.db.migration;
 
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import org.apache.commons.dbutils.DbUtils;
 import org.picocontainer.Startable;
-import org.sonar.api.SonarRuntime;
-import org.sonar.api.utils.System2;
 import org.sonar.api.utils.log.Loggers;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-import org.sonar.db.DdlUtils;
-import org.sonar.db.dialect.Dialect;
-import org.sonar.db.dialect.H2;
 import org.sonar.server.platform.DefaultServerUpgradeStatus;
 import org.sonar.server.platform.db.migration.engine.MigrationEngine;
-import org.sonar.server.platform.db.migration.step.MigrationSteps;
 
-import static org.sonar.server.property.InternalProperties.INSTALLATION_DATE;
-import static org.sonar.server.property.InternalProperties.INSTALLATION_VERSION;
-
-/**
- * FIXME fix this class to remove use of CoreDdlUtils.createSchema
- */
 public class AutoDbMigration implements Startable {
   private final DefaultServerUpgradeStatus serverUpgradeStatus;
-  private final DbClient dbClient;
   private final MigrationEngine migrationEngine;
-  private final MigrationSteps migrationSteps;
-  private final SonarRuntime sonarRuntime;
-  private final System2 system2;
 
-  public AutoDbMigration(DefaultServerUpgradeStatus serverUpgradeStatus, DbClient dbClient, MigrationEngine migrationEngine, MigrationSteps migrationSteps,
-    SonarRuntime sonarRuntime, System2 system2) {
+  public AutoDbMigration(DefaultServerUpgradeStatus serverUpgradeStatus, MigrationEngine migrationEngine) {
     this.serverUpgradeStatus = serverUpgradeStatus;
-    this.dbClient = dbClient;
     this.migrationEngine = migrationEngine;
-    this.migrationSteps = migrationSteps;
-    this.sonarRuntime = sonarRuntime;
-    this.system2 = system2;
-  }
-
-  private static void populateSchemaMigration(Connection connection, long maxMigrationNumber) {
-    try (PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES (?)")) {
-      batchExecute(
-        0, maxMigrationNumber + 1,
-        preparedStatement, connection,
-        (statement, counter) -> statement.setString(1, String.valueOf(counter)));
-    } catch (SQLException e) {
-      throw new RuntimeException("Failed to insert rows into table SCHEMA_MIGRATIONS", e);
-    }
-  }
-
-  /**
-   * see SONAR-8586
-   */
-  private static void hackFixForProjectMeasureTreeQueries(Connection connection) {
-    int metricId = 1;
-    try (PreparedStatement preparedStatement = connection.prepareStatement("insert into PROJECT_MEASURES (METRIC_ID,COMPONENT_UUID,ANALYSIS_UUID) values (?,?,?);")) {
-      batchExecute(
-        1, 1000,
-        preparedStatement, connection,
-        (stmt, counter) -> {
-          preparedStatement.setInt(1, metricId);
-          preparedStatement.setString(2, "foo_" + counter);
-          preparedStatement.setString(3, "bar_" + counter);
-        });
-    } catch (SQLException e) {
-      throw new RuntimeException("Failed to insert fake rows into table PROJECT_MEASURES", e);
-    }
-  }
-
-  /**
-   * @param start included
-   * @param end excluded
-   */
-  private static void batchExecute(long start, long end,
-    PreparedStatement preparedStatement, Connection connection,
-    Preparer preparer) throws SQLException {
-    for (long i = start; i < end; i++) {
-      preparer.prepare(preparedStatement, i);
-      preparedStatement.addBatch();
-      if (i % 250 == 0) {
-        preparedStatement.executeBatch();
-        connection.commit();
-      }
-    }
-    preparedStatement.executeBatch();
-    connection.commit();
   }
 
   @Override
   public void start() {
     if (serverUpgradeStatus.isFreshInstall()) {
       Loggers.get(getClass()).info("Automatically perform DB migration on fresh install");
-      Dialect dialect = dbClient.getDatabase().getDialect();
-      if (H2.ID.equals(dialect.getId())) {
-        installH2();
-      } else {
-        migrationEngine.execute();
-      }
+      migrationEngine.execute();
     } else if (serverUpgradeStatus.isUpgraded() && serverUpgradeStatus.isBlueGreen()) {
       Loggers.get(getClass()).info("Automatically perform DB migration on blue/green deployment");
       migrationEngine.execute();
     }
   }
 
-  @VisibleForTesting
-  void installH2() {
-    Connection connection = null;
-    try (DbSession session = dbClient.openSession(false)) {
-      connection = session.getConnection();
-      createH2Schema(connection, dbClient.getDatabase().getDialect().getId());
-    } finally {
-      DbUtils.closeQuietly(connection);
-    }
-  }
-
-  @VisibleForTesting
-  protected void createH2Schema(Connection connection, String dialectId) {
-    DdlUtils.createSchema(connection, dialectId, false);
-    populateInstallDateAndVersion(connection);
-    populateSchemaMigration(connection, migrationSteps.getMaxMigrationNumber());
-    hackFixForProjectMeasureTreeQueries(connection);
-  }
-
-  private void populateInstallDateAndVersion(Connection connection) {
-    insertInternalProperty(connection, INSTALLATION_DATE, String.valueOf(system2.now()));
-    insertInternalProperty(connection, INSTALLATION_VERSION, sonarRuntime.getApiVersion().toString());
-  }
-
-  private void insertInternalProperty(Connection connection, String key, String value) {
-    try (PreparedStatement preparedStatementDate = connection
-      .prepareStatement("insert into internal_properties (kee, is_empty, text_value, clob_value, created_at) values (?, ?, ?, ?, ?)")) {
-      preparedStatementDate.setString(1, key);
-      preparedStatementDate.setBoolean(2, false);
-      preparedStatementDate.setString(3, value);
-      preparedStatementDate.setString(4, null);
-      preparedStatementDate.setLong(5, system2.now());
-      preparedStatementDate.execute();
-    } catch (SQLException e) {
-      throw new RuntimeException("Failed to insert internal properties " + key, e);
-    }
-  }
-
   @Override
   public void stop() {
     // nothing to do
   }
 
-  @FunctionalInterface
-  private interface Preparer {
-    void prepare(PreparedStatement statement, long counter) throws SQLException;
-  }
 }
diff --git a/server/sonar-server/src/test/java/org/sonar/server/platform/db/migration/AutoDbMigrationH2Test.java b/server/sonar-server/src/test/java/org/sonar/server/platform/db/migration/AutoDbMigrationH2Test.java
deleted file mode 100644 (file)
index 991eaf5..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.assertj.core.api.Assertions;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.sonar.api.SonarRuntime;
-import org.sonar.api.utils.System2;
-import org.sonar.api.utils.Version;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-import org.sonar.db.H2Database;
-import org.sonar.db.dialect.H2;
-import org.sonar.server.platform.DefaultServerUpgradeStatus;
-import org.sonar.server.platform.db.migration.engine.MigrationEngine;
-import org.sonar.server.platform.db.migration.history.MigrationHistoryTableImpl;
-import org.sonar.server.platform.db.migration.step.MigrationSteps;
-import org.sonar.server.property.InternalProperties;
-
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class AutoDbMigrationH2Test {
-
-  private DbClient dbClient = mock(DbClient.class, Mockito.RETURNS_DEEP_STUBS);
-  private DefaultServerUpgradeStatus serverUpgradeStatus = mock(DefaultServerUpgradeStatus.class);
-  private MigrationEngine migrationEngine = mock(MigrationEngine.class);
-  private MigrationSteps migrationSteps = mock(MigrationSteps.class);
-  private SonarRuntime sonarRuntime = mock(SonarRuntime.class);
-  private System2 system2 = mock(System2.class);
-
-  private AutoDbMigration underTest = new AutoDbMigration(serverUpgradeStatus, dbClient, migrationEngine, migrationSteps, sonarRuntime, system2);
-
-
-  @Test
-  public void testInstallH2() throws SQLException {
-    DbSession dbSession = mock(DbSession.class);
-    when(dbClient.getDatabase().getDialect()).thenReturn(new H2());
-    when(dbClient.openSession(anyBoolean())).thenReturn(dbSession);
-    when(system2.now()).thenReturn(123456789L);
-    H2Database db = new H2Database("sonar", false);
-    db.start();
-    Connection connection = db.getDataSource().getConnection();
-    when(dbSession.getConnection()).thenReturn(connection);
-    Version version = Version.create(7, 9, 0);
-    when(sonarRuntime.getApiVersion()).thenReturn(version);
-    new MigrationHistoryTableImpl(db).start();
-
-    underTest.installH2();
-
-    String selectInstallVersion = "select text_value from internal_properties where kee = '" + InternalProperties.INSTALLATION_VERSION + "'";
-    ResultSet resultSetVersion = db.getDataSource().getConnection().prepareStatement(selectInstallVersion).executeQuery();
-    resultSetVersion.next();
-    Assertions.assertThat(resultSetVersion.getString(1)).isEqualTo("7.9");
-
-    String selectInstallDate = "select text_value from internal_properties where kee = '" + InternalProperties.INSTALLATION_DATE + "'";
-    ResultSet resultSetDate = db.getDataSource().getConnection().prepareStatement(selectInstallDate).executeQuery();
-    resultSetDate.next();
-    Assertions.assertThat(resultSetDate.getString(1)).isEqualTo("123456789");
-  }
-
-}
index 5fd2bbdf8479328fde5f3518e8b8914e07005f0e..1c8d50cd7f540ca41183c5656b4675ab265f3fc9 100644 (file)
  */
 package org.sonar.server.platform.db.migration;
 
-import java.sql.Connection;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.Mockito;
-import org.sonar.api.SonarRuntime;
-import org.sonar.api.utils.System2;
 import org.sonar.api.utils.log.LogTester;
 import org.sonar.api.utils.log.LoggerLevel;
 import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
 import org.sonar.db.dialect.Dialect;
 import org.sonar.db.dialect.H2;
 import org.sonar.db.dialect.MsSql;
@@ -37,13 +33,10 @@ import org.sonar.db.dialect.Oracle;
 import org.sonar.db.dialect.PostgreSql;
 import org.sonar.server.platform.DefaultServerUpgradeStatus;
 import org.sonar.server.platform.db.migration.engine.MigrationEngine;
-import org.sonar.server.platform.db.migration.step.MigrationSteps;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
@@ -56,28 +49,11 @@ public class AutoDbMigrationTest {
   private DbClient dbClient = mock(DbClient.class, Mockito.RETURNS_DEEP_STUBS);
   private DefaultServerUpgradeStatus serverUpgradeStatus = mock(DefaultServerUpgradeStatus.class);
   private MigrationEngine migrationEngine = mock(MigrationEngine.class);
-  private MigrationSteps migrationSteps = mock(MigrationSteps.class);
-  private SonarRuntime sonarRuntime = mock(SonarRuntime.class);
-  private System2 system2 = mock(System2.class);
-  private AutoDbMigration underTest = new AutoDbMigration(serverUpgradeStatus, dbClient, migrationEngine, migrationSteps, sonarRuntime, system2);
-
-  private AutoDbMigration noRealH2Creation = spy(new AutoDbMigration(serverUpgradeStatus, dbClient, migrationEngine, migrationSteps, sonarRuntime, system2) {
-    @Override
-    protected void createH2Schema(Connection connection, String dialectId) {
-      // do nothing
-    }
-  });
+  private AutoDbMigration underTest = new AutoDbMigration(serverUpgradeStatus, migrationEngine);
 
   @Test
-  public void start_creates_schema_on_h2_if_fresh_install() {
-    mockDialect(new H2());
-    mockDbClientOpenSession();
-    mockFreshInstall(true);
-
-    noRealH2Creation.start();
-
-    verify(noRealH2Creation).installH2();
-    verifyInfoLog();
+  public void start_runs_MigrationEngine_on_h2_if_fresh_install() {
+    start_runs_MigrationEngine_for_dialect_if_fresh_install(new H2());
   }
 
   @Test
@@ -109,10 +85,8 @@ public class AutoDbMigrationTest {
   public void start_does_nothing_if_not_fresh_install() {
     mockFreshInstall(false);
 
-    noRealH2Creation.start();
+    underTest.start();
 
-    verify(noRealH2Creation).start();
-    verifyNoMoreInteractions(noRealH2Creation);
     verifyZeroInteractions(migrationEngine);
     assertThat(logTester.logs(LoggerLevel.INFO)).isEmpty();
   }
@@ -154,13 +128,6 @@ public class AutoDbMigrationTest {
     when(dbClient.getDatabase().getDialect()).thenReturn(dialect);
   }
 
-  private void mockDbClientOpenSession() {
-    Connection connection = mock(Connection.class);
-    DbSession session = mock(DbSession.class);
-    when(session.getConnection()).thenReturn(connection);
-    when(dbClient.openSession(false)).thenReturn(session);
-  }
-
   private void verifyInfoLog() {
     assertThat(logTester.logs()).hasSize(1);
     assertThat(logTester.logs(LoggerLevel.INFO)).containsExactly("Automatically perform DB migration on fresh install");