+ * Locking: transport write. + */ + void mergeConfig(T txn, TransportId t, TransportConfig config) + throws DbException; + + /** + * Merges the given properties with the existing local properties for the + * given transport. + *
+ * Locking: transport write.
+ */
+ void mergeLocalProperties(T txn, TransportId t, TransportProperties p)
+ throws DbException;
+
/**
* Removes an outstanding batch that has been acknowledged. Any messages in
* the batch that are still considered outstanding (Status.SENT) with
@@ -544,15 +561,6 @@ interface Database
- * Locking: transport write.
- */
- void setConfig(T txn, TransportId t, TransportConfig config)
- throws DbException;
-
/**
* Sets the connection reordering window for the given contact transport in
* the given rotation period.
@@ -569,15 +577,6 @@ interface Database
- * Locking: transport write.
- */
- void setLocalProperties(T txn, TransportId t, TransportProperties p)
- throws DbException;
-
/**
* Sets the user's rating for the given author.
*
diff --git a/src/net/sf/briar/db/DatabaseCleanerImpl.java b/src/net/sf/briar/db/DatabaseCleanerImpl.java
index 71322acf8..dc2f4e0d8 100644
--- a/src/net/sf/briar/db/DatabaseCleanerImpl.java
+++ b/src/net/sf/briar/db/DatabaseCleanerImpl.java
@@ -5,6 +5,7 @@ import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
+import net.sf.briar.api.db.DbClosedException;
import net.sf.briar.api.db.DbException;
class DatabaseCleanerImpl extends TimerTask implements DatabaseCleaner {
@@ -32,6 +33,8 @@ class DatabaseCleanerImpl extends TimerTask implements DatabaseCleaner {
if(callback.shouldCheckFreeSpace()) {
callback.checkFreeSpaceAndClean();
}
+ } catch(DbClosedException e) {
+ if(LOG.isLoggable(Level.INFO)) LOG.info("Database closed, exiting");
} catch(DbException e) {
if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.toString());
throw new Error(e); // Kill the application
diff --git a/src/net/sf/briar/db/DatabaseComponentImpl.java b/src/net/sf/briar/db/DatabaseComponentImpl.java
index 48bb097cd..8e6fb021c 100644
--- a/src/net/sf/briar/db/DatabaseComponentImpl.java
+++ b/src/net/sf/briar/db/DatabaseComponentImpl.java
@@ -27,14 +27,11 @@ import net.sf.briar.api.Rating;
import net.sf.briar.api.TransportConfig;
import net.sf.briar.api.TransportProperties;
import net.sf.briar.api.clock.Clock;
-import net.sf.briar.api.db.ContactTransport;
import net.sf.briar.api.db.DatabaseComponent;
import net.sf.briar.api.db.DbException;
import net.sf.briar.api.db.MessageHeader;
import net.sf.briar.api.db.NoSuchContactException;
import net.sf.briar.api.db.NoSuchContactTransportException;
-import net.sf.briar.api.db.Status;
-import net.sf.briar.api.db.TemporarySecret;
import net.sf.briar.api.db.event.BatchReceivedEvent;
import net.sf.briar.api.db.event.ContactAddedEvent;
import net.sf.briar.api.db.event.ContactRemovedEvent;
@@ -62,6 +59,8 @@ import net.sf.briar.api.protocol.SubscriptionUpdate;
import net.sf.briar.api.protocol.Transport;
import net.sf.briar.api.protocol.TransportId;
import net.sf.briar.api.protocol.TransportUpdate;
+import net.sf.briar.api.transport.ContactTransport;
+import net.sf.briar.api.transport.TemporarySecret;
import com.google.inject.Inject;
@@ -1006,6 +1005,47 @@ DatabaseCleaner.Callback {
}
}
+ public void mergeConfig(TransportId t, TransportConfig c)
+ throws DbException {
+ transportLock.writeLock().lock();
+ try {
+ T txn = db.startTransaction();
+ try {
+ db.mergeConfig(txn, t, c);
+ db.commitTransaction(txn);
+ } catch(DbException e) {
+ db.abortTransaction(txn);
+ throw e;
+ }
+ } finally {
+ transportLock.writeLock().unlock();
+ }
+ }
+
+ public void mergeLocalProperties(TransportId t, TransportProperties p)
+ throws DbException {
+ boolean changed = false;
+ transportLock.writeLock().lock();
+ try {
+ T txn = db.startTransaction();
+ try {
+ if(!p.equals(db.getLocalProperties(txn, t))) {
+ db.mergeLocalProperties(txn, t, p);
+ db.setTransportsModified(txn, clock.currentTimeMillis());
+ changed = true;
+ }
+ db.commitTransaction(txn);
+ } catch(DbException e) {
+ db.abortTransaction(txn);
+ throw e;
+ }
+ } finally {
+ transportLock.writeLock().unlock();
+ }
+ // Call the listeners outside the lock
+ if(changed) callListeners(new LocalTransportsUpdatedEvent());
+ }
+
public void receiveAck(ContactId c, Ack a) throws DbException {
contactLock.readLock().lock();
try {
@@ -1263,23 +1303,6 @@ DatabaseCleaner.Callback {
callListeners(new ContactRemovedEvent(c));
}
- public void setConfig(TransportId t, TransportConfig c)
- throws DbException {
- transportLock.writeLock().lock();
- try {
- T txn = db.startTransaction();
- try {
- db.setConfig(txn, t, c);
- db.commitTransaction(txn);
- } catch(DbException e) {
- db.abortTransaction(txn);
- throw e;
- }
- } finally {
- transportLock.writeLock().unlock();
- }
- }
-
public void setConnectionWindow(ContactId c, TransportId t, long period,
long centre, byte[] bitmap) throws DbException {
contactLock.readLock().lock();
@@ -1304,30 +1327,6 @@ DatabaseCleaner.Callback {
}
}
- public void setLocalProperties(TransportId t, TransportProperties p)
- throws DbException {
- boolean changed = false;
- transportLock.writeLock().lock();
- try {
- T txn = db.startTransaction();
- try {
- if(!p.equals(db.getLocalProperties(txn, t))) {
- db.setLocalProperties(txn, t, p);
- db.setTransportsModified(txn, clock.currentTimeMillis());
- changed = true;
- }
- db.commitTransaction(txn);
- } catch(DbException e) {
- db.abortTransaction(txn);
- throw e;
- }
- } finally {
- transportLock.writeLock().unlock();
- }
- // Call the listeners outside the lock
- if(changed) callListeners(new LocalTransportsUpdatedEvent());
- }
-
public void setRating(AuthorId a, Rating r) throws DbException {
boolean changed;
messageLock.writeLock().lock();
diff --git a/src/net/sf/briar/db/DatabaseModule.java b/src/net/sf/briar/db/DatabaseModule.java
index 7532896e2..0d36cd348 100644
--- a/src/net/sf/briar/db/DatabaseModule.java
+++ b/src/net/sf/briar/db/DatabaseModule.java
@@ -1,16 +1,12 @@
package net.sf.briar.db;
-import java.io.File;
import java.sql.Connection;
import java.util.concurrent.Executor;
import net.sf.briar.api.clock.Clock;
-import net.sf.briar.api.crypto.Password;
import net.sf.briar.api.db.DatabaseComponent;
-import net.sf.briar.api.db.DatabaseDirectory;
+import net.sf.briar.api.db.DatabaseConfig;
import net.sf.briar.api.db.DatabaseExecutor;
-import net.sf.briar.api.db.DatabaseMaxSize;
-import net.sf.briar.api.db.DatabasePassword;
import net.sf.briar.api.lifecycle.ShutdownManager;
import net.sf.briar.api.protocol.GroupFactory;
import net.sf.briar.api.protocol.PacketFactory;
@@ -46,10 +42,9 @@ public class DatabaseModule extends AbstractModule {
}
@Provides
- Database