update module for multiple datasource

This commit is contained in:
Ilia Ravin 2022-10-31 18:37:40 +03:00
parent 6b16393ccb
commit 5770faf7db
7 changed files with 89 additions and 17 deletions

View File

@ -7,5 +7,6 @@ plugins {
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.springframework.boot:spring-boot")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation project(":common-spring")
}

View File

@ -1,16 +1,15 @@
package ru.touchin.smartmigration
import org.intellij.lang.annotations.Language
import org.springframework.stereotype.Component
import ru.touchin.common.spring.annotations.RequiredBy
import ru.touchin.smartmigration.logic.DataSourceSQL
import ru.touchin.smartmigration.logic.factory.DataSourceSqlFactoryImpl
import java.sql.Date
import java.sql.ResultSet
import java.text.SimpleDateFormat
import javax.annotation.PostConstruct
import javax.sql.DataSource
private const val MIGRATION_TABLE_NAME = "SMART_MIGRATION"
val CURRENT_TIME_SQL: String
get() = Date(System.currentTimeMillis()).let { date ->
SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(date)
@ -21,9 +20,12 @@ val CURRENT_TIME_SQL: String
class BeforeLiquibase(
private val dataSource: DataSource
) {
val dataSourceSql: DataSourceSQL = DataSourceSqlFactoryImpl()
.getDataSourceSql(dataSource.connection.metaData.databaseProductName)
@PostConstruct
fun doAction() {
val buildNumber = System.getenv("BUILD_NUMBER")
if (buildNumber != null) {
checkMigrationTable()
@ -36,9 +38,8 @@ class BeforeLiquibase(
}
private fun checkBuildMigrationExecuted(buildNumber: String): Boolean {
@Language("TSQL")
val checkBuildNumber = "SELECT * FROM $MIGRATION_TABLE_NAME WHERE BUILD_NUMBER = '$buildNumber'"
val checkBuildNumber = dataSourceSql.getMigrationCheckSQL(buildNumber)
val result: ResultSet = dataSource.connection.createStatement().executeQuery(checkBuildNumber)
var rowCount = 0
while (result.next()) {
@ -48,23 +49,13 @@ class BeforeLiquibase(
}
private fun checkMigrationTable() {
@Language("TSQL")
val createTable = "IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = '$MIGRATION_TABLE_NAME' and xtype='U')" +
"CREATE TABLE SMART_MIGRATION (\n" +
"\"ID\" BIGINT PRIMARY KEY IDENTITY ,\n" +
"\"BUILD_NUMBER\" VARCHAR(255) NOT NULL,\n" +
"\"DATE\" DATETIME NOT NULL" +
");"
val createTable = dataSourceSql.getTableCheckSQL()
dataSource.connection.createStatement()
.execute(createTable)
}
private fun insertMigration(buildNumber: String) {
@Language("TSQL")
val insertMigration = "INSERT INTO $MIGRATION_TABLE_NAME (BUILD_NUMBER, DATE)\n" +
"VALUES ('$buildNumber', '$CURRENT_TIME_SQL');"
val insertMigration =dataSourceSql.getInsertMigrationSQL(buildNumber, CURRENT_TIME_SQL)
dataSource.connection.createStatement()
.execute(insertMigration)
}

View File

@ -0,0 +1,7 @@
package ru.touchin.smartmigration.logic
interface DataSourceSQL {
fun getTableCheckSQL(): String
fun getMigrationCheckSQL(buildNumber: String): String
fun getInsertMigrationSQL(buildNumber: String, formattedTime: String): String
}

View File

@ -0,0 +1,22 @@
package ru.touchin.smartmigration.logic
private const val MIGRATION_TABLE_NAME = "SMART_MIGRATION"
class PostgresDataSourceImpl: DataSourceSQL {
override fun getTableCheckSQL(): String {
return "CREATE TABLE IF NOT EXISTS smart_migration (\n" +
"ID BIGSERIAL PRIMARY KEY ,\n" +
"BUILD_NUMBER VARCHAR(255) NOT NULL,\n" +
"DATE timestamp NOT NULL" +
");"
}
override fun getMigrationCheckSQL(buildNumber: String): String {
return "SELECT * FROM $MIGRATION_TABLE_NAME WHERE BUILD_NUMBER = '$buildNumber'"
}
override fun getInsertMigrationSQL(buildNumber: String, formattedTime: String): String {
return "INSERT INTO $MIGRATION_TABLE_NAME (BUILD_NUMBER, DATE)\n" +
"VALUES ('$buildNumber', '$formattedTime');"
}
}

View File

@ -0,0 +1,26 @@
package ru.touchin.smartmigration.logic
private const val MIGRATION_TABLE_NAME = "SMART_MIGRATION"
class SqlDatasourceImpl:DataSourceSQL {
override fun getTableCheckSQL(): String {
return "IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = '$MIGRATION_TABLE_NAME' and xtype='U')" +
"CREATE TABLE SMART_MIGRATION (\n" +
"\"ID\" BIGINT PRIMARY KEY IDENTITY ,\n" +
"\"BUILD_NUMBER\" VARCHAR(255) NOT NULL,\n" +
"\"DATE\" DATETIME NOT NULL" +
");"
}
override fun getMigrationCheckSQL(buildNumber: String): String {
return "SELECT * FROM $MIGRATION_TABLE_NAME WHERE BUILD_NUMBER = '$buildNumber'"
}
override fun getInsertMigrationSQL(buildNumber: String, formattedTime: String): String {
return "INSERT INTO $MIGRATION_TABLE_NAME (BUILD_NUMBER, DATE)\n" +
"VALUES ('$buildNumber', '$formattedTime');"
}
}

View File

@ -0,0 +1,7 @@
package ru.touchin.smartmigration.logic.factory
import ru.touchin.smartmigration.logic.DataSourceSQL
interface DataSourceSqlFactory {
fun getDataSourceSql(driverName: String): DataSourceSQL
}

View File

@ -0,0 +1,18 @@
package ru.touchin.smartmigration.logic.factory
import ru.touchin.smartmigration.logic.DataSourceSQL
import ru.touchin.smartmigration.logic.PostgresDataSourceImpl
import ru.touchin.smartmigration.logic.SqlDatasourceImpl
class DataSourceSqlFactoryImpl: DataSourceSqlFactory {
override fun getDataSourceSql(driverName: String): DataSourceSQL {
return when(driverName){
"sql" -> SqlDatasourceImpl()
"PostgresSQL" -> PostgresDataSourceImpl()
else -> {
PostgresDataSourceImpl()
}
}
}
}