From 4c611583267c26ee207d2ac5c39ef7ddad62843e Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 31 Jan 2018 11:50:00 +0000 Subject: [PATCH] Migrate database schema if a migration is available. --- .../bramble/db/DatabaseConstants.java | 6 ---- .../briarproject/bramble/db/JdbcDatabase.java | 35 +++++++++++++------ .../briarproject/bramble/db/Migration.java | 18 ++++++++++ 3 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/db/Migration.java diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseConstants.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseConstants.java index 080a8ce8e..707234b1f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseConstants.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseConstants.java @@ -23,10 +23,4 @@ interface DatabaseConstants { */ String SCHEMA_VERSION_KEY = "schemaVersion"; - /** - * The {@link Settings} key under which the minimum supported database - * schema version is stored. - */ - String MIN_SCHEMA_VERSION_KEY = "minSchemaVersion"; - } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index 8b8c3562a..9cbc48e1a 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -47,6 +47,7 @@ import java.util.logging.Logger; import javax.annotation.Nullable; +import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.api.db.Metadata.REMOVE; import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; @@ -57,7 +58,6 @@ import static org.briarproject.bramble.api.sync.ValidationManager.State.INVALID; import static org.briarproject.bramble.api.sync.ValidationManager.State.PENDING; import static org.briarproject.bramble.api.sync.ValidationManager.State.UNKNOWN; import static org.briarproject.bramble.db.DatabaseConstants.DB_SETTINGS_NAMESPACE; -import static org.briarproject.bramble.db.DatabaseConstants.MIN_SCHEMA_VERSION_KEY; import static org.briarproject.bramble.db.DatabaseConstants.SCHEMA_VERSION_KEY; import static org.briarproject.bramble.db.ExponentialBackoff.calculateExpiry; @@ -68,8 +68,7 @@ import static org.briarproject.bramble.db.ExponentialBackoff.calculateExpiry; @NotNullByDefault abstract class JdbcDatabase implements Database { - private static final int SCHEMA_VERSION = 30; - private static final int MIN_SCHEMA_VERSION = 30; + private static final int CODE_SCHEMA_VERSION = 30; private static final String CREATE_SETTINGS = "CREATE TABLE settings" @@ -310,17 +309,33 @@ abstract class JdbcDatabase implements Database { private boolean checkSchemaVersion(Connection txn) throws DbException { Settings s = getSettings(txn, DB_SETTINGS_NAMESPACE); - int schemaVersion = s.getInt(SCHEMA_VERSION_KEY, -1); - if (schemaVersion == SCHEMA_VERSION) return true; - if (schemaVersion < MIN_SCHEMA_VERSION) return false; - int minSchemaVersion = s.getInt(MIN_SCHEMA_VERSION_KEY, -1); - return SCHEMA_VERSION >= minSchemaVersion; + int dataSchemaVersion = s.getInt(SCHEMA_VERSION_KEY, -1); + if (dataSchemaVersion == CODE_SCHEMA_VERSION) return true; + if (CODE_SCHEMA_VERSION < dataSchemaVersion) return false; + // Do we have a suitable migration? + for (Migration m : getMigrations()) { + int start = m.getStartVersion(), end = m.getEndVersion(); + if (start == dataSchemaVersion && end == CODE_SCHEMA_VERSION) { + if (LOG.isLoggable(INFO)) + LOG.info("Migrating from schema " + start + " to " + end); + // Apply the migration + m.migrate(txn); + // Store the new schema version + storeSchemaVersion(txn); + return true; + } + } + // No suitable migration + return false; + } + + private Collection> getMigrations() { + return Collections.emptyList(); } private void storeSchemaVersion(Connection txn) throws DbException { Settings s = new Settings(); - s.putInt(SCHEMA_VERSION_KEY, SCHEMA_VERSION); - s.putInt(MIN_SCHEMA_VERSION_KEY, MIN_SCHEMA_VERSION); + s.putInt(SCHEMA_VERSION_KEY, CODE_SCHEMA_VERSION); mergeSettings(txn, s, DB_SETTINGS_NAMESPACE); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Migration.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Migration.java new file mode 100644 index 000000000..56b04effe --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Migration.java @@ -0,0 +1,18 @@ +package org.briarproject.bramble.db; + +import org.briarproject.bramble.api.db.DbException; + +interface Migration { + + /** + * Returns the schema version from which this migration starts. + */ + int getStartVersion(); + + /** + * Returns the schema version at which this migration ends. + */ + int getEndVersion(); + + void migrate(T txn) throws DbException; +}