diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java index 381f9e93d7f33126244469b33b9d9998b1b97816..8467b489cbbddb20dbec7ec2eb28f76cd77de7ba 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java @@ -264,6 +264,8 @@ public final class DBMigrationEngine do { final String nextVersion = increment(version); + final Script functionMigrationScriptOrNull = + scriptProvider.tryGetFunctionMigrationScript(version, nextVersion); final Script migrationScript = scriptProvider.tryGetMigrationScript(version, nextVersion); if (migrationScript == null) @@ -281,6 +283,10 @@ public final class DBMigrationEngine migrationStepExecutorAdmin.performPreMigration(); migrationStepExecutor.performPreMigration(); scriptExecutor.execute(migrationScript, true, logDAO); + if (functionMigrationScriptOrNull != null) + { + scriptExecutor.execute(functionMigrationScriptOrNull, false, logDAO); + } migrationStepExecutor.performPostMigration(); migrationStepExecutorAdmin.performPostMigration(); migrationStepExecutor.finish(); diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/ISqlScriptProvider.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/ISqlScriptProvider.java index 44b071ee8d922abd2858cd122977162f4bfdce3f..f5f57a9f20bad3bd538b4752edef896fa317465f 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/ISqlScriptProvider.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/ISqlScriptProvider.java @@ -28,9 +28,9 @@ import ch.systemsx.cisd.common.Script; public interface ISqlScriptProvider { /** - * Returns <code>true</code> if this script provider is suitable for a dump restore of the - * given <var>version</var> of the database, and <code>false</code>, if it is suitable for a - * regular setup. + * Returns <code>true</code> if this script provider is suitable for a dump restore of the given + * <var>version</var> of the database, and <code>false</code>, if it is suitable for a regular + * setup. */ public boolean isDumpRestore(String version); @@ -77,7 +77,7 @@ public interface ISqlScriptProvider * </pre> */ public Script tryGetGrantsScript(final String version); - + /** * Returns the script to create initial data. * @@ -95,4 +95,14 @@ public interface ISqlScriptProvider */ public Script tryGetMigrationScript(String fromVersion, String toVersion); + /** + * Returns the function migration script for migrating a database. The function migration will + * always be called <i>after</i> the regular migration script. + * + * @param fromVersion The version of the current database. + * @param toVersion The version of the database after migration. + * @return <code>null</code> if there isn't such a migration script. + */ + public Script tryGetFunctionMigrationScript(String fromVersion, String toVersion); + } diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java index 363dae5510a118ccf309a5045df31a70548247af..353535bbcdd016b37b20be2a0827ac5c066597c3 100644 --- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java +++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java @@ -172,6 +172,23 @@ public class SqlScriptProvider implements ISqlScriptProvider return tryLoadScript(scriptName, toVersion, "migration"); } + /** + * Returns the function migration script for the specified versions. The name of the script is + * expected to be + * + * <pre> + * <schema script folder>/migration/function_migration-<fromVersion>-<toVersion>.sql + * </pre> + * + * The function migration will always be called <i>after</i> the regular migration script. + */ + public Script tryGetFunctionMigrationScript(final String fromVersion, final String toVersion) + { + final String scriptName = + "function_migration-" + fromVersion + "-" + toVersion + SQL_FILE_TYPE; + return tryLoadScript(scriptName, toVersion, "migration"); + } + private Script tryLoadScript(final String scriptName, final String scriptVersion) { return tryLoadScript(scriptName, scriptVersion, scriptVersion); diff --git a/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/DBMigrationEngineTest.java b/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/DBMigrationEngineTest.java index 19c1aad3fb52f49fcc6ab447036846b8779c14df..758fa208adb258f08ecaafe14c098da4407005b6 100644 --- a/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/DBMigrationEngineTest.java +++ b/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/DBMigrationEngineTest.java @@ -521,10 +521,12 @@ public class DBMigrationEngineTest one(scriptProvider).tryGetMigrationScript(fromVersion, "100"); final Script script = new Script("m-099-100", "code 099 100", toVersion); expectSuccessfulScriptExecutionWithMigrationSteps(script, true); + one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, "100"); one(scriptProvider).tryGetMigrationScript("100", toVersion); expectSuccessfulScriptExecutionWithMigrationSteps(new Script("m-100-101", "code 100 101", toVersion), true); + one(scriptProvider).tryGetFunctionMigrationScript("100", toVersion); one(adminDAO).getDatabaseName(); will(returnValue("my 2. database")); @@ -582,8 +584,8 @@ public class DBMigrationEngineTest will(returnValue("my 1. database")); one(scriptProvider).tryGetMigrationScript(fromVersion, "100"); final Script script = new Script("m-099-100", "code 099 100", toVersion); - will(returnValue(script)); + one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, "100"); one(migrationStepExecutorAdmin).init(script); one(migrationStepExecutorAdmin).performPreMigration(); @@ -645,6 +647,7 @@ public class DBMigrationEngineTest one(scriptProvider).tryGetMigrationScript(fromVersion, "100"); final Script script = new Script("m-099-100", "code 099 100", toVersion); will(returnValue(script)); + one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, "100"); one(migrationStepExecutorAdmin).init(script); one(migrationStepExecutorAdmin).performPreMigration(); @@ -703,6 +706,7 @@ public class DBMigrationEngineTest one(adminDAO).getDatabaseName(); will(returnValue("my 1. database")); one(scriptProvider).tryGetMigrationScript(fromVersion, "100"); + one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, "100"); one(adminDAO).getDatabaseName(); will(returnValue("my 2. database")); } @@ -955,6 +959,7 @@ public class DBMigrationEngineTest one(scriptProvider).tryGetMigrationScript(fromVersion, toVersion); final Script script = new Script("m-1-2", "code", toVersion); will(returnValue(script)); + one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, toVersion); one(migrationStepExecutor).init(script); one(migrationStepExecutor).performPreMigration();