private static void populateModulesWithEvolutions() { /** Check that evolutions are enabled **/ if (!isModuleEvolutionDisabled()) { for (Entry<String, VirtualFile> moduleRoot : Play.modules.entrySet()) { if (moduleRoot.getValue().child("db/evolutions").exists()) { if (!isModuleEvolutionDisabled(moduleRoot.getKey())) { modulesWithEvolutions.put(moduleRoot.getKey(), moduleRoot.getValue().child("db/evolutions")); } else { System.out.println("~ '" + moduleRoot.getKey() + "' module evolutions are disabled."); } } } } else { System.out.println("~ Module evolutions are disabled."); } addMainProjectToModuleList(); }
System.out.println("# ------------------------------------------------------------------------------"); System.out.println(""); System.out.println(toHumanReadableScript(evolutions)); System.out.println(""); System.out.println("# ------------------------------------------------------------------------------"); System.out.println(""); if (applyScript(dbName, true, moduleRoot.getKey(), moduleRoot.getValue())) { System.out.println("~"); System.out.println("~ Evolutions script successfully applied for " + moduleRoot.getKey() + "!");
@Override public void onApplicationStart() { if (!isDisabled()) { populateModulesWithEvolutions(); if (Play.mode.isProd()) { try { checkEvolutionsState(); } catch (InvalidDatabaseRevision e) { Logger.warn(""); Logger.warn("Your database is not up to date."); Logger.warn("Use `play evolutions` command to manage database evolutions."); throw e; } } } }
populateModulesWithSpecificModules(); } else { populateModulesWithEvolutions(); Evolution database = listDatabaseEvolutions(dbName, moduleRoot.getKey()).peek(); Evolution application = listApplicationEvolutions(dbName, moduleRoot.getKey(), moduleRoot.getValue()).peek(); needToCheck = handleResolveAction(dbName, moduleRoot); checkEvolutionsState(dbName); } catch (InconsistentDatabase e) { defaultExitCode = false; List<Evolution> evolutions = getEvolutionScript(dbName, moduleRoot.getKey(), moduleRoot.getValue()); if (evolutions.isEmpty()) { System.out.println("~ Your database " + dbName + " is up to date for " + moduleRoot.getKey()); } else { if ("apply".equals(System.getProperty("mode"))) { if (!handleApplyAction(dbName, moduleRoot, evolutions)) { defaultExitCode = false; if (!handleMarkAppliedAction(dbName, moduleRoot, evolutions)) { defaultExitCode = false; handleDefaultAction(dbName, moduleRoot, evolutions);
@Override public void beforeInvocation() { if (isDisabled() || Play.mode.isProd()) { return; } try { checkEvolutionsState(); } catch (InvalidDatabaseRevision e) { Set<String> dbNames = Configuration.getDbNames(); for (String dbName : dbNames) { Configuration dbConfig = new Configuration(dbName); for (Entry<String, VirtualFile> moduleRoot : modulesWithEvolutions.entrySet()) { if ("mem".equals(dbConfig.getProperty("db")) && listDatabaseEvolutions(e.getDbName(), moduleRoot.getKey()).peek().revision == 0) { Logger.info("Automatically applying evolutions in in-memory database"); Logger.info("Applying evolutions for '" + moduleRoot.getKey() + "'"); applyScript(true, moduleRoot.getKey(), moduleRoot.getValue()); } else { throw e; } } } } }
/** * Method to handle the "resolve" action * * @param dbName * database name * @param moduleRoot * the module root of evolutions * @return true if need to check, false otherwise */ private static boolean handleResolveAction(String dbName, Entry<String, VirtualFile> moduleRoot) { try { checkEvolutionsState(dbName); System.out.println("~"); System.out.println("~ Nothing to resolve for " + moduleRoot.getKey() + "..."); System.out.println("~"); return false; } catch (InconsistentDatabase e) { resolve(dbName, moduleRoot.getKey(), e.getRevision()); System.out.println("~"); System.out.println("~ Revision " + e.getRevision() + " for " + moduleRoot.getKey() + " has been resolved;"); System.out.println("~"); } catch (InvalidDatabaseRevision e) { // see later } return true; }
@Override public boolean rawInvocation(Request request, Response response) throws Exception { // Mark an evolution as resolved if (Play.mode.isDev() && request.method.equals("POST") && request.url.matches("^/@evolutions/force/[a-zA-Z0-9]+/[0-9]+$")) { int index = request.url.lastIndexOf("/@evolutions/force/") + "/@evolutions/force/".length(); String dbName = DB.DEFAULT; String moduleKey = request.url.substring(index, request.url.lastIndexOf("/")); int revision = Integer.parseInt(request.url.substring(request.url.lastIndexOf("/") + 1)); resolve(dbName, moduleKey, revision); new Redirect("/").apply(request, response); return true; } // Apply the current evolution script if (Play.mode.isDev() && request.method.equals("POST") && request.url.equals("/@evolutions/apply")) { for (Entry<String, VirtualFile> moduleRoot : modulesWithEvolutions.entrySet()) { applyScript(true, moduleRoot.getKey(), moduleRoot.getValue()); } new Redirect("/").apply(request, response); return true; } return super.rawInvocation(request, response); }
public static synchronized boolean applyScript(String dbName, boolean runScript, String moduleKey, VirtualFile evolutionsDirectory) { try { Connection connection = EvolutionQuery.getNewConnection(dbName, Evolutions.autoCommit()); int applying = -1; try { List<Evolution> evolutions = getEvolutionScript(dbName, moduleKey, evolutionsDirectory); for (Evolution evolution : evolutions) { applying = evolution.revision; if (!Evolutions.autoCommit()) { connection.commit(); } catch (Exception e) { Logger.error(e, "Can't apply evolution"); if (Evolutions.autoCommit()) { String message = e.getMessage(); if (e instanceof SQLException) {
public static synchronized Stack<Evolution> listDatabaseEvolutions(String dbName, String moduleKey) { Stack<Evolution> evolutions = new Stack<>(); evolutions.add(new Evolution("", 0, "", "", false)); Connection connection = null; try { connection = EvolutionQuery.getNewConnection(dbName); // Do we have a if (isEvolutionsTableExist(connection)) { checkAndUpdateEvolutionsForMultiModuleSupport(dbName, connection); ResultSet databaseEvolutions = EvolutionQuery.getEvolutions(connection, moduleKey); while (databaseEvolutions.next()) { Evolution evolution = new Evolution(moduleKey, databaseEvolutions.getInt(1), databaseEvolutions.getString(3), databaseEvolutions.getString(4), false); evolutions.add(evolution); } } else { EvolutionQuery.createTable(dbName); } } catch (SQLException e) { Logger.error(e, "SQL error while checking play evolutions"); } finally { EvolutionQuery.closeConnection(connection); } Collections.sort(evolutions); return evolutions; }
List<Evolution> evolutionScript = getEvolutionScript(dbName, moduleRoot.getKey(), moduleRoot.getValue()); Connection connection = null; ResultSet resultSet = null; throw new InvalidDatabaseRevision(dbName, toHumanReadableScript(evolutionScript));
public static synchronized boolean applyScript(boolean runScript, String moduleKey, VirtualFile evolutionsDirectory) { // Look over all the DB Set<String> dBNames = Configuration.getDbNames(); for (String dbName : dBNames) { return applyScript(dbName, runScript, moduleKey, evolutionsDirectory); } return true; }
public static synchronized void checkEvolutionsState() { // Look over all the DB Set<String> dBNames = Configuration.getDbNames(); for (String dbName : dBNames) { checkEvolutionsState(dbName); } }
/** * Method to handle the "markApplied" action * * @param dbName * database name * @param moduleRoot * the module root of evolutions * @param evolutions * list of evolutions * @return true if action was applied successfully, false otherwise */ private static boolean handleMarkAppliedAction(String dbName, Entry<String, VirtualFile> moduleRoot, List<Evolution> evolutions) { if (applyScript(dbName, false, moduleRoot.getKey(), moduleRoot.getValue())) { System.out.println("~ Evolutions script marked as applied for " + moduleRoot.getKey() + "!"); System.out.println("~"); return true; } else { System.out.println("~ Can't apply evolutions for " + moduleRoot.getKey() + "..."); System.out.println("~"); return false; } }
private static void populateModulesWithSpecificModules() { String[] specificModules = System.getProperty("modules").split(","); System.out.println("~ You've requested running evolutions only for these modules: "); for (String specificModule : specificModules) { System.out.println("~~ '" + specificModule + "'"); } System.out.println("~"); boolean weShouldAddTheMainProject = false; for (String specificModule : specificModules) { if (Play.modules.containsKey(specificModule)) { VirtualFile moduleRoot = Play.modules.get(specificModule); if (!isModuleEvolutionDisabled(specificModule) && moduleRoot.child("db/evolutions").exists()) { modulesWithEvolutions.put(specificModule, moduleRoot.child("db/evolutions")); } else { System.out.println( "~ '" + specificModule + "' module doesn't have any evolutions scripts in it or evolutions are disabled."); System.out.println("~"); System.exit(-1); } } else if (Play.configuration.getProperty("application.name").equals(specificModule)) { weShouldAddTheMainProject = true; } else { System.out.println("~ Couldn't find a module with the name '" + specificModule + "'. "); System.exit(-1); } } if (weShouldAddTheMainProject) { addMainProjectToModuleList(); } }