diff options
Diffstat (limited to 'server/sonar-db-dao/src')
6 files changed, 8 insertions, 233 deletions
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/MyBatisIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/MyBatisIT.java index d4db5c5ceae..616d30862f6 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/MyBatisIT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/MyBatisIT.java @@ -34,7 +34,7 @@ public class MyBatisIT { @BeforeClass public static void start() { - database = SQDatabase.newH2Database("sonar2", true); + database = new SQDatabase.Builder().asH2Database("sonar2").createSchema(true).build(); database.start(); } diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/SQDatabaseForH2IT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/SQDatabaseForH2IT.java index 732beddd367..8985b5d7cc3 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/SQDatabaseForH2IT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/SQDatabaseForH2IT.java @@ -29,7 +29,7 @@ import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; public class SQDatabaseForH2IT { - SQDatabase db = SQDatabase.newH2Database("sonar2", true); + SQDatabase db = new SQDatabase.Builder().asH2Database("sonar2").createSchema(true).build(); @Before public void startDb() { diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/createdb/CreateDb.java b/server/sonar-db-dao/src/test/java/org/sonar/db/createdb/CreateDb.java index 69701ca7595..986839abd77 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/createdb/CreateDb.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/createdb/CreateDb.java @@ -24,10 +24,10 @@ import com.sonar.orchestrator.db.DatabaseClient; import com.sonar.orchestrator.db.DatabaseFactory; import com.sonar.orchestrator.db.DefaultDatabase; import java.util.function.Consumer; -import org.sonar.api.config.internal.MapSettings; -import org.sonar.api.config.internal.Settings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.sonar.api.config.internal.MapSettings; +import org.sonar.api.config.internal.Settings; import org.sonar.db.SQDatabase; public class CreateDb { @@ -37,7 +37,7 @@ public class CreateDb { Settings settings = new MapSettings(); configuration.asMap().forEach(settings::setProperty); logJdbcSettings(settings); - SQDatabase.newDatabase(settings, true).start(); + new SQDatabase.Builder().createSchema(true).withSettings(settings).build().start(); }); } diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/dump/SQSchemaDumper.java b/server/sonar-db-dao/src/test/java/org/sonar/db/dump/SQSchemaDumper.java index de7f2b31f25..4a11252538b 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/dump/SQSchemaDumper.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/dump/SQSchemaDumper.java @@ -55,7 +55,8 @@ class SQSchemaDumper { }).thenComparing(String.CASE_INSENSITIVE_ORDER); String dumpToText() throws SQLException { - SQDatabase database = SQDatabase.newH2Database("SQSchemaDumper", true); + + SQDatabase database = new SQDatabase.Builder().asH2Database("SQSchemaDumper").createSchema(true).build(); database.start(); try (Connection connection = database.getDataSource().getConnection(); diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/SQDatabase.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/SQDatabase.java deleted file mode 100644 index 4a3485c6c06..00000000000 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/SQDatabase.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2023 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 java.sql.SQLException; -import java.util.List; -import javax.sql.DataSource; -import org.apache.commons.io.output.NullWriter; -import org.apache.ibatis.io.Resources; -import org.apache.ibatis.jdbc.ScriptRunner; -import org.sonar.api.config.internal.MapSettings; -import org.sonar.api.config.internal.Settings; -import org.sonar.api.utils.System2; -import org.sonar.api.utils.Version; -import org.slf4j.LoggerFactory; -import org.sonar.core.platform.Container; -import org.sonar.core.platform.SonarQubeVersion; -import org.sonar.core.platform.SpringComponentContainer; -import org.sonar.core.util.UuidFactoryFast; -import org.sonar.core.util.logs.Profiler; -import org.sonar.db.dialect.Dialect; -import org.sonar.process.logging.LogbackHelper; -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.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 static com.google.common.base.Preconditions.checkState; - -public class SQDatabase extends DefaultDatabase { - private static final String IGNORED_KEYWORDS_OPTION = ";NON_KEYWORDS=VALUE"; - private final boolean createSchema; - - private SQDatabase(Settings settings, boolean createSchema) { - super(new LogbackHelper(), settings); - this.createSchema = createSchema; - } - - public static SQDatabase newDatabase(Settings settings, boolean createSchema) { - return new SQDatabase(settings, createSchema); - } - - public static SQDatabase newH2Database(String name, boolean createSchema) { - MapSettings settings = new MapSettings() - .setProperty("sonar.jdbc.dialect", "h2") - .setProperty("sonar.jdbc.driverClassName", "org.h2.Driver") - .setProperty("sonar.jdbc.url", "jdbc:h2:mem:" + name + IGNORED_KEYWORDS_OPTION) - .setProperty("sonar.jdbc.username", "sonar") - .setProperty("sonar.jdbc.password", "sonar"); - return new SQDatabase(settings, createSchema); - } - - @Override - public void start() { - super.start(); - if (createSchema) { - createSchema(); - } - } - - private void createSchema() { - Connection connection = null; - try { - connection = getDataSource().getConnection(); - NoopDatabase noopDatabase = new NoopDatabase(getDialect(), getDataSource()); - // create and populate schema - createMigrationHistoryTable(noopDatabase); - executeDbMigrations(noopDatabase); - } catch (SQLException e) { - throw new IllegalStateException("Fail to create schema", e); - } finally { - DatabaseUtils.closeQuietly(connection); - } - } - - public static final class H2StepExecutor implements MigrationStepsExecutor { - private static final String STEP_START_PATTERN = "{}..."; - private static final String STEP_STOP_PATTERN = "{}: {}"; - - private final Container container; - - public H2StepExecutor(Container container) { - this.container = container; - } - - @Override - public void execute(List<RegisteredMigrationStep> steps) { - steps.forEach(step -> execute(step, container)); - } - - private void execute(RegisteredMigrationStep step, Container container) { - MigrationStep migrationStep = container.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(LoggerFactory.getLogger(SQDatabase.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"); - } - } - } - } - - private void executeDbMigrations(NoopDatabase noopDatabase) { - SpringComponentContainer container = new SpringComponentContainer(); - container.add(noopDatabase); - MigrationConfigurationModule migrationConfigurationModule = new MigrationConfigurationModule(); - migrationConfigurationModule.configure(container); - - // dependencies required by DB migrations - container.add(new SonarQubeVersion(Version.create(8, 0))); - container.add(UuidFactoryFast.getInstance()); - container.add(System2.INSTANCE); - container.add(MapSettings.class); - - container.startComponents(); - MigrationContainer migrationContainer = new MigrationContainerImpl(container, H2StepExecutor.class); - MigrationSteps migrationSteps = migrationContainer.getComponentByType(MigrationSteps.class); - MigrationStepsExecutor executor = migrationContainer.getComponentByType(MigrationStepsExecutor.class); - - executor.execute(migrationSteps.readAll()); - } - - private void createMigrationHistoryTable(NoopDatabase noopDatabase) { - new MigrationHistoryTableImpl(noopDatabase).start(); - } - - private static class NoopDatabase implements Database { - private final Dialect dialect; - private final DataSource dataSource; - - private NoopDatabase(Dialect dialect, DataSource dataSource) { - this.dialect = dialect; - this.dataSource = dataSource; - } - - @Override - public DataSource getDataSource() { - return dataSource; - } - - @Override - public Dialect getDialect() { - return dialect; - } - - @Override - public void enableSqlLogging(boolean enable) { - - } - - @Override - public void start() { - // do nothing - } - - @Override - public void stop() { - // do nothing - } - } - - public void executeScript(String classloaderPath) { - try (Connection connection = getDataSource().getConnection()) { - executeScript(connection, classloaderPath); - } catch (SQLException e) { - throw new IllegalStateException("Fail to execute script: " + classloaderPath, e); - } - } - - 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; - } -} diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/TestDbImpl.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/TestDbImpl.java index 874c7d26556..dc958cb32f7 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/TestDbImpl.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/TestDbImpl.java @@ -62,7 +62,7 @@ class TestDbImpl extends CoreTestDb { if (dialect != null && !"h2".equals(dialect)) { return new DefaultDatabase(new LogbackHelper(), settings); } - return SQDatabase.newH2Database("h2Tests" + DigestUtils.md5Hex(StringUtils.defaultString(schemaPath)), schemaPath == null); + return new SQDatabase.Builder().asH2Database("h2Tests" + DigestUtils.md5Hex(StringUtils.defaultString(schemaPath))).createSchema(schemaPath == null).build(); }; Consumer<Database> schemaPathExecutor = database -> { if (schemaPath == null) { |