TSK-516 verify schema version at startup

This commit is contained in:
BerndBreier 2018-06-13 17:19:22 +02:00 committed by Holger Hagen
parent 71a42b58fd
commit 4dedc761f1
4 changed files with 47 additions and 16 deletions

View File

@ -5,10 +5,12 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.apache.ibatis.jdbc.SqlRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -76,6 +78,40 @@ public class DbSchemaCreator {
return true;
}
public boolean isValidSchemaVersion(String expectedVersion) {
SqlRunner runner = null;
try {
Connection connection = dataSource.getConnection();
runner = new SqlRunner(connection);
LOGGER.debug(connection.getMetaData().toString());
String query = "select VERSION from TASKANA.TASKANA_SCHEMA_VERSION where "
+ "VERSION = (select max(VERSION) from TASKANA.TASKANA_SCHEMA_VERSION) "
+ "AND VERSION = '" + expectedVersion + "'";
Map<String, Object> queryResult = runner.selectOne(query, new Object[] {});
if (queryResult == null || queryResult.isEmpty()) {
LOGGER.error(
"Schema version not valid. The VERSION property in table TASKANA.TASKANA_SCHEMA_VERSION has not the expected value {}",
expectedVersion);
return false;
} else {
LOGGER.debug("Schema version is valid.");
return true;
}
} catch (Exception e) {
LOGGER.error(
"Schema version not valid. The VERSION property in table TASKANA.TASKANA_SCHEMA_VERSION has not the expected value {}",
expectedVersion);
return false;
} finally {
if (runner != null) {
runner.closeConnection();
}
}
}
public DataSource getDataSource() {
return dataSource;
}

View File

@ -49,13 +49,15 @@ public class TaskanaEngineConfiguration {
private static final String TASKANA_DOMAINS_PROPERTY = "taskana.domains";
private static final String TASKANA_CLASSIFICATION_TYPES_PROPERTY = "taskana.classification.types";
private static final String TASKANA_CLASSIFICATION_CATEGORIES_PROPERTY = "taskana.classification.categories";
protected static final String TASKANA_SCHEMA_VERSION = "0.9.2"; // must match the VERSION value in table
// TASKANA.TASKANA_SCHEMA_VERSION
// Taskana properties file
protected String propertiesFileName = TASKANA_PROPERTIES;
// Taskana datasource configuration
protected DataSource dataSource;
protected DbSchemaCreator dbScriptRunner;
protected DbSchemaCreator dbSchemaCreator;
// Taskana role configuration
protected String rolesSeparator = TASKANA_ROLES_SEPARATOR;
@ -114,8 +116,13 @@ public class TaskanaEngineConfiguration {
// use default In Memory datasource
this.dataSource = createDefaultDataSource();
}
dbScriptRunner = new DbSchemaCreator(this.dataSource);
dbScriptRunner.run();
dbSchemaCreator = new DbSchemaCreator(this.dataSource);
dbSchemaCreator.run();
if (!dbSchemaCreator.isValidSchemaVersion(TASKANA_SCHEMA_VERSION)) {
throw new SystemException(
"The Database Schema Version doesn't match the expected version " + TASKANA_SCHEMA_VERSION);
}
}

View File

@ -3,6 +3,7 @@ CREATE TABLE TASKANA.TASKANA_SCHEMA_VERSION(
VERSION VARCHAR(255) NOT NULL,
PRIMARY KEY (ID)
);
-- The VERSION value must match the value of TaskanaEngineConfiguration.TASKANA_SCHEMA_VERSION
INSERT INTO TASKANA.TASKANA_SCHEMA_VERSION VALUES ('1', '0.9.2');
CREATE TABLE TASKANA.CLASSIFICATION(

View File

@ -4,9 +4,6 @@ import java.sql.SQLException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pro.taskana.SpringTaskanaEngineImpl;
import pro.taskana.TaskanaEngine;
@ -15,8 +12,6 @@ import pro.taskana.TaskanaEngine;
*/
public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration {
private static final Logger logger = LoggerFactory.getLogger(SpringTaskanaEngineConfiguration.class);
public SpringTaskanaEngineConfiguration(DataSource dataSource, boolean useManagedTransactions,
boolean securityEnabled) throws SQLException {
super(dataSource, useManagedTransactions, securityEnabled);
@ -35,14 +30,6 @@ public class SpringTaskanaEngineConfiguration extends TaskanaEngineConfiguration
@Override
public TaskanaEngine buildTaskanaEngine() {
this.useManagedTransactions = true;
dbScriptRunner = new DbSchemaCreator(this.dataSource);
try {
dbScriptRunner.run();
} catch (SQLException e) {
logger.error("The taskana schema could not be created: ", e);
}
return new SpringTaskanaEngineImpl(this);
}