aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-db-core/src
diff options
context:
space:
mode:
authorEric Hartmann <hartmann.eric@gmail.com>2018-08-29 19:05:01 +0200
committerSonarTech <sonartech@sonarsource.com>2018-09-07 20:20:56 +0200
commit1c7800cc1eb2efb6cdace6c25e149c9eb0021c51 (patch)
tree65391152c462a984adb78ab970a50fe0dea9b4af /server/sonar-db-core/src
parent8a2e91102485cb8737352b49bc0c8750e068bd79 (diff)
downloadsonarqube-1c7800cc1eb2efb6cdace6c25e149c9eb0021c51.tar.gz
sonarqube-1c7800cc1eb2efb6cdace6c25e149c9eb0021c51.zip
Use the underlying connection to determine schema
Diffstat (limited to 'server/sonar-db-core/src')
-rw-r--r--server/sonar-db-core/src/main/java/org/sonar/db/DatabaseUtils.java26
-rw-r--r--server/sonar-db-core/src/main/java/org/sonar/db/DefaultDatabase.java3
-rw-r--r--server/sonar-db-core/src/test/java/org/sonar/db/DatabaseUtilsTest.java39
3 files changed, 54 insertions, 14 deletions
diff --git a/server/sonar-db-core/src/main/java/org/sonar/db/DatabaseUtils.java b/server/sonar-db-core/src/main/java/org/sonar/db/DatabaseUtils.java
index eaca483020b..79ba984c3fe 100644
--- a/server/sonar-db-core/src/main/java/org/sonar/db/DatabaseUtils.java
+++ b/server/sonar-db-core/src/main/java/org/sonar/db/DatabaseUtils.java
@@ -317,21 +317,21 @@ public class DatabaseUtils {
}
private static boolean doTableExists(String table, Connection connection) {
+ String schema = null;
+
+ try {
+ // Using H2 with a JDBC TCP connection is throwing an exception
+ // See org.h2.engine.SessionRemote#getCurrentSchemaName()
+ if (!"H2 JDBC Driver".equals(connection.getMetaData().getDriverName())) {
+ schema = connection.getSchema();
+ }
+ } catch (SQLException e) {
+ Loggers.get(DatabaseUtils.class).warn("Fail to determine schema. Keeping it null for searching tables", e);
+ }
+
// table type is used to speed-up Oracle by removing introspection of system tables and aliases.
- try (ResultSet rs = connection.getMetaData().getTables(connection.getCatalog(), connection.getSchema(), table, TABLE_TYPE)) {
- System.out.println("****>> " + rs.getMetaData().getSchemaName(1));
- System.out.println("****>>> " + connection.getSchema());
+ try (ResultSet rs = connection.getMetaData().getTables(connection.getCatalog(), schema, table, TABLE_TYPE)) {
while (rs.next()) {
- System.out.println("TABLE_CAT = " + rs.getString("TABLE_CAT"));
- System.out.println("TABLE_SCHEM = " + rs.getString("TABLE_SCHEM"));
- System.out.println("TABLE_NAME = " + rs.getString("TABLE_NAME"));
- System.out.println("TABLE_TYPE = " + rs.getString("TABLE_TYPE"));
- System.out.println("REMARKS = " + rs.getString("REMARKS"));
- //System.out.println("TYPE_CAT = " + rs.getString("TYPE_CAT"));
- //System.out.println("TYPE_SCHEM = " + rs.getString("TYPE_SCHEM"));
- //System.out.println("TYPE_NAME = " + rs.getString("TYPE_NAME"));
- System.out.println("SELF_REFERENCING_COL_NAME = " + rs.getString("SELF_REFERENCING_COL_NAME"));
- System.out.println("REF_GENERATION = " + rs.getString("REF_GENERATION"));
String name = rs.getString("TABLE_NAME");
if (table.equalsIgnoreCase(name)) {
return true;
diff --git a/server/sonar-db-core/src/main/java/org/sonar/db/DefaultDatabase.java b/server/sonar-db-core/src/main/java/org/sonar/db/DefaultDatabase.java
index 90ad11a5789..59d8541fccc 100644
--- a/server/sonar-db-core/src/main/java/org/sonar/db/DefaultDatabase.java
+++ b/server/sonar-db-core/src/main/java/org/sonar/db/DefaultDatabase.java
@@ -93,7 +93,7 @@ public class DefaultDatabase implements Database {
private void initDataSource() throws Exception {
// but it's correctly caught by start()
LOG.info("Create JDBC data source for {}", properties.getProperty(JDBC_URL.getKey()), DEFAULT_URL);
- BasicDataSource basicDataSource = (BasicDataSource) BasicDataSourceFactory.createDataSource(extractCommonsDbcpProperties(properties));
+ BasicDataSource basicDataSource = BasicDataSourceFactory.createDataSource(extractCommonsDbcpProperties(properties));
datasource = new ProfiledDataSource(basicDataSource, NullConnectionInterceptor.INSTANCE);
datasource.setConnectionInitSqls(dialect.getConnectionInitStatements());
datasource.setValidationQuery(dialect.getValidationQuery());
@@ -163,6 +163,7 @@ public class DefaultDatabase implements Database {
@VisibleForTesting
static Properties extractCommonsDbcpProperties(Properties properties) {
Properties result = new Properties();
+ result.setProperty("accessToUnderlyingConnectionAllowed", "true");
for (Map.Entry<Object, Object> entry : properties.entrySet()) {
String key = (String) entry.getKey();
if (StringUtils.startsWith(key, SONAR_JDBC)) {
diff --git a/server/sonar-db-core/src/test/java/org/sonar/db/DatabaseUtilsTest.java b/server/sonar-db-core/src/test/java/org/sonar/db/DatabaseUtilsTest.java
index fef76f8680e..c0f34ea752c 100644
--- a/server/sonar-db-core/src/test/java/org/sonar/db/DatabaseUtilsTest.java
+++ b/server/sonar-db-core/src/test/java/org/sonar/db/DatabaseUtilsTest.java
@@ -21,6 +21,7 @@ package org.sonar.db;
import com.google.common.base.Function;
import java.sql.Connection;
+import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -44,9 +45,15 @@ import static com.google.common.collect.Lists.newArrayList;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
+import static org.mockito.Answers.CALLS_REAL_METHODS;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import static org.sonar.db.DatabaseUtils.toUniqueAndSortedList;
public class DatabaseUtilsTest {
@@ -334,6 +341,38 @@ public class DatabaseUtilsTest {
}
@Test
+ public void tableExists_is_resilient_on_getSchema() throws Exception {
+ try (Connection connection = spy(dbTester.openConnection())) {
+ doThrow(AbstractMethodError.class).when(connection).getSchema();
+ assertThat(DatabaseUtils.tableExists("SCHEMA_MIGRATIONS", connection)).isTrue();
+ assertThat(DatabaseUtils.tableExists("schema_migrations", connection)).isTrue();
+ assertThat(DatabaseUtils.tableExists("schema_MIGRATIONS", connection)).isTrue();
+ assertThat(DatabaseUtils.tableExists("foo", connection)).isFalse();
+ }
+ }
+
+ @Test
+ public void tableExists_is_using_getSchema_when_not_using_h2() throws Exception {
+ try (Connection connection = spy(dbTester.openConnection())) {
+ // DatabaseMetaData mock
+ DatabaseMetaData metaData = mock(DatabaseMetaData.class);
+ doReturn("xxx").when(metaData).getDriverName();
+
+ // ResultSet mock
+ ResultSet resultSet = mock(ResultSet.class);
+ doReturn(true, false).when(resultSet).next();
+ doReturn("SCHEMA_MIGRATIONS").when(resultSet).getString(eq("TABLE_NAME"));
+ doReturn(resultSet).when(metaData).getTables(any(), eq("yyyy"), any(), any());
+
+ // Connection mock
+ doReturn("yyyy").when(connection).getSchema();
+ doReturn(metaData).when(connection).getMetaData();
+
+ assertThat(DatabaseUtils.tableExists("SCHEMA_MIGRATIONS", connection)).isTrue();
+ }
+ }
+
+ @Test
public void checkThatNotTooManyConditions_does_not_fail_if_less_than_1000_conditions() {
DatabaseUtils.checkThatNotTooManyConditions(null, "unused");
DatabaseUtils.checkThatNotTooManyConditions(Collections.emptySet(), "unused");