diff options
author | Simon Brandhof <simon.brandhof@sonarsource.com> | 2018-10-28 23:16:26 +0100 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2018-10-30 20:21:25 +0100 |
commit | 25df443fe40c3edbcbb898f7a8cac16a3511831c (patch) | |
tree | 11244d9a22ae5fdcdf29607d0c935f0ae19fefc2 /server/sonar-db-core | |
parent | 7b3b28511a7c7cef0622af1307ab08ed700a90b6 (diff) | |
download | sonarqube-25df443fe40c3edbcbb898f7a8cac16a3511831c.tar.gz sonarqube-25df443fe40c3edbcbb898f7a8cac16a3511831c.zip |
SONARCLOUD-161 add Dialect#supportsUpsert(), true only on postgreSQL
Diffstat (limited to 'server/sonar-db-core')
8 files changed, 87 insertions, 3 deletions
diff --git a/server/sonar-db-core/src/main/java/org/sonar/db/dialect/AbstractDialect.java b/server/sonar-db-core/src/main/java/org/sonar/db/dialect/AbstractDialect.java index f4f738aa5de..0959ff1c390 100644 --- a/server/sonar-db-core/src/main/java/org/sonar/db/dialect/AbstractDialect.java +++ b/server/sonar-db-core/src/main/java/org/sonar/db/dialect/AbstractDialect.java @@ -87,6 +87,11 @@ abstract class AbstractDialect implements Dialect { return 1; } + @Override + public boolean supportsUpsert() { + return false; + } + Version checkDbVersion(DatabaseMetaData metaData, Version minSupported) throws SQLException { int major = metaData.getDatabaseMajorVersion(); int minor = metaData.getDatabaseMinorVersion(); diff --git a/server/sonar-db-core/src/main/java/org/sonar/db/dialect/Dialect.java b/server/sonar-db-core/src/main/java/org/sonar/db/dialect/Dialect.java index 42278d51111..44ad59239cd 100644 --- a/server/sonar-db-core/src/main/java/org/sonar/db/dialect/Dialect.java +++ b/server/sonar-db-core/src/main/java/org/sonar/db/dialect/Dialect.java @@ -64,6 +64,8 @@ public interface Dialect { */ boolean supportsMigration(); + boolean supportsUpsert(); + /** * This method is called when connecting for the first * time to the database. diff --git a/server/sonar-db-core/src/main/java/org/sonar/db/dialect/PostgreSql.java b/server/sonar-db-core/src/main/java/org/sonar/db/dialect/PostgreSql.java index f80169aef21..5613e13fc83 100644 --- a/server/sonar-db-core/src/main/java/org/sonar/db/dialect/PostgreSql.java +++ b/server/sonar-db-core/src/main/java/org/sonar/db/dialect/PostgreSql.java @@ -25,12 +25,19 @@ import java.sql.SQLException; import java.util.List; import org.apache.commons.lang.StringUtils; import org.sonar.api.utils.Version; +import org.sonar.api.utils.log.Loggers; + +import static com.google.common.base.Preconditions.checkState; public class PostgreSql extends AbstractDialect { public static final String ID = "postgresql"; static final List<String> INIT_STATEMENTS = ImmutableList.of("SET standard_conforming_strings=on", "SET backslash_quote=off"); private static final Version MIN_SUPPORTED_VERSION = Version.create(9, 3, 0); + private static final Version MIN_UPSERT_VERSION = Version.create(9, 5, 0); + + private boolean initialized = false; + private boolean supportsUpsert = false; public PostgreSql() { super(ID, "org.postgresql.Driver", "true", "false", "SELECT 1"); @@ -52,7 +59,22 @@ public class PostgreSql extends AbstractDialect { } @Override + public boolean supportsUpsert() { + checkState(initialized, "onInit() must be called before calling supportsUpsert()"); + return supportsUpsert; + } + + @Override public void init(DatabaseMetaData metaData) throws SQLException { - checkDbVersion(metaData, MIN_SUPPORTED_VERSION); + checkState(!initialized, "onInit() must be called once"); + + Version version = checkDbVersion(metaData, MIN_SUPPORTED_VERSION); + + supportsUpsert = version.compareTo(MIN_UPSERT_VERSION) >= 0; + if (!supportsUpsert) { + Loggers.get(getClass()).warn("Upgrading PostgreSQL to {} or greater is recommended for better performances", MIN_UPSERT_VERSION); + } + + initialized = true; } } diff --git a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/H2Test.java b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/H2Test.java index b208e97e984..246739ae3d6 100644 --- a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/H2Test.java +++ b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/H2Test.java @@ -75,4 +75,9 @@ public class H2Test { assertThat(logs.logs(LoggerLevel.WARN)).contains("H2 database should be used for evaluation purpose only."); } + + @Test + public void supportsUpsert_returns_false() { + assertThat(underTest.supportsUpsert()).isFalse(); + } } diff --git a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/MsSqlTest.java b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/MsSqlTest.java index ba4a9a5836f..973520d7f4b 100644 --- a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/MsSqlTest.java +++ b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/MsSqlTest.java @@ -90,6 +90,11 @@ public class MsSqlTest { underTest.init(metadata); } + @Test + public void supportsUpsert_returns_false() { + assertThat(underTest.supportsUpsert()).isFalse(); + } + private DatabaseMetaData newMetadata(int dbMajorVersion, int dbMinorVersion) throws SQLException { DatabaseMetaData metadata = mock(DatabaseMetaData.class, Mockito.RETURNS_DEEP_STUBS); when(metadata.getDatabaseMajorVersion()).thenReturn(dbMajorVersion); diff --git a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/MySqlTest.java b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/MySqlTest.java index de15828f258..e6d80631dbe 100644 --- a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/MySqlTest.java +++ b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/MySqlTest.java @@ -102,6 +102,11 @@ public class MySqlTest { assertThat(logs.logs(LoggerLevel.WARN)).contains("MySQL support is deprecated and will be dropped soon."); } + @Test + public void supportsUpsert_returns_false() { + assertThat(underTest.supportsUpsert()).isFalse(); + } + private DatabaseMetaData newMetadata(int dbMajorVersion, int dbMinorVersion) throws SQLException { DatabaseMetaData metadata = mock(DatabaseMetaData.class, Mockito.RETURNS_DEEP_STUBS); when(metadata.getDatabaseMajorVersion()).thenReturn(dbMajorVersion); diff --git a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/OracleTest.java b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/OracleTest.java index e0725a0d0a0..2eb3564b20f 100644 --- a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/OracleTest.java +++ b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/OracleTest.java @@ -131,6 +131,11 @@ public class OracleTest { } } + @Test + public void supportsUpsert_returns_false() { + assertThat(underTest.supportsUpsert()).isFalse(); + } + private DatabaseMetaData newMetadata(int dbMajorVersion, int dbMinorVersion, String driverVersion) throws SQLException { DatabaseMetaData metadata = mock(DatabaseMetaData.class, Mockito.RETURNS_DEEP_STUBS); when(metadata.getDatabaseMajorVersion()).thenReturn(dbMajorVersion); diff --git a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/PostgreSqlTest.java b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/PostgreSqlTest.java index 3e1b7b065a4..d911c5dce8e 100644 --- a/server/sonar-db-core/src/test/java/org/sonar/db/dialect/PostgreSqlTest.java +++ b/server/sonar-db-core/src/test/java/org/sonar/db/dialect/PostgreSqlTest.java @@ -26,6 +26,8 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.Mockito; import org.sonar.api.utils.MessageException; +import org.sonar.api.utils.log.LogTester; +import org.sonar.api.utils.log.LoggerLevel; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -35,6 +37,8 @@ public class PostgreSqlTest { @Rule public ExpectedException expectedException = ExpectedException.none(); + @Rule + public LogTester logs = new LogTester(); private PostgreSql underTest = new PostgreSql(); @@ -78,7 +82,7 @@ public class PostgreSqlTest { } @Test - public void init_throws_MessageException_if_postgresql_9_2() throws Exception { + public void postgresql_9_2_is_not_supported() throws Exception { expectedException.expect(MessageException.class); expectedException.expectMessage("Unsupported postgresql version: 9.2. Minimal supported version is 9.3."); @@ -87,9 +91,40 @@ public class PostgreSqlTest { } @Test - public void init_does_not_fail_if_postgresql_9_3() throws Exception { + public void postgresql_9_3_is_supported_without_upsert() throws Exception { DatabaseMetaData metadata = newMetadata( 9, 3); underTest.init(metadata); + + assertThat(underTest.supportsUpsert()).isFalse(); + assertThat(logs.logs(LoggerLevel.WARN)).contains("Upgrading PostgreSQL to 9.5 or greater is recommended for better performances"); + } + + @Test + public void postgresql_9_5_is_supported_with_upsert() throws Exception { + DatabaseMetaData metadata = newMetadata( 9, 5); + underTest.init(metadata); + + assertThat(underTest.supportsUpsert()).isTrue(); + assertThat(logs.logs(LoggerLevel.WARN)).isEmpty(); + } + + @Test + public void init_throws_ISE_if_called_twice() throws Exception { + DatabaseMetaData metaData = newMetadata(9, 5); + underTest.init(metaData); + + expectedException.expect(IllegalStateException.class); + expectedException.expectMessage("onInit() must be called once"); + + underTest.init(metaData); + } + + @Test + public void supportsUpsert_throws_ISE_if_not_initialized() { + expectedException.expect(IllegalStateException.class); + expectedException.expectMessage("onInit() must be called before calling supportsUpsert()"); + + underTest.supportsUpsert(); } private DatabaseMetaData newMetadata(int dbMajorVersion, int dbMinorVersion) throws SQLException { |