]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8585 configure NLS_SORT param on Oracle client sessions
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 5 Jan 2017 15:51:42 +0000 (16:51 +0100)
committerGitHub <noreply@github.com>
Thu, 5 Jan 2017 15:51:42 +0000 (16:51 +0100)
server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/charset/OracleCharsetHandler.java
server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/charset/OracleCharsetHandlerTest.java
sonar-db/src/main/java/org/sonar/db/dialect/Oracle.java
sonar-db/src/test/java/org/sonar/db/dialect/OracleTest.java

index 5179d5666b3ff216e7f818044ed88d4757ac906d..9cc6e97416f09d333aba7d8beeb4eb5705fb17fa 100644 (file)
@@ -49,9 +49,8 @@ class OracleCharsetHandler extends CharsetHandler {
   private void expectUtf8(Connection connection) throws SQLException {
     // Oracle does not allow to override character set on tables. Only global charset is verified.
     String charset = getSqlExecutor().selectSingleString(connection, "select value from nls_database_parameters where parameter='NLS_CHARACTERSET'");
-    String sort = getSqlExecutor().selectSingleString(connection, "select value from nls_database_parameters where parameter='NLS_SORT'");
-    if (!containsIgnoreCase(charset, UTF8) || !"BINARY".equalsIgnoreCase(sort)) {
-      throw MessageException.of(format("Oracle must be have UTF8 charset and BINARY sort. NLS_CHARACTERSET is %s and NLS_SORT is %s.", charset, sort));
+    if (!containsIgnoreCase(charset, UTF8)) {
+      throw MessageException.of(format("Oracle NLS_CHARACTERSET does not support UTF8: %s", charset));
     }
   }
 }
index bc0dea3d43203db05a066342a14b08465405a4b4..621cc1ec65456d9233d83d5f8117670c5a07a1c9 100644 (file)
@@ -22,7 +22,7 @@ package org.sonar.server.platform.db.migration.charset;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Collections;
-import java.util.List;
+import javax.annotation.Nullable;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -46,7 +46,7 @@ public class OracleCharsetHandlerTest {
 
   @Test
   public void fresh_install_verifies_utf8_charset() throws Exception {
-    answerSql(singletonList(new String[] {"UTF8"}), singletonList(new String[] {"BINARY"}));
+    answerCharset("UTF8");
 
     underTest.handle(connection, DatabaseCharsetChecker.State.FRESH_INSTALL);
   }
@@ -60,37 +60,24 @@ public class OracleCharsetHandlerTest {
 
   @Test
   public void fresh_install_supports_al32utf8() throws Exception {
-    answerSql(
-      singletonList(new String[] {"AL32UTF8"}), singletonList(new String[] {"BINARY"}));
+    answerCharset("AL32UTF8");
 
     underTest.handle(connection, DatabaseCharsetChecker.State.FRESH_INSTALL);
   }
 
   @Test
   public void fresh_install_fails_if_charset_is_not_utf8() throws Exception {
-    answerSql(
-      singletonList(new String[] {"LATIN"}), singletonList(new String[] {"BINARY"}));
+    answerCharset("LATIN");
 
     expectedException.expect(MessageException.class);
-    expectedException.expectMessage("Oracle must be have UTF8 charset and BINARY sort. NLS_CHARACTERSET is LATIN and NLS_SORT is BINARY.");
-
-    underTest.handle(connection, DatabaseCharsetChecker.State.FRESH_INSTALL);
-  }
-
-  @Test
-  public void fresh_install_fails_if_not_case_sensitive() throws Exception {
-    answerSql(
-      singletonList(new String[] {"UTF8"}), singletonList(new String[] {"LINGUISTIC"}));
-
-    expectedException.expect(MessageException.class);
-    expectedException.expectMessage("Oracle must be have UTF8 charset and BINARY sort. NLS_CHARACTERSET is UTF8 and NLS_SORT is LINGUISTIC.");
+    expectedException.expectMessage("Oracle NLS_CHARACTERSET does not support UTF8: LATIN");
 
     underTest.handle(connection, DatabaseCharsetChecker.State.FRESH_INSTALL);
   }
 
   @Test
   public void fails_if_can_not_get_charset() throws Exception {
-    answerSql(Collections.emptyList(), Collections.emptyList());
+    answerCharset(null);
 
     expectedException.expect(MessageException.class);
 
@@ -103,7 +90,8 @@ public class OracleCharsetHandlerTest {
     verifyZeroInteractions(sqlExecutor);
   }
 
-  private void answerSql(List<String[]> firstRequest, List<String[]>... otherRequests) throws SQLException {
-    when(sqlExecutor.select(any(Connection.class), anyString(), any(SqlExecutor.StringsConverter.class))).thenReturn(firstRequest, otherRequests);
+  private void answerCharset(@Nullable String charset) throws SQLException {
+    when(sqlExecutor.select(any(Connection.class), anyString(), any(SqlExecutor.StringsConverter.class)))
+      .thenReturn(charset == null ? Collections.emptyList() : singletonList(new String[] {charset}));
   }
 }
index eecd0a758e66467e431bb61f827b3a4fb0410d4a..aa7908b2827b78f79137932f40ea757e136d1004 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.db.dialect;
 
+import com.google.common.collect.ImmutableList;
+import java.util.List;
 import org.apache.commons.lang.StringUtils;
 
 /**
@@ -27,6 +29,7 @@ import org.apache.commons.lang.StringUtils;
 public class Oracle extends AbstractDialect {
 
   public static final String ID = "oracle";
+  private static final List<String> INIT_STATEMENTS = ImmutableList.of("ALTER SESSION SET NLS_SORT='BINARY'");
 
   public Oracle() {
     super(ID, "oracle", "oracle.jdbc.OracleDriver", "1", "0", "SELECT 1 FROM DUAL");
@@ -41,4 +44,9 @@ public class Oracle extends AbstractDialect {
   public boolean supportsMigration() {
     return true;
   }
+
+  @Override
+  public List<String> getConnectionInitStatements() {
+    return INIT_STATEMENTS;
+  }
 }
index bea6dd7da1af058d911859927c3f480e1f0a90d2..04a2ed68893bc7e6f0bc24264ab673b812cd4092 100644 (file)
@@ -25,36 +25,36 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 public class OracleTest {
 
-  Oracle dialect = new Oracle();
+  private Oracle underTest = new Oracle();
 
   @Test
   public void matchesJdbcURL() {
-    assertThat(dialect.matchesJdbcURL("jdbc:oracle:thin:@localhost/XE")).isTrue();
-    assertThat(dialect.matchesJdbcURL("jdbc:hsql:foo")).isFalse();
+    assertThat(underTest.matchesJdbcURL("jdbc:oracle:thin:@localhost/XE")).isTrue();
+    assertThat(underTest.matchesJdbcURL("jdbc:hsql:foo")).isFalse();
   }
 
   @Test
   public void testBooleanSqlValues() {
-    assertThat(dialect.getTrueSqlValue()).isEqualTo("1");
-    assertThat(dialect.getFalseSqlValue()).isEqualTo("0");
+    assertThat(underTest.getTrueSqlValue()).isEqualTo("1");
+    assertThat(underTest.getFalseSqlValue()).isEqualTo("0");
   }
 
   @Test
   public void should_configure() {
-    assertThat(dialect.getId()).isEqualTo("oracle");
-    assertThat(dialect.getActiveRecordDialectCode()).isEqualTo("oracle");
-    assertThat(dialect.getDefaultDriverClassName()).isEqualTo("oracle.jdbc.OracleDriver");
-    assertThat(dialect.getValidationQuery()).isEqualTo("SELECT 1 FROM DUAL");
+    assertThat(underTest.getId()).isEqualTo("oracle");
+    assertThat(underTest.getActiveRecordDialectCode()).isEqualTo("oracle");
+    assertThat(underTest.getDefaultDriverClassName()).isEqualTo("oracle.jdbc.OracleDriver");
+    assertThat(underTest.getValidationQuery()).isEqualTo("SELECT 1 FROM DUAL");
   }
 
   @Test
   public void testFetchSizeForScrolling() throws Exception {
-    assertThat(dialect.getScrollDefaultFetchSize()).isEqualTo(200);
-    assertThat(dialect.getScrollSingleRowFetchSize()).isEqualTo(1);
+    assertThat(underTest.getScrollDefaultFetchSize()).isEqualTo(200);
+    assertThat(underTest.getScrollSingleRowFetchSize()).isEqualTo(1);
   }
 
   @Test
   public void oracle_does_supportMigration() {
-    assertThat(dialect.supportsMigration()).isTrue();
+    assertThat(underTest.supportsMigration()).isTrue();
   }
 }