diff --git a/briar-api/src/org/briarproject/api/StringMap.java b/briar-api/src/org/briarproject/api/StringMap.java index e0480bbfa8279f44bfe47fa308a5463879dc98b6..7b897f45e69ae4449a91530f9bc936dbc686d6d6 100644 --- a/briar-api/src/org/briarproject/api/StringMap.java +++ b/briar-api/src/org/briarproject/api/StringMap.java @@ -26,4 +26,18 @@ abstract class StringMap extends Hashtable<String, String> { public void putBoolean(String key, boolean value) { put(key, String.valueOf(value)); } + + public int getInt(String key, int defaultValue) { + String s = get(key); + if (s == null) return defaultValue; + try { + return Integer.valueOf(s); + } catch (NumberFormatException e) { + return defaultValue; + } + } + + public void putInt(String key, int value) { + put(key, String.valueOf(value)); + } } diff --git a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java index 63125cc02c9f195edd72f80baabf8e4ee9dd885e..33f89394990eae130346a5788f2bae17340d5222 100644 --- a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java +++ b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java @@ -31,7 +31,7 @@ import java.util.Map; public interface DatabaseComponent { /** Opens the database and returns true if the database already existed. */ - boolean open() throws DbException, IOException; + boolean open() throws DbException; /** Waits for any open transactions to finish and closes the database. */ void close() throws DbException, IOException; diff --git a/briar-core/src/org/briarproject/db/Database.java b/briar-core/src/org/briarproject/db/Database.java index 917744c8029d7fb3593f00b7fe4d86d57a871bdc..e539d8d4cf834e30efe0290b23ed65af9b757634 100644 --- a/briar-core/src/org/briarproject/db/Database.java +++ b/briar-core/src/org/briarproject/db/Database.java @@ -40,7 +40,7 @@ interface Database<T> { * <p> * Locking: write. */ - boolean open() throws DbException, IOException; + boolean open() throws DbException; /** * Prevents new transactions from starting, waits for all current diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java index 833f850a22bf7bd34dba5079f65095543557b24f..2b01c7e6f5fb96398b0d987a5cac237007db8f49 100644 --- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java +++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java @@ -94,7 +94,7 @@ class DatabaseComponentImpl<T> implements DatabaseComponent { this.shutdown = shutdown; } - public boolean open() throws DbException, IOException { + public boolean open() throws DbException { Runnable shutdownHook = new Runnable() { public void run() { lock.writeLock().lock(); diff --git a/briar-core/src/org/briarproject/db/H2Database.java b/briar-core/src/org/briarproject/db/H2Database.java index de8997334865328aee105f3dc6cf06c5e5eefb2d..c786ea319cc6750e558f3ff9a04affc05e4dd6f3 100644 --- a/briar-core/src/org/briarproject/db/H2Database.java +++ b/briar-core/src/org/briarproject/db/H2Database.java @@ -6,7 +6,6 @@ import org.briarproject.api.system.Clock; import org.briarproject.util.StringUtils; import java.io.File; -import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -18,7 +17,7 @@ import javax.inject.Inject; /** Contains all the H2-specific code for the database. */ class H2Database extends JdbcDatabase { - private static final String HASH_TYPE = "BINARY(48)"; + private static final String HASH_TYPE = "BINARY(32)"; private static final String BINARY_TYPE = "BINARY"; private static final String COUNTER_TYPE = "INT NOT NULL AUTO_INCREMENT"; private static final String SECRET_TYPE = "BINARY(32)"; @@ -30,13 +29,14 @@ class H2Database extends JdbcDatabase { H2Database(DatabaseConfig config, Clock clock) { super(HASH_TYPE, BINARY_TYPE, COUNTER_TYPE, SECRET_TYPE, clock); this.config = config; - String path = new File(config.getDatabaseDirectory(), "db").getAbsolutePath(); + File dir = config.getDatabaseDirectory(); + String path = new File(dir, "db").getAbsolutePath(); // FIXME: Remove WRITE_DELAY=0 after implementing BTPv2? url = "jdbc:h2:split:" + path + ";CIPHER=AES;MULTI_THREADED=1" + ";WRITE_DELAY=0;DB_CLOSE_ON_EXIT=false"; } - public boolean open() throws DbException, IOException { + public boolean open() throws DbException { boolean reopen = config.databaseExists(); if (!reopen) config.getDatabaseDirectory().mkdirs(); super.open("org.h2.Driver", reopen); diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java index fc892e513341571d8b8863ef90925a8aa9d4c4ea..9f2f2c9a9e1bdd23d9d473c578037910936ad52c 100644 --- a/briar-core/src/org/briarproject/db/JdbcDatabase.java +++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java @@ -25,7 +25,6 @@ import org.briarproject.api.transport.IncomingKeys; import org.briarproject.api.transport.OutgoingKeys; import org.briarproject.api.transport.TransportKeys; -import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -271,8 +270,7 @@ abstract class JdbcDatabase implements Database<Connection> { this.clock = clock; } - protected void open(String driverClass, boolean reopen) throws DbException, - IOException { + protected void open(String driverClass, boolean reopen) throws DbException { // Load the JDBC driver try { Class.forName(driverClass); @@ -286,10 +284,7 @@ abstract class JdbcDatabase implements Database<Connection> { if (!checkSchemaVersion(txn)) throw new DbException(); } else { createTables(txn); - Settings s = new Settings(); - s.put("schemaVersion", String.valueOf(SCHEMA_VERSION)); - s.put("minSchemaVersion", String.valueOf(MIN_SCHEMA_VERSION)); - mergeSettings(txn, s, "db"); + storeSchemaVersion(txn); } commitTransaction(txn); } catch (DbException e) { @@ -299,16 +294,19 @@ abstract class JdbcDatabase implements Database<Connection> { } private boolean checkSchemaVersion(Connection txn) throws DbException { - try { - Settings s = getSettings(txn, "db"); - int schemaVersion = Integer.valueOf(s.get("schemaVersion")); - if (schemaVersion == SCHEMA_VERSION) return true; - if (schemaVersion < MIN_SCHEMA_VERSION) return false; - int minSchemaVersion = Integer.valueOf(s.get("minSchemaVersion")); - return SCHEMA_VERSION >= minSchemaVersion; - } catch (NumberFormatException e) { - throw new DbException(e); - } + Settings s = getSettings(txn, "db"); + int schemaVersion = s.getInt("schemaVersion", -1); + if (schemaVersion == SCHEMA_VERSION) return true; + if (schemaVersion < MIN_SCHEMA_VERSION) return false; + int minSchemaVersion = s.getInt("minSchemaVersion", -1); + return SCHEMA_VERSION >= minSchemaVersion; + } + + private void storeSchemaVersion(Connection txn) throws DbException { + Settings s = new Settings(); + s.putInt("schemaVersion", SCHEMA_VERSION); + s.putInt("minSchemaVersion", MIN_SCHEMA_VERSION); + mergeSettings(txn, s, "db"); } private void tryToClose(ResultSet rs) { @@ -2352,7 +2350,7 @@ abstract class JdbcDatabase implements Database<Connection> { } public void setContactStatus(Connection txn, ContactId c, StorageStatus s) - throws DbException { + throws DbException { PreparedStatement ps = null; try { String sql = "UPDATE contacts SET status = ? WHERE contactId = ?"; @@ -2387,7 +2385,7 @@ abstract class JdbcDatabase implements Database<Connection> { } public void setMessageValidity(Connection txn, MessageId m, boolean valid) - throws DbException { + throws DbException { PreparedStatement ps = null; try { String sql = "UPDATE messages SET valid = ? WHERE messageId = ?"; diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java index f5a8c215c5f95fecd44cfe914a83e317cf3538c0..aba60f16b147645e738cda56f258a17d73766c8c 100644 --- a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java +++ b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java @@ -1,11 +1,12 @@ package org.briarproject.lifecycle; -import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; -import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.ALREADY_RUNNING; -import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.DB_ERROR; -import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.SERVICE_ERROR; -import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.SUCCESS; +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.db.DbException; +import org.briarproject.api.event.EventBus; +import org.briarproject.api.event.ShutdownEvent; +import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.lifecycle.Service; +import org.briarproject.api.system.Clock; import java.io.IOException; import java.util.Collection; @@ -17,13 +18,12 @@ import java.util.logging.Logger; import javax.inject.Inject; -import org.briarproject.api.db.DatabaseComponent; -import org.briarproject.api.db.DbException; -import org.briarproject.api.event.EventBus; -import org.briarproject.api.event.ShutdownEvent; -import org.briarproject.api.lifecycle.LifecycleManager; -import org.briarproject.api.lifecycle.Service; -import org.briarproject.api.system.Clock; +import static java.util.logging.Level.INFO; +import static java.util.logging.Level.WARNING; +import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.ALREADY_RUNNING; +import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.DB_ERROR; +import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.SERVICE_ERROR; +import static org.briarproject.api.lifecycle.LifecycleManager.StartResult.SUCCESS; class LifecycleManagerImpl implements LifecycleManager { @@ -98,9 +98,6 @@ class LifecycleManagerImpl implements LifecycleManager { } catch (DbException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); return DB_ERROR; - } catch (IOException e) { - if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); - return DB_ERROR; } finally { startStopSemaphore.release(); }