]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6434 Stop the support of Oracle 10g
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 16 Apr 2015 21:31:24 +0000 (23:31 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 20 Apr 2015 07:06:52 +0000 (09:06 +0200)
server/sonar-server/src/main/java/org/sonar/server/db/DatabaseChecker.java
server/sonar-server/src/test/java/org/sonar/server/db/DatabaseCheckerTest.java
sonar-application/src/main/assembly/conf/sonar.properties

index 81bd80880998370b0c85dcfaa2e945742e477355..9909c0b70619bb6f9b563d6c3897d156019ad356 100644 (file)
@@ -23,6 +23,7 @@ import com.google.common.base.Throwables;
 import org.apache.commons.dbutils.DbUtils;
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.Startable;
+import org.sonar.api.utils.MessageException;
 import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.ServerComponent;
 import org.sonar.core.persistence.Database;
@@ -34,6 +35,8 @@ import java.sql.SQLException;
 
 public class DatabaseChecker implements ServerComponent, Startable {
 
+  public static final int ORACLE_MIN_MAJOR_VERSION = 11;
+
   private final Database db;
 
   public DatabaseChecker(Database db) {
@@ -46,7 +49,7 @@ public class DatabaseChecker implements ServerComponent, Startable {
       if (H2.ID.equals(db.getDialect().getId())) {
         Loggers.get(DatabaseChecker.class).warn("H2 database should be used for evaluation purpose only");
       } else if (Oracle.ID.equals(db.getDialect().getId())) {
-        checkOracleDriverVersion();
+        checkOracleVersion();
       }
     } catch (Exception e) {
       Throwables.propagate(e);
@@ -58,16 +61,26 @@ public class DatabaseChecker implements ServerComponent, Startable {
     // nothing to do
   }
 
-  private void checkOracleDriverVersion() throws SQLException {
+  private void checkOracleVersion() throws SQLException {
     Connection connection = db.getDataSource().getConnection();
     try {
+      // check version of db
+      // See http://jira.codehaus.org/browse/SONAR-6434
+      int majorVersion = connection.getMetaData().getDatabaseMajorVersion();
+      if (majorVersion < ORACLE_MIN_MAJOR_VERSION) {
+        throw MessageException.of(String.format(
+          "Unsupported Oracle version: %s. Minimal required version is %d.", connection.getMetaData().getDatabaseProductVersion(), ORACLE_MIN_MAJOR_VERSION));
+      }
+
+      // check version of driver
       String driverVersion = connection.getMetaData().getDriverVersion();
       String[] parts = StringUtils.split(driverVersion, ".");
       int intVersion = Integer.parseInt(parts[0]) * 100 + Integer.parseInt(parts[1]);
       if (intVersion < 1102) {
-        throw new IllegalStateException(String.format(
+        throw MessageException.of(String.format(
           "Unsupported Oracle JDBC driver version: %s. Minimal required version is 11.2.", driverVersion));
       }
+
     } finally {
       DbUtils.closeQuietly(connection);
     }
index 6889c71da6786b98756658e97111fcc7ba7262bd..7204cce22c973b968d012e2e7a8fbcb52b9062c0 100644 (file)
  */
 package org.sonar.server.db;
 
+import org.apache.commons.lang.StringUtils;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.sonar.api.utils.MessageException;
 import org.sonar.core.persistence.Database;
 import org.sonar.core.persistence.dialect.Dialect;
 import org.sonar.core.persistence.dialect.H2;
@@ -37,31 +39,59 @@ import static org.mockito.Mockito.when;
 public class DatabaseCheckerTest {
 
   @Test
-  public void require_oracle_11_2() throws Exception {
-    Database db = mockDb(new Oracle(), "11.2.0.0.1");
+  public void requires_oracle_driver_11_2() throws Exception {
+    Database db = mockDb(new Oracle(), "11.2.1", "11.2.0.0.1");
     new DatabaseChecker(db).start();
     // no error
 
-    db = mockDb(new Oracle(), "11.3.1");
+    db = mockDb(new Oracle(), "11.2.1", "11.3.1");
     new DatabaseChecker(db).start();
     // no error
 
-    db = mockDb(new Oracle(), "12.0.2");
+    db = mockDb(new Oracle(), "11.2.1", "12.0.2");
     new DatabaseChecker(db).start();
     // no error
 
-    db = mockDb(new Oracle(), "11.1.0.2");
+    db = mockDb(new Oracle(), "11.2.1", "11.1.0.2");
     try {
       new DatabaseChecker(db).start();
       fail();
-    } catch (IllegalStateException e) {
+    } catch (MessageException e) {
       assertThat(e).hasMessage("Unsupported Oracle JDBC driver version: 11.1.0.2. Minimal required version is 11.2.");
     }
   }
 
+  @Test
+  public void requires_oracle_11g_or_greater() throws Exception {
+    // oracle 11.0 is ok
+    Database db = mockDb(new Oracle(), "11.0.1", "11.2.0.0.1");
+    new DatabaseChecker(db).start();
+
+    // oracle 11.1 is ok
+    db = mockDb(new Oracle(), "11.1.1", "11.2.0.0.1");
+    new DatabaseChecker(db).start();
+
+    // oracle 11.2 is ok
+    db = mockDb(new Oracle(), "11.2.1", "11.2.0.0.1");
+    new DatabaseChecker(db).start();
+
+    // oracle 12 is ok
+    db = mockDb(new Oracle(), "12.0.1", "11.2.0.0.1");
+    new DatabaseChecker(db).start();
+
+    // oracle 10 is not supported
+    db = mockDb(new Oracle(), "10.2.1",  "11.2.0.0.1");
+    try {
+      new DatabaseChecker(db).start();
+      fail();
+    } catch (MessageException e) {
+      assertThat(e).hasMessage("Unsupported Oracle version: 10.2.1. Minimal required version is 11.");
+    }
+  }
+
   @Test
   public void log_warning_if_h2() throws Exception {
-    Database db = mockDb(new H2(), "13.4");
+    Database db = mockDb(new H2(), "13.4", "13.4");
     DatabaseChecker checker = new DatabaseChecker(db);
     checker.start();
     checker.stop();
@@ -70,14 +100,16 @@ public class DatabaseCheckerTest {
 
   @Test
   public void do_not_fail_if_mysql() throws Exception {
-    Database db = mockDb(new MySql(), "5.7");
+    Database db = mockDb(new MySql(), "5.7", "5.7");
     new DatabaseChecker(db).start();
     // no error
   }
 
-  private Database mockDb(Dialect dialect, String driverVersion) throws SQLException {
+  private Database mockDb(Dialect dialect, String dbVersion, String driverVersion) throws SQLException {
     Database db = mock(Database.class, Mockito.RETURNS_DEEP_STUBS);
     when(db.getDialect()).thenReturn(dialect);
+    when(db.getDataSource().getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(Integer.parseInt(StringUtils.substringBefore(dbVersion, ".")));
+    when(db.getDataSource().getConnection().getMetaData().getDatabaseProductVersion()).thenReturn(dbVersion);
     when(db.getDataSource().getConnection().getMetaData().getDriverVersion()).thenReturn(driverVersion);
     return db;
   }
index 997a1577c9feb380c9367ceb445a0af5877819f1..fa88713a16da714ad722b47a52dc71dfb5b1858a 100644 (file)
 
 #----- MySQL 5.x
 # Only InnoDB storage engine is supported (not myISAM).
-# Only the bundled driver is supported.
+# Only the bundled driver is supported. It can not be changed.
 #sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
 
 
-#----- Oracle 10g/11g
+#----- Oracle 11g
 # - Only thin client is supported
-# - Only versions 11.2.* of Oracle JDBC driver are supported, even if connecting to lower Oracle versions.
+# - Only versions 11.2.* of Oracle JDBC driver are supported
 # - The JDBC driver must be copied into the directory extensions/jdbc-driver/oracle/
 # - If you need to set the schema, please refer to http://jira.codehaus.org/browse/SONAR-5000
 #sonar.jdbc.url=jdbc:oracle:thin:@localhost/XE