/** * Returns a Sqlg configuration (Apache Commons) based on the supplied Flyway configuration. */ protected org.apache.commons.configuration.Configuration sqlgConfiguration(Configuration configuration) { Map<String, Object> result = new LinkedHashMap<>(); // The most important part is getting the JDBC URL since that is required by Sqlg result.put(SqlgGraph.JDBC_URL, JdbcUrlDataSource.unwrap(configuration.getDataSource()).getJdbcUrl()); // Abuse the Flyway place holders as extra configuration parameters for Sqlg result.putAll(configuration.getPlaceholders()); return new MapConfiguration(result); }
/** * Return a Sqlg dialect based on the supplied Flyway configuration. */ protected SqlDialect sqlDialect(Configuration configuration) { // Mimic what Sqlg does to load a dialect String connectionUri = JdbcUrlDataSource.unwrap(configuration.getDataSource()).getJdbcUrl(); for (SqlgPlugin p : ServiceLoader.load(SqlgPlugin.class, SqlgGraph.class.getClassLoader())) { if (p.getDriverFor(connectionUri) != null) { return p.instantiateDialect(); } } throw new IllegalStateException("Unable to determine Sqlg dialect to use for JDBC URL: " + connectionUri); }
@Override public void migrate(Flyway flyway) { try { flyway.migrate(); } catch (FlywayException e) { if (e.getMessage().contains("1.15")) { logger.info("Found failed database migration. Attempting repair"); flyway.repair(); try { flyway.getConfiguration().getDataSource().getConnection().createStatement().executeUpdate("delete from PUBLIC.\"schema_version\" where \"version\" = '1.15' or \"version\" = '1.16'"); } catch (SQLException e1) { logger.error("Error while deleting old migration steps", e); } flyway.migrate(); } else { logger.error("Unable to migrate", e); throw e; } } } };
@SuppressWarnings("unused") @TaskAction public Object runTask() { try { Map<String, String> envVars = ConfigUtils.environmentVariablesToPropertyMap(); Set<URL> extraURLs = new HashSet<>(); if (isJavaProject()) { addClassesAndResourcesDirs(extraURLs); addConfigurationArtifacts(determineConfigurations(envVars), extraURLs); } ClassLoader classLoader = new URLClassLoader( extraURLs.toArray(new URL[0]), getProject().getBuildscript().getClassLoader()); Flyway flyway = Flyway.configure(classLoader).configuration(createFlywayConfig(envVars)).load(); Object result = run(flyway); ((DriverDataSource) flyway.getConfiguration().getDataSource()).shutdownDatabase(); return result; } catch (Exception e) { throw new FlywayException(collectMessages(e, "Error occurred while executing " + getName()), e); } }