diff options
author | Simon Brandhof <simon.brandhof@sonarsource.com> | 2016-07-08 15:45:04 +0200 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2016-07-11 18:32:47 +0200 |
commit | 3731d21239bc7fb9faa9fd7e3652a64cdadc24ab (patch) | |
tree | c348f20cd99c23109ad14b4515e749a871d62806 /sonar-db | |
parent | ba7353eb7324dc759f7f2238ac94e167b35af473 (diff) | |
download | sonarqube-3731d21239bc7fb9faa9fd7e3652a64cdadc24ab.tar.gz sonarqube-3731d21239bc7fb9faa9fd7e3652a64cdadc24ab.zip |
SONAR-7700 support boolean columns in java db migrations
Diffstat (limited to 'sonar-db')
-rw-r--r-- | sonar-db/src/main/java/org/sonar/db/version/BooleanColumnDef.java | 81 | ||||
-rw-r--r-- | sonar-db/src/test/java/org/sonar/db/version/BooleanColumnDefTest.java | 91 |
2 files changed, 172 insertions, 0 deletions
diff --git a/sonar-db/src/main/java/org/sonar/db/version/BooleanColumnDef.java b/sonar-db/src/main/java/org/sonar/db/version/BooleanColumnDef.java new file mode 100644 index 00000000000..96d9d19a23b --- /dev/null +++ b/sonar-db/src/main/java/org/sonar/db/version/BooleanColumnDef.java @@ -0,0 +1,81 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program 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. + * + * This program 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.sonar.db.dialect.Dialect; +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 org.sonar.db.dialect.PostgreSql; + +import static org.sonar.db.version.ColumnDefValidation.validateColumnName; + +/** + * Used to define VARCHAR column + */ +public class BooleanColumnDef extends AbstractColumnDef { + private BooleanColumnDef(Builder builder) { + super(builder.columnName, builder.isNullable); + } + + public static Builder newBooleanColumnDefBuilder() { + return new Builder(); + } + + @Override + public String generateSqlType(Dialect dialect) { + switch (dialect.getId()) { + case PostgreSql.ID: + case H2.ID: + return "BOOLEAN"; + case Oracle.ID: + return "NUMBER(1)"; + case MsSql.ID: + return "BIT"; + case MySql.ID: + return "TINYINT(1)"; + default: + throw new UnsupportedOperationException(String.format("Unknown dialect '%s'", dialect.getId())); + } + } + + public static class Builder { + private String columnName; + + private boolean isNullable = true; + + public Builder setColumnName(String columnName) { + this.columnName = validateColumnName(columnName); + return this; + } + + public Builder setIsNullable(boolean isNullable) { + this.isNullable = isNullable; + return this; + } + + public BooleanColumnDef build() { + validateColumnName(columnName); + return new BooleanColumnDef(this); + } + } + +} diff --git a/sonar-db/src/test/java/org/sonar/db/version/BooleanColumnDefTest.java b/sonar-db/src/test/java/org/sonar/db/version/BooleanColumnDefTest.java new file mode 100644 index 00000000000..76928a423ec --- /dev/null +++ b/sonar-db/src/test/java/org/sonar/db/version/BooleanColumnDefTest.java @@ -0,0 +1,91 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program 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. + * + * This program 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 org.sonar.db.dialect.PostgreSql; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class BooleanColumnDefTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void build_column_def() throws Exception { + BooleanColumnDef def = new BooleanColumnDef.Builder() + .setColumnName("enabled") + .setIsNullable(false) + .build(); + + assertThat(def.getName()).isEqualTo("enabled"); + assertThat(def.isNullable()).isFalse(); + } + + @Test + public void build_column_def_with_default_values() throws Exception { + BooleanColumnDef def = new BooleanColumnDef.Builder() + .setColumnName("enabled") + .build(); + + assertThat(def.getName()).isEqualTo("enabled"); + assertThat(def.isNullable()).isTrue(); + } + + @Test + public void generate_sql_type() throws Exception { + BooleanColumnDef def = new BooleanColumnDef.Builder() + .setColumnName("enabled") + .setIsNullable(true) + .build(); + + assertThat(def.generateSqlType(new H2())).isEqualTo("BOOLEAN"); + assertThat(def.generateSqlType(new PostgreSql())).isEqualTo("BOOLEAN"); + assertThat(def.generateSqlType(new MsSql())).isEqualTo("BIT"); + assertThat(def.generateSqlType(new MySql())).isEqualTo("TINYINT(1)"); + assertThat(def.generateSqlType(new Oracle())).isEqualTo("NUMBER(1)"); + } + + @Test + public void fail_with_NPE_if_name_is_null() throws Exception { + thrown.expect(NullPointerException.class); + thrown.expectMessage("Column name cannot be null"); + + new BooleanColumnDef.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 BooleanColumnDef.Builder().build(); + } + + +} |