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 9e38a717bbe5ac67f5d1bef0d1712210abf99959..d2f6dff16c4c210c7d8e5784a782dddc741cbc25 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 @@ -53,6 +53,7 @@ import java.util.logging.Logger; import javax.annotation.Nullable; import static java.sql.Types.INTEGER; +import static java.util.Collections.singletonList; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static org.briarproject.bramble.api.db.Metadata.REMOVE; @@ -74,7 +75,7 @@ import static org.briarproject.bramble.db.ExponentialBackoff.calculateExpiry; abstract class JdbcDatabase implements Database<Connection> { // Package access for testing - static final int CODE_SCHEMA_VERSION = 38; + static final int CODE_SCHEMA_VERSION = 39; // Rotation period offsets for incoming transport keys private static final int OFFSET_PREV = -1; @@ -389,7 +390,7 @@ abstract class JdbcDatabase implements Database<Connection> { // Package access for testing List<Migration<Connection>> getMigrations() { - return Collections.emptyList(); + return singletonList(new Migration38_39()); } private void storeSchemaVersion(Connection txn, int version) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Migration38_39.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Migration38_39.java new file mode 100644 index 0000000000000000000000000000000000000000..2febcb1dc506208ea6f89ad09cb3babc5313975c --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Migration38_39.java @@ -0,0 +1,54 @@ +package org.briarproject.bramble.db; + +import org.briarproject.bramble.api.db.DbException; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.logging.Logger; + +import javax.annotation.Nullable; + +import static java.util.logging.Level.WARNING; + +class Migration38_39 implements Migration<Connection> { + + private static final Logger LOG = + Logger.getLogger(Migration38_39.class.getName()); + + @Override + public int getStartVersion() { + return 38; + } + + @Override + public int getEndVersion() { + return 39; + } + + @Override + public void migrate(Connection txn) throws DbException { + Statement s = null; + try { + s = txn.createStatement(); + // Add not null constraints + s.execute("ALTER TABLE outgoingKeys" + + " ALTER COLUMN contactId" + + " SET NOT NULL"); + s.execute("ALTER TABLE incomingKeys" + + " ALTER COLUMN contactId" + + " SET NOT NULL"); + } catch (SQLException e) { + tryToClose(s); + throw new DbException(e); + } + } + + private void tryToClose(@Nullable Statement s) { + try { + if (s != null) s.close(); + } catch (SQLException e) { + if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); + } + } +}