aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-db-core
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@sonarsource.com>2018-10-28 23:16:26 +0100
committerSonarTech <sonartech@sonarsource.com>2018-10-30 20:21:25 +0100
commit25df443fe40c3edbcbb898f7a8cac16a3511831c (patch)
tree11244d9a22ae5fdcdf29607d0c935f0ae19fefc2 /server/sonar-db-core
parent7b3b28511a7c7cef0622af1307ab08ed700a90b6 (diff)
downloadsonarqube-25df443fe40c3edbcbb898f7a8cac16a3511831c.tar.gz
sonarqube-25df443fe40c3edbcbb898f7a8cac16a3511831c.zip
SONARCLOUD-161 add Dialect#supportsUpsert(), true only on postgreSQL
Diffstat (limited to 'server/sonar-db-core')
-rw-r--r--server/sonar-db-core/src/main/java/org/sonar/db/dialect/AbstractDialect.java5
-rw-r--r--server/sonar-db-core/src/main/java/org/sonar/db/dialect/Dialect.java2
-rw-r--r--server/sonar-db-core/src/main/java/org/sonar/db/dialect/PostgreSql.java24
-rw-r--r--server/sonar-db-core/src/test/java/org/sonar/db/dialect/H2Test.java5
-rw-r--r--server/sonar-db-core/src/test/java/org/sonar/db/dialect/MsSqlTest.java5
-rw-r--r--server/sonar-db-core/src/test/java/org/sonar/db/dialect/MySqlTest.java5
-rw-r--r--server/sonar-db-core/src/test/java/org/sonar/db/dialect/OracleTest.java5
-rw-r--r--server/sonar-db-core/src/test/java/org/sonar/db/dialect/PostgreSqlTest.java39
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 {