Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow registering DriverInitializer for VerifyMigrationTask with ServiceLoader mechanism #3986

Merged
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
399ba49
Allow passing properties to a migration driver
C2H6O Mar 21, 2023
2d449c6
spotlessApply
C2H6O Mar 21, 2023
f48896e
Merge branch 'master' into lx/migration_driver_connection_properties
C2H6O Mar 23, 2023
3e782d9
Merge branch 'master' into lx/migration_driver_connection_properties
C2H6O Mar 23, 2023
a5c4b49
Merge branch 'master' into lx/migration_driver_connection_properties
C2H6O Mar 24, 2023
bd3ef8e
Add findFirst() to actually load the Driver class
C2H6O Mar 24, 2023
693b3a2
Merge branch 'master' into lx/migration_driver_connection_properties
C2H6O Mar 25, 2023
a879695
Merge branch 'master' into lx/migration_driver_connection_properties
C2H6O Mar 27, 2023
7991af0
Modify VerifyMigrationTask to accept connectionProperties and loading…
C2H6O Mar 27, 2023
bf6ac56
remove connectionProperties from SqlDelightDatabase
C2H6O Mar 27, 2023
d97e81a
different strategy with DriverInitializer
C2H6O Mar 28, 2023
037a269
fixups
C2H6O Mar 28, 2023
1617857
Merge branch 'master' into lx/migration_driver_connection_properties
C2H6O Mar 28, 2023
aeb66c4
try nullable DriverInitializer to see if it passing CI
C2H6O Mar 28, 2023
0a954cb
Test DriverInitializerImpl
C2H6O Apr 3, 2023
e75a3bf
ClassNotFoundException
C2H6O Apr 3, 2023
a8824c1
forgotten rename
C2H6O Apr 3, 2023
cb9df45
Use service loader mechanism
hfhbd Apr 4, 2023
c8dd79f
Expose the configuration name
hfhbd Apr 5, 2023
6c5a53f
Merge pull request #2 from cashapp/hfhbd/migration_driver_connection_…
C2H6O Apr 5, 2023
4e14be9
connectionProperties
C2H6O Apr 5, 2023
cf7a0d3
pass the Properties to DriverInitializer#execute
C2H6O Apr 5, 2023
f028b6b
change execute of impl to include Properties
C2H6O Apr 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import org.gradle.api.Project
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.internal.catalog.DelegatingProjectDependency
import org.gradle.api.provider.MapProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import java.io.File
Expand All @@ -32,6 +33,7 @@ abstract class SqlDelightDatabase @Inject constructor(
abstract val migrationOutputDirectory: DirectoryProperty
val migrationOutputFileFormat: Property<String> = project.objects.property(String::class.java).convention(".sql")
val generateAsync: Property<Boolean> = project.objects.property(Boolean::class.java).convention(false)
val connectionProperties: MapProperty<String, String> = project.objects.mapProperty(String::class.java, String::class.java)
C2H6O marked this conversation as resolved.
Show resolved Hide resolved

internal val configuration = project.configurations.create("${name}DialectClasspath").apply {
isCanBeConsumed = false
Expand Down Expand Up @@ -263,6 +265,7 @@ abstract class SqlDelightDatabase @Inject constructor(
it.verifyMigrations = verifyMigrations.get()
it.classpath.setFrom(configuration.fileCollection { true })
it.classpath.from(moduleConfiguration.fileCollection { true })
it.connectionProperties.set(connectionProperties)
}

if (schemaOutputDirectory.getOrNull() != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import app.cash.sqlite.migrations.findDatabaseFiles
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileTree
import org.gradle.api.logging.Logging
import org.gradle.api.provider.MapProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.IgnoreEmptyDirectories
Expand All @@ -29,8 +30,11 @@ import org.gradle.api.tasks.TaskAction
import org.gradle.workers.WorkAction
import org.gradle.workers.WorkParameters
import java.io.File
import java.util.Properties
import java.util.ServiceLoader

interface MigrationVerificationDriver

@CacheableTask
abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
@Suppress("unused")
Expand All @@ -51,6 +55,8 @@ abstract class VerifyMigrationTask : SqlDelightWorkerTask() {

@Input var verifyDefinitions: Boolean = true

@get:Input abstract val connectionProperties: MapProperty<String, String>
C2H6O marked this conversation as resolved.
Show resolved Hide resolved

/* Tasks without an output are never considered UP-TO-DATE by Gradle. Adding an output file that's created when the
* task completes successfully works around the lack of an output for this task. There may be a better solution once
* https://github.com/gradle/gradle/issues/14223 is resolved. */
Expand All @@ -68,6 +74,7 @@ abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
it.verifyMigrations.set(verifyMigrations)
it.compilationUnit.set(compilationUnit)
it.verifyDefinitions.set(verifyDefinitions)
it.connectionProperties.set(connectionProperties.get())
}
workQueue.await()
}.onSuccess {
Expand All @@ -92,6 +99,7 @@ abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
val compilationUnit: Property<SqlDelightCompilationUnit>
val verifyMigrations: Property<Boolean>
val verifyDefinitions: Property<Boolean>
val connectionProperties: MapProperty<String, String>
}

abstract class VerifyMigrationAction : WorkAction<VerifyMigrationWorkParameters> {
Expand All @@ -116,7 +124,13 @@ abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
if (!environment.dialect.isSqlite) return
parameters.workingDirectory.get().asFile.deleteRecursively()

val catalog = createCurrentDb()
val connectionPropertiesMap = parameters.connectionProperties.get()
val connectionProperties = Properties()
connectionPropertiesMap.forEach { (key, value) ->
connectionProperties[key] = value
}
ServiceLoader.load(MigrationVerificationDriver::class.java).findFirst()
val catalog = createCurrentDb(connectionProperties)

val databaseFiles = sourceFolders.asSequence()
.findDatabaseFiles()
Expand All @@ -126,13 +140,13 @@ abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
}

databaseFiles.forEach { dbFile ->
checkMigration(dbFile, catalog)
checkMigration(dbFile, catalog, connectionProperties)
}

checkForGaps()
}

private fun createCurrentDb(): CatalogDatabase {
private fun createCurrentDb(connectionProperties: Properties): CatalogDatabase {
val sourceFiles = ArrayList<SqlDelightQueriesFile>()
environment.forSourceFiles { file ->
if (file is SqlDelightQueriesFile) sourceFiles.add(file)
Expand All @@ -143,11 +157,11 @@ abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
) { sqlText ->
initStatements.add(CatalogDatabase.InitStatement(sqlText, "Error compiling $sqlText"))
}
return CatalogDatabase.withInitStatements(initStatements)
return CatalogDatabase.withInitStatements(initStatements, connectionProperties)
}

private fun checkMigration(dbFile: File, currentDb: CatalogDatabase) {
val actualCatalog = createActualDb(dbFile)
private fun checkMigration(dbFile: File, currentDb: CatalogDatabase, connectionProperties: Properties) {
val actualCatalog = createActualDb(dbFile, connectionProperties)
val databaseComparator = ObjectDifferDatabaseComparator(
ignoreDefinitions = !parameters.verifyDefinitions.get(),
circularReferenceExceptionLogger = {
Expand All @@ -164,7 +178,7 @@ abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
}
}

private fun createActualDb(dbFile: File): CatalogDatabase {
private fun createActualDb(dbFile: File, connectionProperties: Properties): CatalogDatabase {
val version = dbFile.nameWithoutExtension.toInt()
val copy = dbFile.copyTo(File(parameters.workingDirectory.get().asFile, dbFile.name))
val initStatements = ArrayList<CatalogDatabase.InitStatement>()
Expand All @@ -182,7 +196,7 @@ abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
)
}
}
return CatalogDatabase.fromFile(copy.absolutePath, initStatements).also { copy.delete() }
return CatalogDatabase.fromFile(copy.absolutePath, initStatements, connectionProperties).also { copy.delete() }
}

private fun checkForGaps() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import schemacrawler.tools.utility.SchemaCrawlerUtility
import java.sql.Connection
import java.sql.DriverManager
import java.sql.SQLException
import java.util.Properties

class CatalogDatabase private constructor(
internal val catalog: Catalog,
Expand All @@ -28,21 +29,28 @@ class CatalogDatabase private constructor(
.toOptions(),
)

fun withInitStatements(initStatements: List<InitStatement>): CatalogDatabase {
return fromFile("", initStatements)
fun withInitStatements(
initStatements: List<InitStatement>,
connectionProperties: Properties,
): CatalogDatabase {
return fromFile("", initStatements, connectionProperties)
}

fun fromFile(path: String, initStatements: List<InitStatement>): CatalogDatabase {
return createConnection(path).init(initStatements).use {
fun fromFile(
path: String,
initStatements: List<InitStatement>,
connectionProperties: Properties,
): CatalogDatabase {
return createConnection(path, connectionProperties).init(initStatements).use {
CatalogDatabase(SchemaCrawlerUtility.getCatalog(it, schemaCrawlerOptions))
}
}

private fun createConnection(path: String): Connection {
private fun createConnection(path: String, connectionProperties: Properties): Connection {
return try {
DriverManager.getConnection("jdbc:sqlite:$path")
DriverManager.getConnection("jdbc:sqlite:$path", connectionProperties)
} catch (e: SQLException) {
DriverManager.getConnection("jdbc:sqlite:$path")
DriverManager.getConnection("jdbc:sqlite:$path", connectionProperties)
}
}

Expand Down