From: Julien Lancelot Date: Thu, 3 Dec 2015 14:29:16 +0000 (+0100) Subject: SONAR-6884 Create a ClobColumnDef to create Clob columns X-Git-Tag: 5.3-RC1~74 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4f1e90c5f00388679c53c71915153c93db8f9cb1;p=sonarqube.git SONAR-6884 Create a ClobColumnDef to create Clob columns --- diff --git a/sonar-db/src/main/java/org/sonar/db/dialect/MsSql.java b/sonar-db/src/main/java/org/sonar/db/dialect/MsSql.java index 27443bf49a1..0983ae389ca 100644 --- a/sonar-db/src/main/java/org/sonar/db/dialect/MsSql.java +++ b/sonar-db/src/main/java/org/sonar/db/dialect/MsSql.java @@ -25,6 +25,8 @@ public class MsSql extends AbstractDialect { public static final String ID = "mssql"; + public static final String COLLATION = "Latin1_General_CS_AS"; + public MsSql() { super(ID, "sqlserver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "1", "0", "SELECT 1"); } diff --git a/sonar-db/src/main/java/org/sonar/db/version/ClobColumnDef.java b/sonar-db/src/main/java/org/sonar/db/version/ClobColumnDef.java new file mode 100644 index 00000000000..f96a9886c82 --- /dev/null +++ b/sonar-db/src/main/java/org/sonar/db/version/ClobColumnDef.java @@ -0,0 +1,74 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.db.version; + +import javax.annotation.CheckForNull; +import org.sonar.db.dialect.Dialect; +import org.sonar.db.dialect.MsSql; + +import static org.sonar.db.version.ColumnDefValidation.validateColumnName; + +/** + * Used to define CLOB columns + * + * Warning, for the moment it's only supporting MsSQL + */ +public class ClobColumnDef extends AbstractColumnDef { + + private ClobColumnDef(Builder builder) { + super(builder.columnName, builder.isNullable); + } + + public static Builder newClobColumnDefBuilder() { + return new Builder(); + } + + @Override + public String generateSqlType(Dialect dialect) { + if (MsSql.ID.equals(dialect.getId())) { + return String.format("NVARCHAR (MAX) COLLATE %s", MsSql.COLLATION); + } + throw new UnsupportedOperationException(String.format("Database %s is not yet supported", dialect.getId())); + } + + public static class Builder { + @CheckForNull + private String columnName; + + private boolean isNullable; + + public Builder setColumnName(String columnName) { + this.columnName = validateColumnName(columnName); + return this; + } + + public Builder setIsNullable(boolean isNullable) { + this.isNullable = isNullable; + return this; + } + + public ClobColumnDef build() { + validateColumnName(columnName); + return new ClobColumnDef(this); + } + } + +} diff --git a/sonar-db/src/test/java/org/sonar/db/version/ClobColumnDefTest.java b/sonar-db/src/test/java/org/sonar/db/version/ClobColumnDefTest.java new file mode 100644 index 00000000000..30912f9c9ec --- /dev/null +++ b/sonar-db/src/test/java/org/sonar/db/version/ClobColumnDefTest.java @@ -0,0 +1,112 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.db.version; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.db.dialect.H2; +import org.sonar.db.dialect.MsSql; +import org.sonar.db.dialect.MySql; +import org.sonar.db.dialect.Oracle; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ClobColumnDefTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void build_string_column_def() throws Exception { + ClobColumnDef def = new ClobColumnDef.Builder() + .setColumnName("issues") + .setIsNullable(true) + .build(); + + assertThat(def.getName()).isEqualTo("issues"); + assertThat(def.isNullable()).isTrue(); + } + + @Test + public void generate_sql_type() throws Exception { + ClobColumnDef def = new ClobColumnDef.Builder() + .setColumnName("issues") + .setIsNullable(true) + .build(); + + assertThat(def.generateSqlType(new MsSql())).isEqualTo("NVARCHAR (MAX) COLLATE Latin1_General_CS_AS"); + } + + @Test + public void fail_with_UOE_to_generate_sql_on_h2() throws Exception { + ClobColumnDef def = new ClobColumnDef.Builder() + .setColumnName("issues") + .setIsNullable(true) + .build(); + + thrown.expect(UnsupportedOperationException.class); + + def.generateSqlType(new H2()); + } + + @Test + public void fail_with_UOE_to_generate_sql_on_mysql() throws Exception { + ClobColumnDef def = new ClobColumnDef.Builder() + .setColumnName("issues") + .setIsNullable(true) + .build(); + + thrown.expect(UnsupportedOperationException.class); + + def.generateSqlType(new MySql()); + } + + @Test + public void fail_with_UOE_to_generate_sql_on_oracle() throws Exception { + ClobColumnDef def = new ClobColumnDef.Builder() + .setColumnName("issues") + .setIsNullable(true) + .build(); + + thrown.expect(UnsupportedOperationException.class); + + def.generateSqlType(new Oracle()); + } + + @Test + public void fail_with_NPE_if_name_is_null() throws Exception { + thrown.expect(NullPointerException.class); + thrown.expectMessage("Column name cannot be null"); + + new ClobColumnDef.Builder() + .setColumnName(null); + } + + @Test + public void fail_with_NPE_if_no_name() throws Exception { + thrown.expect(NullPointerException.class); + thrown.expectMessage("Column name cannot be null"); + + new ClobColumnDef.Builder() + .build(); + } +}