From 64f4b4bd28807c4025aab04bd2351fe8bbcd7b2a Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Sat, 7 Jul 2018 23:04:31 +0200
Subject: [PATCH] Check database migration level on initialization

---
 .../java/de/thm/arsnova/dao/CouchDBDao.java     | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index ff920df12..1e1b71a39 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -82,6 +82,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
 @Component("databaseDao")
 public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware {
 
+	private static final int EXPECTED_MIGRATION_LEVEL = 11;
 	private static final int BULK_PARTITION_SIZE = 500;
 
 	@Autowired
@@ -542,12 +543,21 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	private Database getDatabase() {
 		if (database == null) {
 			try {
+				logger.info("Initializing database connection.");
 				final com.fourspaces.couchdb.Session session = new com.fourspaces.couchdb.Session(
 						databaseHost,
 						databasePort
 						);
 				database = session.getDatabase(databaseName);
-			} catch (final Exception e) {
+				final int migrationLevel = getExpectedMigrationLevel();
+				if (migrationLevel < EXPECTED_MIGRATION_LEVEL) {
+					logger.warn("Database migration level is lower than expected. Please run the migration scripts.");
+				} else if (migrationLevel > EXPECTED_MIGRATION_LEVEL) {
+					logger.warn("Database migration level is higher than expected.");
+				} else {
+					logger.info("Database migration status: OK");
+				}
+			} catch (final IOException e) {
 				logger.error("Cannot connect to CouchDB database '{}' on host '{}' using port {}.",
 						databaseName, databaseHost, databasePort, e);
 			}
@@ -556,6 +566,11 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		return database;
 	}
 
+	private int getExpectedMigrationLevel() throws IOException {
+		Document d = database.getDocument("arsnova_migrations");
+		return d.getInt("version");
+	}
+
 	@Caching(evict = {@CacheEvict(value = "skillquestions", key = "#session"),
 			@CacheEvict(value = "lecturequestions", key = "#session", condition = "#question.getQuestionVariant().equals('lecture')"),
 			@CacheEvict(value = "preparationquestions", key = "#session", condition = "#question.getQuestionVariant().equals('preparation')"),
-- 
GitLab