diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 6d799a05..565c3479 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -24,29 +24,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 00000000..b77aaae4
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/harmonica.iml b/.idea/harmonica.iml
new file mode 100644
index 00000000..78b2cc53
--- /dev/null
+++ b/.idea/harmonica.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 00000000..29585c86
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 71a4b562..e6da7a6e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,10 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 84326605..73f77c1a 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,23 +1,6 @@
-#
-# Harmonica: Kotlin Database Migration Tool
-# Copyright (C) 2019 Kenji Otsuka
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-
+#Tue Feb 11 10:56:09 CET 2020
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip
+zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
\ No newline at end of file
diff --git a/src/main/kotlin/com/improve_future/harmonica/core/AbstractMigration.kt b/src/main/kotlin/com/improve_future/harmonica/core/AbstractMigration.kt
index 37c285dc..c38d004b 100644
--- a/src/main/kotlin/com/improve_future/harmonica/core/AbstractMigration.kt
+++ b/src/main/kotlin/com/improve_future/harmonica/core/AbstractMigration.kt
@@ -18,7 +18,6 @@
package com.improve_future.harmonica.core
-import com.improve_future.harmonica.core.adapter.*
import com.improve_future.harmonica.core.adapter.DbAdapter
import com.improve_future.harmonica.core.adapter.MySqlAdapter
import com.improve_future.harmonica.core.adapter.OracleAdapter
@@ -150,6 +149,62 @@ abstract class AbstractMigration {
addColumn(tableName, integerColumn, first, justBeforeColumnName)
}
+ /**
+ * Add new big integer column to existing table.
+ *
+ * @param tableName Table name.
+ * @param columnName Column name.
+ * @param nullable
+ * @param default
+ * @param unsigned Valid only for MySQL.
+ * @param first You add column at first of the column (valid only for MySQL)
+ * @param justBeforeColumnName Column name the new column to be added just after.
+ * (valid only for MySQL)
+ */
+ fun addBigIntegerColumn(
+ tableName: String, columnName: String,
+ nullable: Boolean = true, default: Long? = null,
+ unsigned: Boolean = false,
+ first: Boolean = false,
+ justBeforeColumnName: String? = null
+ ) {
+ val bigIntegerColumn = BigIntegerColumn(columnName)
+ bigIntegerColumn.also {
+ it.nullable = nullable
+ it.default = default
+ it.unsigned = unsigned
+ }
+ addColumn(tableName, bigIntegerColumn, first, justBeforeColumnName)
+ }
+
+ /**
+ * Add new big integer column to existing table.
+ *
+ * @param tableName Table name.
+ * @param columnName Column name.
+ * @param nullable
+ * @param default
+ * @param unsigned Valid only for MySQL.
+ * @param first You add column at first of the column (valid only for MySQL)
+ * @param justBeforeColumnName Column name the new column to be added just after.
+ * (valid only for MySQL)
+ */
+ fun addBigIntegerColumn(
+ tableName: String, columnName: String,
+ nullable: Boolean = true, default: RawSql,
+ unsigned: Boolean = false,
+ first: Boolean = false,
+ justBeforeColumnName: String? = null
+ ) {
+ val integerColumn = BigIntegerColumn(columnName)
+ integerColumn.also {
+ it.nullable = nullable
+ it.sqlDefault = default.sql
+ it.unsigned = unsigned
+ }
+ addColumn(tableName, integerColumn, first, justBeforeColumnName)
+ }
+
/**
* Add new decimal column to existing table.
*
diff --git a/src/main/kotlin/com/improve_future/harmonica/core/adapter/DbAdapter.kt b/src/main/kotlin/com/improve_future/harmonica/core/adapter/DbAdapter.kt
index 890115f5..61f5b18f 100644
--- a/src/main/kotlin/com/improve_future/harmonica/core/adapter/DbAdapter.kt
+++ b/src/main/kotlin/com/improve_future/harmonica/core/adapter/DbAdapter.kt
@@ -100,6 +100,7 @@ internal abstract class DbAdapter(private val connection: ConnectionInterface) {
protected open fun sqlType(column: AbstractColumn): String {
return when (column) {
is IntegerColumn -> "INTEGER"
+ is BigIntegerColumn -> "BIGINT"
is VarcharColumn -> "VARCHAR"
is DecimalColumn -> "DECIMAL"
is BooleanColumn -> "BOOL"
diff --git a/src/main/kotlin/com/improve_future/harmonica/core/adapter/MySqlAdapter.kt b/src/main/kotlin/com/improve_future/harmonica/core/adapter/MySqlAdapter.kt
index 6a52eb5d..d7922f02 100644
--- a/src/main/kotlin/com/improve_future/harmonica/core/adapter/MySqlAdapter.kt
+++ b/src/main/kotlin/com/improve_future/harmonica/core/adapter/MySqlAdapter.kt
@@ -67,6 +67,11 @@ internal class MySqlAdapter(connection: ConnectionInterface) :
sql += " UNSIGNED"
}
}
+ is BigIntegerColumn -> {
+ if (column.unsigned) {
+ sql += " UNSIGNED"
+ }
+ }
}
if (!column.nullable) sql += " NOT NULL"
if (column.hasDefault) {
diff --git a/src/main/kotlin/com/improve_future/harmonica/core/adapter/OracleAdapter.kt b/src/main/kotlin/com/improve_future/harmonica/core/adapter/OracleAdapter.kt
index 50a90011..7575a024 100644
--- a/src/main/kotlin/com/improve_future/harmonica/core/adapter/OracleAdapter.kt
+++ b/src/main/kotlin/com/improve_future/harmonica/core/adapter/OracleAdapter.kt
@@ -89,6 +89,7 @@ internal class OracleAdapter(connection: ConnectionInterface) : DbAdapter(connec
override fun sqlType(column: AbstractColumn): String {
return when (column) {
is IntegerColumn -> "NUMBER"
+ is BigIntegerColumn -> "NUMBER"
is DecimalColumn -> "NUMBER"
is DateTimeColumn -> "DATE"
is TimeColumn -> "TIMESTAMP"
diff --git a/src/main/kotlin/com/improve_future/harmonica/core/table/TableBuilder.kt b/src/main/kotlin/com/improve_future/harmonica/core/table/TableBuilder.kt
index 25d60a01..e570ad7e 100644
--- a/src/main/kotlin/com/improve_future/harmonica/core/table/TableBuilder.kt
+++ b/src/main/kotlin/com/improve_future/harmonica/core/table/TableBuilder.kt
@@ -141,6 +141,52 @@ class TableBuilder {
return builder
}
+ /**
+ * Add big integer column.
+ *
+ * @param columnName
+ * @param nullable `false` for `NOT NULL` constraint. The default value is `true`.
+ * @param default
+ * @param unsigned Valid only for MySQL.
+ * @return
+ */
+ fun bigInteger(
+ columnName: String,
+ nullable: Boolean = true,
+ default: Long? = null,
+ unsigned: Boolean = false
+ ): ColumnBuilder {
+ val builder = ColumnBuilder(BigIntegerColumn(columnName).also {
+ it.nullable = nullable
+ it.default = default
+ })
+ addColumn(builder.column)
+ return builder
+ }
+
+ /**
+ * Add big integer column.
+ *
+ * @param columnName
+ * @param nullable `false` for `NOT NULL` constraint. The default value is `true`.
+ * @param default
+ * @param unsigned Valid only for MySQL.
+ * @return
+ */
+ fun bigInteger(
+ columnName: String,
+ nullable: Boolean = true,
+ default: RawSql,
+ unsigned: Boolean = false
+ ): ColumnBuilder {
+ val builder = ColumnBuilder(BigIntegerColumn(columnName).also {
+ it.nullable = nullable
+ it.sqlDefault = default.sql
+ })
+ addColumn(builder.column)
+ return builder
+ }
+
/**
* add varchar column
*
diff --git a/src/main/kotlin/com/improve_future/harmonica/core/table/column/AbstractColumn.kt b/src/main/kotlin/com/improve_future/harmonica/core/table/column/AbstractColumn.kt
index 506d7415..e7f861be 100644
--- a/src/main/kotlin/com/improve_future/harmonica/core/table/column/AbstractColumn.kt
+++ b/src/main/kotlin/com/improve_future/harmonica/core/table/column/AbstractColumn.kt
@@ -21,7 +21,6 @@ package com.improve_future.harmonica.core.table.column
import com.improve_future.harmonica.core.Index
import com.improve_future.harmonica.core.RawSql
-
internal typealias Type = Int
internal abstract class AbstractColumn(
@@ -71,7 +70,6 @@ internal abstract class AbstractColumn(
var nullable = true
-
abstract var sqlDefault: String?
val hasDefault: Boolean
@@ -83,9 +81,9 @@ internal abstract class AbstractColumn(
val hasReference: Boolean
get() {
return !(
- referenceTable.isNullOrBlank() ||
- referenceColumn.isNullOrBlank()
- )
+ referenceTable.isNullOrBlank() ||
+ referenceColumn.isNullOrBlank()
+ )
}
var comment: String? = null
diff --git a/src/main/kotlin/com/improve_future/harmonica/core/table/column/BigIntegerColumn.kt b/src/main/kotlin/com/improve_future/harmonica/core/table/column/BigIntegerColumn.kt
new file mode 100644
index 00000000..968ac28a
--- /dev/null
+++ b/src/main/kotlin/com/improve_future/harmonica/core/table/column/BigIntegerColumn.kt
@@ -0,0 +1,33 @@
+/*
+ * Harmonica: Kotlin Database Migration Tool
+ * Copyright (C) 2020 Kenji Otsuka
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.improve_future.harmonica.core.table.column
+
+// Exposed take a Long type as BigInteger in database, actually BigInteger can be bigger than Long
+// but for now we limit it to the size of a Long
+internal class BigIntegerColumn(name: String) : AbstractColumn(name) {
+ override var sqlDefault: String? = null
+
+ var default: Long?
+ get() = sqlDefault?.toLongOrNull()
+ set(value) {
+ sqlDefault = value?.toString()
+ }
+
+ var unsigned = false
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/improve_future/harmonica/core/table/column/IntegerColumn.kt b/src/main/kotlin/com/improve_future/harmonica/core/table/column/IntegerColumn.kt
index fe777492..ab6160f9 100644
--- a/src/main/kotlin/com/improve_future/harmonica/core/table/column/IntegerColumn.kt
+++ b/src/main/kotlin/com/improve_future/harmonica/core/table/column/IntegerColumn.kt
@@ -18,8 +18,6 @@
package com.improve_future.harmonica.core.table.column
-import com.improve_future.harmonica.core.RawSql
-
internal class IntegerColumn(name: String) : AbstractColumn(name) {
override var sqlDefault: String? = null
diff --git a/src/test/kotlin/com/improve_future/harmonica/core/adapter/MySqlAdapterTest.kt b/src/test/kotlin/com/improve_future/harmonica/core/adapter/MySqlAdapterTest.kt
index 5a19196a..332869c2 100644
--- a/src/test/kotlin/com/improve_future/harmonica/core/adapter/MySqlAdapterTest.kt
+++ b/src/test/kotlin/com/improve_future/harmonica/core/adapter/MySqlAdapterTest.kt
@@ -70,6 +70,23 @@ class MySqlAdapterTest {
)
}
+ @Test
+ fun testAddColumnForBigInteger() {
+ val connection = StubConnection()
+ val adapter = MySqlAdapter(connection)
+
+ val bigIntegerColumn = BigIntegerColumn("bigInteger")
+
+ adapter.addColumn(
+ "table_name", bigIntegerColumn,
+ AddingColumnOption()
+ )
+ assertEquals(
+ "ALTER TABLE table_name ADD COLUMN bigInteger BIGINT;",
+ connection.executedSqlList.first()
+ )
+ }
+
@Test
fun testAddColumnForBlob() {
val connection = StubConnection()
diff --git a/src/test/kotlin/com/improve_future/harmonica/core/adapter/PostgreSqlAdapterTest.kt b/src/test/kotlin/com/improve_future/harmonica/core/adapter/PostgreSqlAdapterTest.kt
index 36a38c32..562f5695 100644
--- a/src/test/kotlin/com/improve_future/harmonica/core/adapter/PostgreSqlAdapterTest.kt
+++ b/src/test/kotlin/com/improve_future/harmonica/core/adapter/PostgreSqlAdapterTest.kt
@@ -61,6 +61,35 @@ class PostgreSqlAdapterTest {
)
}
+ @Test
+ fun testBuildColumnDeclarationForBigInteger() {
+ val bigIntegerColumn = BigIntegerColumn("bigInt")
+
+ fun buildBigIntegerDeclaration() =
+ buildColumnDeclarationFunctionForTest.invoke(
+ PostgreSqlAdapter, bigIntegerColumn
+ ) as String
+ assertEquals(
+ "bigInt BIGINT",
+ buildBigIntegerDeclaration()
+ )
+ bigIntegerColumn.nullable = false
+ assertEquals(
+ "bigInt BIGINT NOT NULL",
+ buildBigIntegerDeclaration()
+ )
+ bigIntegerColumn.default = 1L
+ assertEquals(
+ "bigInt BIGINT NOT NULL DEFAULT 1",
+ buildBigIntegerDeclaration()
+ )
+ bigIntegerColumn.nullable = true
+ assertEquals(
+ "bigInt BIGINT DEFAULT 1",
+ buildBigIntegerDeclaration()
+ )
+ }
+
@Test
fun testBuildColumnDeclarationForDecimal() {
val decimalColumn = DecimalColumn("decimal")
diff --git a/src/test/kotlin/com/improve_future/harmonica/core/table/TableBuilderTest.kt b/src/test/kotlin/com/improve_future/harmonica/core/table/TableBuilderTest.kt
index 0e795de1..48d63004 100644
--- a/src/test/kotlin/com/improve_future/harmonica/core/table/TableBuilderTest.kt
+++ b/src/test/kotlin/com/improve_future/harmonica/core/table/TableBuilderTest.kt
@@ -44,6 +44,23 @@ class TableBuilderTest {
assertEquals(1L, integerColumn.default)
}
+ @Test
+ fun testBigInteger() {
+ var tb = TableBuilder()
+ tb.bigInteger("name")
+ var bigInteger = tb.columnList.first() as BigIntegerColumn
+ assertEquals("name", bigInteger.name)
+ assertEquals(true, bigInteger.nullable)
+ assertEquals(null, bigInteger.default)
+
+ tb = TableBuilder()
+ tb.bigInteger("name", false, 1L)
+ bigInteger = tb.columnList.first() as BigIntegerColumn
+ assertEquals("name", bigInteger.name)
+ assertEquals(false, bigInteger.nullable)
+ assertEquals(1L, bigInteger.default)
+ }
+
@Test
fun testDecimal() {
var tb = TableBuilder()
diff --git a/src/test/kotlin/com/improve_future/harmonica/core/table/column/BigIntegerColumnTest.kt b/src/test/kotlin/com/improve_future/harmonica/core/table/column/BigIntegerColumnTest.kt
new file mode 100644
index 00000000..a605ba29
--- /dev/null
+++ b/src/test/kotlin/com/improve_future/harmonica/core/table/column/BigIntegerColumnTest.kt
@@ -0,0 +1,34 @@
+/*
+ * Harmonica: Kotlin Database Migration Tool
+ * Copyright (C) 2020 Kenji Otsuka
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.improve_future.harmonica.core.table.column
+
+import org.junit.jupiter.api.Test
+import kotlin.test.assertEquals
+
+class BigIntegerColumnTest {
+ @Test
+ fun testInstanceVariable() {
+ val bigIntegerColumn = BigIntegerColumn("name")
+ assertEquals("name", bigIntegerColumn.name)
+ assertEquals(false, bigIntegerColumn.hasDefault)
+ bigIntegerColumn.default = 1L
+ assertEquals(true, bigIntegerColumn.hasDefault)
+ assertEquals("1", bigIntegerColumn.sqlDefault)
+ }
+}
\ No newline at end of file