]> source.dussan.org Git - sonarqube.git/commitdiff
Speed-up drop of DB table on Oracle
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 28 Nov 2016 11:19:03 +0000 (12:19 +0100)
committerGitHub <noreply@github.com>
Mon, 28 Nov 2016 11:19:03 +0000 (12:19 +0100)
sonar-db/src/main/java/org/sonar/db/DatabaseUtils.java
sonar-db/src/test/java/org/sonar/db/DatabaseUtilsTest.java

index 3b837ed6321a255469dcd74506e059150b0abc1d..1aac86b66ab5b0f0bc06cd1804139479cc082a40 100644 (file)
@@ -25,6 +25,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
 import com.google.common.collect.Sets;
 import java.sql.Connection;
+import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -49,6 +50,11 @@ public class DatabaseUtils {
 
   public static final int PARTITION_SIZE_FOR_ORACLE = 1000;
 
+  /**
+   * @see DatabaseMetaData#getTableTypes()
+   */
+  private static final String[] TABLE_TYPE = {"TABLE"};
+
   public static void closeQuietly(@Nullable Connection connection) {
     if (connection != null) {
       try {
@@ -301,7 +307,8 @@ public class DatabaseUtils {
     * @throws SQLException
     */
   public static boolean tableExists(String table, Connection connection) {
-    try (ResultSet rs = connection.getMetaData().getTables(null, null, null, null)) {
+    // table type is used to speed-up Oracle by removing introspection of system tables and aliases.
+    try (ResultSet rs = connection.getMetaData().getTables(null, null, null, TABLE_TYPE)) {
       while (rs.next()) {
         String name = rs.getString("TABLE_NAME");
         if (table.equalsIgnoreCase(name)) {
index 1855803dcc328115d398e502ab93de29f1f7e78b..4003cd443befa3914a4f709efa042b092ac33275 100644 (file)
@@ -327,4 +327,14 @@ public class DatabaseUtilsTest {
     assertThat(buildLikeValue("like-\\_%/-value", AFTER)).isEqualTo(escapedValue + wildcard);
     assertThat(buildLikeValue("like-\\_%/-value", BEFORE_AND_AFTER)).isEqualTo(wildcard + escapedValue + wildcard);
   }
+
+  @Test
+  public void tableExists_returns_true_if_table_is_referenced_in_db_metadata() throws Exception {
+    try (Connection connection = dbTester.openConnection()) {
+      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();
+    }
+  }
 }