From 55b547db75dd33a537cccb570aac9ef304d24997 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Mon, 11 May 2020 01:39:36 +0200 Subject: [PATCH] Fix migrations of Functions --- build.gradle.kts | 2 +- .../fr/postgresjson/definition/Resource.kt | 4 ++-- .../migration/{Query.kt => MigrationScript.kt} | 4 ++-- .../fr/postgresjson/migration/Migrations.kt | 17 +++++++++-------- .../fr/postgresjson/utils/searchSqlFiles.kt | 13 +++++++++---- .../kotlin/fr/postgresjson/MigrationTest.kt | 2 +- 6 files changed, 24 insertions(+), 18 deletions(-) rename src/main/kotlin/fr/postgresjson/migration/{Query.kt => MigrationScript.kt} (96%) diff --git a/build.gradle.kts b/build.gradle.kts index 4b481ac..39b99df 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { id("fr.coppernic.versioning") version "3.1.2" } -group = "flecomte" +group = "com.github.flecomte" version = versioning.info.tag repositories { diff --git a/src/main/kotlin/fr/postgresjson/definition/Resource.kt b/src/main/kotlin/fr/postgresjson/definition/Resource.kt index 7f32336..fbc2124 100644 --- a/src/main/kotlin/fr/postgresjson/definition/Resource.kt +++ b/src/main/kotlin/fr/postgresjson/definition/Resource.kt @@ -20,10 +20,10 @@ interface Resource { fun build(resource: String, path: Path): Resource = try { - Function(resource, path) + Migration(resource, path) } catch (e: ParseException) { try { - Migration(resource, path) + Function(resource, path) } catch (e: ParseException) { try { Query(resource, path) diff --git a/src/main/kotlin/fr/postgresjson/migration/Query.kt b/src/main/kotlin/fr/postgresjson/migration/MigrationScript.kt similarity index 96% rename from src/main/kotlin/fr/postgresjson/migration/Query.kt rename to src/main/kotlin/fr/postgresjson/migration/MigrationScript.kt index 4d571a8..c33243c 100644 --- a/src/main/kotlin/fr/postgresjson/migration/Query.kt +++ b/src/main/kotlin/fr/postgresjson/migration/MigrationScript.kt @@ -5,7 +5,7 @@ import fr.postgresjson.entity.mutable.Entity import fr.postgresjson.migration.Migration.Action import java.util.* -data class Query( +data class MigrationScript( val name: String, val up: String, val down: String, @@ -57,7 +57,7 @@ data class Query( return Migration.Status.OK // TODO } - fun copy(): Query { + fun copy(): MigrationScript { return this.copy(name = name, up = up, down = down, connection = connection, executedAt = executedAt).also { it.doExecute = this.doExecute } diff --git a/src/main/kotlin/fr/postgresjson/migration/Migrations.kt b/src/main/kotlin/fr/postgresjson/migration/Migrations.kt index a5323be..1dd902c 100644 --- a/src/main/kotlin/fr/postgresjson/migration/Migrations.kt +++ b/src/main/kotlin/fr/postgresjson/migration/Migrations.kt @@ -36,12 +36,13 @@ interface Migration { data class Migrations private constructor( private val connection: Connection, - private val migrationsScripts: MutableMap = mutableMapOf(), + private val migrationsScripts: MutableMap = mutableMapOf(), private val functions: MutableMap = mutableMapOf() ) { private var directories: List = emptyList() private val logger: Logger? by LoggerDelegate() constructor(directory: URI, connection: Connection) : this(listOf(directory), connection) + constructor(connection: Connection, vararg directory: URI) : this(directory.toList(), connection) constructor(directories: List, connection: Connection) : this(connection) { initDB() @@ -85,7 +86,7 @@ data class Migrations private constructor( this::class.java.classLoader.getResource("sql/migration/findAllHistory.sql")!!.readText().let { connection.select(it, object : TypeReference>() {}) .map { query -> - migrationsScripts[query.filename] = Query(query.filename, query.up, query.down, connection, query.executedAt) + migrationsScripts[query.filename] = MigrationScript(query.filename, query.up, query.down, connection, query.executedAt) } } } @@ -105,8 +106,8 @@ data class Migrations private constructor( private fun getMigrationFromDirectory(directory: URI) { val downs: MutableMap = mutableMapOf() - /* Set Down Migration */ directory.searchSqlFiles().apply { + /* Set Down Migration */ forEach { migration -> if (migration is DefinitionMigration && migration.direction == DefinitionMigration.Direction.DOWN) { downs += migration.name to migration @@ -119,7 +120,7 @@ data class Migrations private constructor( val down = downs[migration.name] ?: throw DownMigrationNotDefined(migration.name + ".down.sql") downs -= migration.name - addQuery(migration, down) + addMigrationScript(migration, down) } else if (migration is DefinitionFunction) { addFunction(migration) } @@ -153,12 +154,12 @@ data class Migrations private constructor( return this } - fun addQuery(up: DefinitionMigration, down: DefinitionMigration, callback: (Query) -> Unit = {}): Migrations = - addQuery(up.name, up.script, down.script, callback) + fun addMigrationScript(up: DefinitionMigration, down: DefinitionMigration, callback: (MigrationScript) -> Unit = {}): Migrations = + addMigrationScript(up.name, up.script, down.script, callback) - fun addQuery(name: String, up: String, down: String, callback: (Query) -> Unit = {}): Migrations { + fun addMigrationScript(name: String, up: String, down: String, callback: (MigrationScript) -> Unit = {}): Migrations { if (migrationsScripts[name] === null) { - migrationsScripts[name] = Query(name, up, down, connection).apply { + migrationsScripts[name] = MigrationScript(name, up, down, connection).apply { doExecute = Action.UP } } else { diff --git a/src/main/kotlin/fr/postgresjson/utils/searchSqlFiles.kt b/src/main/kotlin/fr/postgresjson/utils/searchSqlFiles.kt index a46fd7b..ce194a8 100644 --- a/src/main/kotlin/fr/postgresjson/utils/searchSqlFiles.kt +++ b/src/main/kotlin/fr/postgresjson/utils/searchSqlFiles.kt @@ -5,6 +5,7 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import java.net.URI import java.net.URL +import java.nio.file.FileSystemNotFoundException import java.nio.file.FileSystems import java.nio.file.FileVisitOption import java.nio.file.Files @@ -16,11 +17,15 @@ fun URL.searchSqlFiles() = this.toURI().searchSqlFiles() fun URI.searchSqlFiles() = sequence { val logger: Logger = LoggerFactory.getLogger("sqlFilesSearch") val uri: URI = this@searchSqlFiles + logger.debug("""SQL files found in "${uri.toString().substringAfter('!')}" :""") if (uri.scheme == "jar") { - val relativePath = uri.toString().substringAfter('!') - FileSystems - .newFileSystem(uri, emptyMap()) - .getPath(relativePath) + try { + FileSystems.getFileSystem(uri) + } catch (e: FileSystemNotFoundException) { + FileSystems.newFileSystem(uri, emptyMap()) + } + + uri .walk(5) .asSequence() .filter { it.fileName.toString().endsWith(".sql") } diff --git a/src/test/kotlin/fr/postgresjson/MigrationTest.kt b/src/test/kotlin/fr/postgresjson/MigrationTest.kt index 5645a97..2f5daa3 100644 --- a/src/test/kotlin/fr/postgresjson/MigrationTest.kt +++ b/src/test/kotlin/fr/postgresjson/MigrationTest.kt @@ -16,7 +16,7 @@ class MigrationTest() : TestAbstract() { @Test fun `run up query`() { val resources = this::class.java.getResource("/sql/migrations").toURI() - val m = Migrations(resources, connection) + val m = Migrations(connection, resources) m.up().apply { this `should contain` Pair("1", Migration.Status.OK) size `should be equal to` 1