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)
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db;
-
-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;
- }
-}
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
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db;
-
-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();
- }
-}
*/
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;
}
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 {
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;
}
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) -> {
};
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());
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'
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
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db;
-
-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");
- }
-}
+++ /dev/null
-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);
+++ /dev/null
-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");
+++ /dev/null
-CREATE TABLE "SCHEMA_MIGRATIONS" (
- "VERSION" VARCHAR(256) NOT NULL
-);
-CREATE INDEX "UNIQUE_SCHEMA_MIGRATIONS" ON "SCHEMA_MIGRATIONS" ("VERSION");
--- /dev/null
+###############################################################
+#### 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);
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db;
-
-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();
- }
- }
-
-}
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 {
}
}
- 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
+ }
}
}
package org.sonar.db;
import java.sql.Connection;
+import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.After;
import org.junit.Before;
@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;
+ }
}
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;
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)) {
}
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);
}
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);
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.db.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);
+ }
+ }
+
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.db.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();
+ }
+}
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 {
protected void configureModule() {
add(
// DbVersion implementations
- DbVersion79.class,
+ DbVersion00.class,
DbVersion80.class,
// migration steps
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;
*/
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);
}
@Override
public final void execute() throws SQLException {
try (Connection writeConnection = createDdlConnection()) {
- Context context = new Context(writeConnection);
+ Context context = new ContextImpl(writeConnection);
execute(context);
}
}
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();
}
}
- 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);
}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.platform.db.migration.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);
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.platform.db.migration.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);
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.platform.db.migration.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();
+ }
+
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+@ParametersAreNonnullByDefault
+package org.sonar.server.platform.db.migration.version.v00;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.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);
- }
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.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);
- }
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.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();
- }
-
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v79;
-
-import javax.annotation.ParametersAreNonnullByDefault;
-
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 {
@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);
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.platform.db.migration.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");
+ }
+
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.platform.db.migration.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);
+ }
+
+
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.platform.db.migration.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");
+ }
+
+}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.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");
- }
-
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.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);
- }
-
-
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.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");
- }
-
-}
--- /dev/null
+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");
+++ /dev/null
-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");
*/
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;
- }
}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2019 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration;
-
-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");
- }
-
-}
*/
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;
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;
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
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();
}
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");