mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-14 19:59:05 +01:00
Added method for deleting metadata.
This commit is contained in:
@@ -69,6 +69,9 @@ public interface DatabaseComponent {
|
|||||||
*/
|
*/
|
||||||
void deleteMessage(MessageId m) throws DbException;
|
void deleteMessage(MessageId m) throws DbException;
|
||||||
|
|
||||||
|
/** Deletes any metadata associated with the given message. */
|
||||||
|
void deleteMessageMetadata(MessageId m) throws DbException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an acknowledgement for the given contact, or null if there are
|
* Returns an acknowledgement for the given contact, or null if there are
|
||||||
* no messages to acknowledge.
|
* no messages to acknowledge.
|
||||||
|
|||||||
@@ -225,6 +225,13 @@ interface Database<T> {
|
|||||||
*/
|
*/
|
||||||
void deleteMessage(T txn, MessageId m) throws DbException;
|
void deleteMessage(T txn, MessageId m) throws DbException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes any metadata associated with the given message.
|
||||||
|
* <p>
|
||||||
|
* Locking: write.
|
||||||
|
*/
|
||||||
|
void deleteMessageMetadata(T txn, MessageId m) throws DbException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the contact with the given ID.
|
* Returns the contact with the given ID.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -310,6 +310,23 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void deleteMessageMetadata(MessageId m) throws DbException {
|
||||||
|
lock.writeLock().lock();
|
||||||
|
try {
|
||||||
|
T txn = db.startTransaction();
|
||||||
|
try {
|
||||||
|
if (!db.containsMessage(txn, m))
|
||||||
|
throw new NoSuchMessageException();
|
||||||
|
db.deleteMessageMetadata(txn, m);
|
||||||
|
} catch (DbException e) {
|
||||||
|
db.abortTransaction(txn);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
lock.writeLock().unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Ack generateAck(ContactId c, int maxMessages) throws DbException {
|
public Ack generateAck(ContactId c, int maxMessages) throws DbException {
|
||||||
Collection<MessageId> ids;
|
Collection<MessageId> ids;
|
||||||
lock.writeLock().lock();
|
lock.writeLock().lock();
|
||||||
|
|||||||
@@ -949,6 +949,22 @@ abstract class JdbcDatabase implements Database<Connection> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void deleteMessageMetadata(Connection txn, MessageId m)
|
||||||
|
throws DbException {
|
||||||
|
PreparedStatement ps = null;
|
||||||
|
try {
|
||||||
|
String sql = "DELETE FROM messageMetadata WHERE messageId = ?";
|
||||||
|
ps = txn.prepareStatement(sql);
|
||||||
|
ps.setBytes(1, m.getBytes());
|
||||||
|
int affected = ps.executeUpdate();
|
||||||
|
if (affected < 0) throw new DbStateException();
|
||||||
|
ps.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
tryToClose(ps);
|
||||||
|
throw new DbException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Contact getContact(Connection txn, ContactId c) throws DbException {
|
public Contact getContact(Connection txn, ContactId c) throws DbException {
|
||||||
PreparedStatement ps = null;
|
PreparedStatement ps = null;
|
||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
|
|||||||
@@ -543,11 +543,11 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
final EventBus eventBus = context.mock(EventBus.class);
|
final EventBus eventBus = context.mock(EventBus.class);
|
||||||
context.checking(new Expectations() {{
|
context.checking(new Expectations() {{
|
||||||
// Check whether the message is in the DB (which it's not)
|
// Check whether the message is in the DB (which it's not)
|
||||||
exactly(6).of(database).startTransaction();
|
exactly(8).of(database).startTransaction();
|
||||||
will(returnValue(txn));
|
will(returnValue(txn));
|
||||||
exactly(6).of(database).containsMessage(txn, messageId);
|
exactly(8).of(database).containsMessage(txn, messageId);
|
||||||
will(returnValue(false));
|
will(returnValue(false));
|
||||||
exactly(6).of(database).abortTransaction(txn);
|
exactly(8).of(database).abortTransaction(txn);
|
||||||
// This is needed for getMessageStatus() to proceed
|
// This is needed for getMessageStatus() to proceed
|
||||||
exactly(1).of(database).containsContact(txn, contactId);
|
exactly(1).of(database).containsContact(txn, contactId);
|
||||||
will(returnValue(true));
|
will(returnValue(true));
|
||||||
@@ -555,6 +555,20 @@ public class DatabaseComponentImplTest extends BriarTestCase {
|
|||||||
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
DatabaseComponent db = createDatabaseComponent(database, eventBus,
|
||||||
shutdown);
|
shutdown);
|
||||||
|
|
||||||
|
try {
|
||||||
|
db.deleteMessage(messageId);
|
||||||
|
fail();
|
||||||
|
} catch (NoSuchMessageException expected) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
db.deleteMessageMetadata(messageId);
|
||||||
|
fail();
|
||||||
|
} catch (NoSuchMessageException expected) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
db.getRawMessage(messageId);
|
db.getRawMessage(messageId);
|
||||||
fail();
|
fail();
|
||||||
|
|||||||
@@ -939,6 +939,17 @@ public class H2DatabaseTest extends BriarTestCase {
|
|||||||
assertTrue(retrieved.containsKey("baz"));
|
assertTrue(retrieved.containsKey("baz"));
|
||||||
assertArrayEquals(metadata.get("baz"), retrieved.get("baz"));
|
assertArrayEquals(metadata.get("baz"), retrieved.get("baz"));
|
||||||
|
|
||||||
|
// Delete the metadata
|
||||||
|
db.deleteMessageMetadata(txn, messageId);
|
||||||
|
|
||||||
|
// Retrieve the metadata again
|
||||||
|
retrieved = db.getMessageMetadata(txn, messageId);
|
||||||
|
assertTrue(retrieved.isEmpty());
|
||||||
|
|
||||||
|
// Retrieve the metadata for the group again
|
||||||
|
all = db.getMessageMetadata(txn, groupId);
|
||||||
|
assertTrue(all.isEmpty());
|
||||||
|
|
||||||
db.commitTransaction(txn);
|
db.commitTransaction(txn);
|
||||||
db.close();
|
db.close();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user