Skip to content

Commit

Permalink
#2283 - ddl-generator - Add DbMigration.addPlatform(Platform) with de…
Browse files Browse the repository at this point in the history
…fault sub-directory based on Platform
  • Loading branch information
rbygrave committed Aug 2, 2021
1 parent d601a88 commit 928b901
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -196,19 +196,23 @@ static DbMigration create() {
void setLockTimeout(int seconds);

/**
* Add an additional platform to write the migration DDL.
* Add a platform to write the migration DDL.
* <p>
* Use this when you want to generate sql scripts for multiple database platforms
* from the migration (e.g. generate migration sql for MySql, Postgres and Oracle).
* </p>
*/
void addPlatform(Platform platform);

/**
* Add a platform to write with a given prefix.
*/
void addPlatform(Platform platform, String prefix);

/**
* Add an additional databasePlatform to write the migration DDL.
* Add a databasePlatform to write the migration DDL.
* <p>
* Use this when you want to add preconfigured database platforms.
* </p>
*/
void addDatabasePlatform(DatabasePlatform databasePlatform, String prefix);

Expand Down Expand Up @@ -256,9 +260,9 @@ static DbMigration create() {
*
* migration.setPathToResources("src/main/resources");
*
* migration.addPlatform(Platform.POSTGRES, "pg");
* migration.addPlatform(Platform.MYSQL, "mysql");
* migration.addPlatform(Platform.ORACLE, "oracle");
* migration.addPlatform(Platform.POSTGRES);
* migration.addPlatform(Platform.MYSQL);
* migration.addPlatform(Platform.ORACLE);
*
* migration.generateMigration();
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -259,13 +259,12 @@ public void setPlatform(DatabasePlatform databasePlatform) {
}
}

/**
* Add an additional platform to write the migration DDL.
* <p>
* Use this when you want to generate sql scripts for multiple database platforms
* from the migration (e.g. generate migration sql for MySql, Postgres and Oracle).
* </p>
*/
@Override
public void addPlatform(Platform platform) {
String prefix = platform.base().name().toLowerCase();
addPlatform(platform, prefix);
}

@Override
public void addPlatform(Platform platform, String prefix) {
platforms.add(new Pair(getPlatform(platform), prefix));
Expand All @@ -286,7 +285,7 @@ public void addDatabasePlatform(DatabasePlatform databasePlatform, String prefix
*
* DbMigration migration = DbMigration.create();
* migration.setPathToResources("src/main/resources");
* migration.setPlatform(DbPlatformName.ORACLE);
* migration.setPlatform(Platform.ORACLE);
*
* migration.generateMigration();
*
Expand All @@ -298,9 +297,9 @@ public void addDatabasePlatform(DatabasePlatform databasePlatform, String prefix
* DbMigration migration = DbMigration.create();
* migration.setPathToResources("src/main/resources");
*
* migration.addPlatform(DbPlatformName.POSTGRES, "pg");
* migration.addPlatform(DbPlatformName.MYSQL, "mysql");
* migration.addPlatform(DbPlatformName.ORACLE, "mysql");
* migration.addPlatform(Platform.POSTGRES);
* migration.addPlatform(Platform.MYSQL);
* migration.addPlatform(Platform.ORACLE);
*
* migration.generateMigration();
*
Expand All @@ -318,10 +317,9 @@ public String generateInitMigration() throws IOException {
return generateMigrationFor(true);
}

private String generateMigrationFor(boolean dbinitMigration) throws IOException {

// use this flag to stop other plugins like full DDL generation
private String generateMigrationFor(boolean initMigration) throws IOException {
if (!online) {
// use this flag to stop other plugins like full DDL generation
DbOffline.setGenerateMigration();
if (databasePlatform == null && !platforms.isEmpty()) {
// for multiple platform generation the first platform
Expand All @@ -334,8 +332,8 @@ private String generateMigrationFor(boolean dbinitMigration) throws IOException
configurePlatforms();
}
try {
Request request = createRequest(dbinitMigration);
if (!dbinitMigration) {
Request request = createRequest(initMigration);
if (!initMigration) {
// repeatable migrations
if (platforms.isEmpty()) {
generateExtraDdl(request.migrationDir, databasePlatform, request.isTablePartitioning());
Expand Down Expand Up @@ -512,31 +510,31 @@ private String generatePendingDrop(Request request, String pendingVersion) throw
return version;
}

private Request createRequest(boolean dbinitMigration) {
return new Request(dbinitMigration);
private Request createRequest(boolean initMigration) {
return new Request(initMigration);
}

private class Request {

final boolean dbinitMigration;
final boolean initMigration;
final File migrationDir;
final File modelDir;
final CurrentModel currentModel;
final ModelContainer migrated;
final ModelContainer current;

private Request(boolean dbinitMigration) {
this.dbinitMigration = dbinitMigration;
private Request(boolean initMigration) {
this.initMigration = initMigration;
this.currentModel = new CurrentModel(server, constraintNaming);
this.current = currentModel.read();
this.migrationDir = getMigrationDirectory(dbinitMigration);
if (dbinitMigration) {
this.migrationDir = getMigrationDirectory(initMigration);
if (initMigration) {
this.modelDir = null;
this.migrated = new ModelContainer();
} else {
this.modelDir = getModelDirectory(migrationDir);
MigrationModel migrationModel = new MigrationModel(modelDir, modelSuffix);
this.migrated = migrationModel.read(dbinitMigration);
this.migrated = migrationModel.read(false);
}
}

Expand All @@ -551,7 +549,7 @@ String nextVersion() {
// always read the next version using the main migration directory (not dbinit)
File migDirectory = getMigrationDirectory(false);
File modelDir = getModelDirectory(migDirectory);
return LastMigration.nextVersion(migDirectory, modelDir, dbinitMigration);
return LastMigration.nextVersion(migDirectory, modelDir, initMigration);
}

/**
Expand Down Expand Up @@ -588,7 +586,7 @@ private String generateMigration(Request request, Migration dbMigration, String
String fullVersion = getFullVersion(request.nextVersion(), dropsFor);

logInfo("generating migration:%s", fullVersion);
if (!request.dbinitMigration && !writeMigrationXml(dbMigration, request.modelDir, fullVersion)) {
if (!request.initMigration && !writeMigrationXml(dbMigration, request.modelDir, fullVersion)) {
logError("migration already exists, not generating DDL");
return null;
} else {
Expand Down Expand Up @@ -782,17 +780,15 @@ File getMigrationDirectory() {
/**
* Return the file path to write the xml and sql to.
*/
File getMigrationDirectory(boolean dbinitMigration) {

File getMigrationDirectory(boolean initMigration) {
// path to src/main/resources in typical maven project
File resourceRootDir = new File(pathToResources);
if (!resourceRootDir.exists()) {
String msg = String.format("Error - path to resources %s does not exist. Absolute path is %s", pathToResources, resourceRootDir.getAbsolutePath());
throw new UnknownResourcePathException(msg);
}
String resourcePath = getMigrationPath(dbinitMigration);

// expect to be a path to something like - src/main/resources/dbmigration/model
String resourcePath = getMigrationPath(initMigration);
// expect to be a path to something like - src/main/resources/dbmigration
File path = new File(resourceRootDir, resourcePath);
if (!path.exists()) {
if (!path.mkdirs()) {
Expand All @@ -802,8 +798,8 @@ File getMigrationDirectory(boolean dbinitMigration) {
return path;
}

private String getMigrationPath(boolean dbinitMigration) {
return dbinitMigration ? migrationInitPath : migrationPath;
private String getMigrationPath(boolean initMigration) {
return initMigration ? migrationInitPath : migrationPath;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,12 @@ class LastMigration {
/**
* Return the next migation version given the migration directory.
*/
static String nextVersion(File migDir, File modelDir, boolean dbinitMigration) {

static String nextVersion(File migDir, File modelDir, boolean initMigration) {
String last = lastVersion(migDir, modelDir);
if (last == null) {
return null;
}
return (dbinitMigration) ? last : MigrationVersion.parse(last).nextVersion();
return (initMigration) ? last : MigrationVersion.parse(last).nextVersion();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,14 @@ public MigrationModel(File modelDirectory, String modelSuffix) {
* Read all the migrations returning the model with all
* the migrations applied in version order.
*
* @param dbinitMigration If true we don't apply model changes, migration is from scratch.
* @param initMigration If true we don't apply model changes, migration is from scratch.
*/
public ModelContainer read(boolean dbinitMigration) {

readMigrations(dbinitMigration);
public ModelContainer read(boolean initMigration) {
readMigrations(initMigration);
return model;
}

private void readMigrations(boolean dbinitMigration) {

private void readMigrations(boolean initMigration) {
// find all the migration xml files
File[] xmlFiles = modelDirectory.listFiles(pathname -> pathname.getName().toLowerCase().endsWith(modelSuffix));
if (xmlFiles == null || xmlFiles.length == 0) {
Expand All @@ -57,7 +55,7 @@ private void readMigrations(boolean dbinitMigration) {
// sort into version order before applying
Collections.sort(resources);

if (!dbinitMigration) {
if (!initMigration) {
for (MigrationResource migrationResource : resources) {
logger.debug("read {}", migrationResource);
model.apply(migrationResource.read(), migrationResource.getVersion());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,16 @@ public static void main(String[] args) throws IOException {

// migration.addPlatform(Platform.GENERIC, "generic"); there is no ddl handler for generic
// migration.addPlatform(Platform.SQLANYWHERE, "sqlanywhere"); and sqlanywhere
migration.addPlatform(Platform.DB2, "db2");
migration.addPlatform(Platform.H2, "h2");
migration.addPlatform(Platform.DB2);
migration.addPlatform(Platform.H2);
migration.addPlatform(Platform.HSQLDB, "hsqldb");
migration.addPlatform(Platform.MYSQL, "mysql");
migration.addPlatform(Platform.MYSQL55, "mysql55");
migration.addPlatform(Platform.POSTGRES, "postgres");
migration.addPlatform(Platform.ORACLE, "oracle");
migration.addPlatform(Platform.SQLITE, "sqlite");
migration.addPlatform(Platform.POSTGRES);
migration.addPlatform(Platform.ORACLE);
migration.addPlatform(Platform.SQLITE);
migration.addPlatform(Platform.SQLSERVER17, "sqlserver17");
migration.addPlatform(Platform.HANA, "hana");
migration.addPlatform(Platform.HANA);

DatabaseConfig config = new DatabaseConfig();
config.setName("migrationtest");
Expand Down

0 comments on commit 928b901

Please sign in to comment.