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 080a8ce8e28e0a9c8f4d232ed2da3b89c89004d1..707234b1ffa1c7272f649268e0cc9ff781523bc3 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 5f890edfa05170f652230370ddfeb4f995eccbe7..7e6138e48c6365edb65a61e9899a8e6677388b79 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<Connection> { - private static final int SCHEMA_VERSION = 33; - private static final int MIN_SCHEMA_VERSION = 33; + private static final int CODE_SCHEMA_VERSION = 33; private static final String CREATE_SETTINGS = "CREATE TABLE settings" @@ -323,17 +322,33 @@ abstract class JdbcDatabase implements Database<Connection> { 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<Connection> 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<Migration<Connection>> 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 0000000000000000000000000000000000000000..56b04effefaec5ca9e99e5b558d1d596c845c5fd --- /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<T> { + + /** + * 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; +}