diff --git a/api/net/sf/briar/api/db/DatabaseComponent.java b/api/net/sf/briar/api/db/DatabaseComponent.java index e8b1d51fd2e1ba37a9465db0f916880ba3fe7949..01d2253b95750943bddead3901848fe02fe1391f 100644 --- a/api/net/sf/briar/api/db/DatabaseComponent.java +++ b/api/net/sf/briar/api/db/DatabaseComponent.java @@ -16,6 +16,7 @@ import net.sf.briar.api.protocol.Batch; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupId; import net.sf.briar.api.protocol.Message; +import net.sf.briar.api.protocol.MessageHeader; import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.SubscriptionUpdate; @@ -128,6 +129,9 @@ public interface DatabaseComponent { Map<TransportId, TransportProperties> getLocalTransports() throws DbException; + /** Returns the headers of all messages in the given group. */ + Collection<MessageHeader> getMessageHeaders(GroupId g) throws DbException; + /** Returns the user's rating for the given author. */ Rating getRating(AuthorId a) throws DbException; diff --git a/components/net/sf/briar/db/DatabaseComponentImpl.java b/components/net/sf/briar/db/DatabaseComponentImpl.java index ea996eb7760b6138db68d5d71705b0852bd1d152..b9ae4b7c60de432cdda608b9873bec22254e81e7 100644 --- a/components/net/sf/briar/db/DatabaseComponentImpl.java +++ b/components/net/sf/briar/db/DatabaseComponentImpl.java @@ -44,6 +44,7 @@ import net.sf.briar.api.protocol.BatchId; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupId; import net.sf.briar.api.protocol.Message; +import net.sf.briar.api.protocol.MessageHeader; import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.SubscriptionUpdate; @@ -781,6 +782,25 @@ DatabaseCleaner.Callback { } } + public Collection<MessageHeader> getMessageHeaders(GroupId g) + throws DbException { + messageLock.readLock().lock(); + try { + T txn = db.startTransaction(); + try { + Collection<MessageHeader> headers = + db.getMessageHeaders(txn, g); + db.commitTransaction(txn); + return headers; + } catch(DbException e) { + db.abortTransaction(txn); + throw e; + } + } finally { + messageLock.readLock().unlock(); + } + } + public Rating getRating(AuthorId a) throws DbException { ratingLock.readLock().lock(); try { diff --git a/test/net/sf/briar/db/DatabaseComponentTest.java b/test/net/sf/briar/db/DatabaseComponentTest.java index bc846980bd46e88a3a06243f2d48581ff2ca0f9e..7d4efe5703cd8d0f0c661d5763df6dcf9aee08fb 100644 --- a/test/net/sf/briar/db/DatabaseComponentTest.java +++ b/test/net/sf/briar/db/DatabaseComponentTest.java @@ -27,6 +27,7 @@ import net.sf.briar.api.protocol.BatchId; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupId; import net.sf.briar.api.protocol.Message; +import net.sf.briar.api.protocol.MessageHeader; import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.ProtocolConstants; @@ -144,6 +145,9 @@ public abstract class DatabaseComponentTest extends TestCase { will(returnValue(groupId)); oneOf(database).containsSubscription(txn, groupId); will(returnValue(true)); + // getMessageHeaders(groupId) + oneOf(database).getMessageHeaders(txn, groupId); + will(returnValue(Collections.<MessageHeader>emptyList())); // getSubscriptions() oneOf(database).getSubscriptions(txn); will(returnValue(Collections.singletonList(groupId))); @@ -181,6 +185,7 @@ public abstract class DatabaseComponentTest extends TestCase { assertEquals(remoteProperties, db.getRemoteProperties(transportId)); db.subscribe(group); // First time - check listeners are called db.subscribe(group); // Second time - check listeners aren't called + assertEquals(Collections.emptyList(), db.getMessageHeaders(groupId)); assertEquals(Collections.singletonList(groupId), db.getSubscriptions()); db.unsubscribe(groupId); // First time - check listeners are called db.unsubscribe(groupId); // Second time - check listeners aren't called