From 761b87815600cd0b31340b658727ef628058f0e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 24 Mar 2021 23:05:31 +0100 Subject: [PATCH] [Editor] Create DatabaseService and add support for fetching database tables --- .../base/editor/database/model/Column.kt | 3 ++ .../base/editor/database/model/ColumnType.kt | 31 +++++++++++ .../base/editor/database/model/Table.kt | 12 +++++ .../database/service/DatabaseService.kt | 7 +++ .../database/service/H2DatabaseService.kt | 51 +++++++++++++++++++ 5 files changed, 104 insertions(+) create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/Column.kt create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/ColumnType.kt create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/Table.kt create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/DatabaseService.kt create mode 100644 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/H2DatabaseService.kt diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/Column.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/Column.kt new file mode 100644 index 00000000..a7282c32 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/Column.kt @@ -0,0 +1,3 @@ +package com.bartlomiejpluta.base.editor.database.model + +class Column(val table: Table, val name: String, val type: ColumnType, val nullable: Boolean, val primary: Boolean) \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/ColumnType.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/ColumnType.kt new file mode 100644 index 00000000..c46807fc --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/ColumnType.kt @@ -0,0 +1,31 @@ +package com.bartlomiejpluta.base.editor.database.model + +enum class ColumnType { + INT, + BOOLEAN, + TINYINT, + SMALLINT, + BIGINT, + IDENTITY, + DECIMAL, + DOUBLE, + REAL, + TIME, + TIME_WITH_TIME_ZONE, + DATE, + TIMESTAMP, + TIMESTAMP_WITH_TIME_ZONE, + BINARY, + OTHER, + VARCHAR, + VARCHAR_IGNORECASE, + CHAR, + BLOB, + CLOB, + UUID, + ARRAY, + ENUM, + GEOMETRY, + JSON, + INTERVAL +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/Table.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/Table.kt new file mode 100644 index 00000000..0be13109 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/Table.kt @@ -0,0 +1,12 @@ +package com.bartlomiejpluta.base.editor.database.model + +class Table(val name: String) { + private val mutableColumns = mutableListOf() + val columns: List + get() = mutableColumns + + fun addColumn(name: String, type: ColumnType, nullable: Boolean, primary: Boolean) { + val column = Column(this, name, type, nullable, primary) + mutableColumns += column + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/DatabaseService.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/DatabaseService.kt new file mode 100644 index 00000000..92fb9317 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/DatabaseService.kt @@ -0,0 +1,7 @@ +package com.bartlomiejpluta.base.editor.database.service + +import com.bartlomiejpluta.base.editor.database.model.Table + +interface DatabaseService { + val tables: List +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/H2DatabaseService.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/H2DatabaseService.kt new file mode 100644 index 00000000..e6807e86 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/H2DatabaseService.kt @@ -0,0 +1,51 @@ +package com.bartlomiejpluta.base.editor.database.service + +import com.bartlomiejpluta.base.editor.database.model.ColumnType +import com.bartlomiejpluta.base.editor.database.model.Table +import com.bartlomiejpluta.base.editor.project.context.ProjectContext +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service +import java.sql.Connection + +@Service +class H2DatabaseService : DatabaseService { + + @Autowired + private lateinit var projectContext: ProjectContext + + override val tables: List
+ get() { + val tables = connection { + val tables = mutableListOf
() + val results = prepareStatement("SHOW TABLES").executeQuery() + while (results.next()) { + if (results.getString("TABLE_SCHEMA") == "PUBLIC") { + tables.add(Table(results.getString("TABLE_NAME"))) + } + } + + tables + } ?: emptyList() + + tables.forEach { table -> + connection { + val results = prepareStatement("SHOW COLUMNS FROM ${table.name}").executeQuery() + while (results.next()) { + table.addColumn( + results.getString("FIELD"), + parseType(results.getString("TYPE")), + results.getBoolean("NULL"), + results.getString("KEY") == "PRI" + ) + } + } + } + + return tables + } + + private inline fun connection(op: Connection.() -> T) = + projectContext.project?.database?.connection?.use(op) + + private fun parseType(type: String) = ColumnType.valueOf(type.replace(" ", "_").substringBefore("(")) +} \ No newline at end of file