add transactional versions to introductionManager and privateGroupManager

This commit is contained in:
ialokim
2023-02-24 18:43:08 +01:00
parent f02bbebf6c
commit b09ea495e7
4 changed files with 81 additions and 54 deletions

View File

@@ -29,6 +29,12 @@ public interface IntroductionManager extends ConversationClient {
*/
boolean canIntroduce(Contact c1, Contact c2) throws DbException;
/**
* Returns true if both contacts can be introduced at this moment.
*/
boolean canIntroduce(Transaction txn, Contact c1, Contact c2)
throws DbException;
/**
* The current minor version of the introduction client.
*/
@@ -40,6 +46,12 @@ public interface IntroductionManager extends ConversationClient {
void makeIntroduction(Contact c1, Contact c2, @Nullable String text)
throws DbException;
/**
* Sends two initial introduction messages.
*/
void makeIntroduction(Transaction txn, Contact c1, Contact c2,
@Nullable String text) throws DbException;
/**
* Responds to an introduction.
*/

View File

@@ -52,11 +52,21 @@ public interface PrivateGroupManager {
void addPrivateGroup(Transaction txn, PrivateGroup group,
GroupMessage joinMsg, boolean creator) throws DbException;
/**
* Removes a dissolved private group.
*/
void removePrivateGroup(Transaction txn, GroupId g) throws DbException;
/**
* Removes a dissolved private group.
*/
void removePrivateGroup(GroupId g) throws DbException;
/**
* Returns the ID of the user's previous message sent to the group
*/
MessageId getPreviousMsgId(Transaction txn, GroupId g) throws DbException;
/**
* Returns the ID of the user's previous message sent to the group
*/
@@ -112,7 +122,8 @@ public interface PrivateGroupManager {
/**
* Returns true if the given private group was created by us.
*/
boolean isOurPrivateGroup(Transaction txn, PrivateGroup g) throws DbException;
boolean isOurPrivateGroup(Transaction txn, PrivateGroup g)
throws DbException;
/**
* Returns the text of the private group message with the given ID.
@@ -161,6 +172,12 @@ public interface PrivateGroupManager {
*/
GroupCount getGroupCount(GroupId g) throws DbException;
/**
* Marks a message as read or unread and updates the group count.
*/
void setReadFlag(Transaction txn, GroupId g, MessageId m, boolean read)
throws DbException;
/**
* Marks a message as read or unread and updates the group count.
*/

View File

@@ -300,20 +300,13 @@ class IntroductionManagerImpl extends ConversationClientImpl
@Override
public boolean canIntroduce(Contact c1, Contact c2) throws DbException {
Transaction txn = db.startTransaction(true);
try {
boolean can = canIntroduce(txn, c1, c2);
db.commitTransaction(txn);
return can;
} catch (FormatException e) {
throw new DbException(e);
} finally {
db.endTransaction(txn);
}
return db.transactionWithResult(true,
txn -> canIntroduce(txn, c1, c2));
}
private boolean canIntroduce(Transaction txn, Contact c1, Contact c2)
throws DbException, FormatException {
public boolean canIntroduce(Transaction txn, Contact c1, Contact c2)
throws DbException {
try {
// Look up the session, if there is one
Author introducer = identityManager.getLocalAuthor(txn);
SessionId sessionId =
@@ -324,12 +317,20 @@ class IntroductionManagerImpl extends ConversationClientImpl
IntroducerSession session =
sessionParser.parseIntroducerSession(ss.bdfSession);
return session.getState().isComplete();
} catch (FormatException e) {
throw new DbException(e);
}
}
public void makeIntroduction(Contact c1, Contact c2, @Nullable String text)
throws DbException {
db.transaction(false,
txn -> makeIntroduction(txn, c1, c2, text));
}
@Override
public void makeIntroduction(Contact c1, Contact c2, @Nullable String text)
throws DbException {
Transaction txn = db.startTransaction(false);
public void makeIntroduction(Transaction txn, Contact c1, Contact c2,
@Nullable String text) throws DbException {
try {
// Look up the session, if there is one
Author introducer = identityManager.getLocalAuthor(txn);
@@ -363,11 +364,8 @@ class IntroductionManagerImpl extends ConversationClientImpl
session = introducerEngine.onRequestAction(txn, session, text);
// Store the updated session
storeSession(txn, storageId, session);
db.commitTransaction(txn);
} catch (FormatException e) {
throw new DbException(e);
} finally {
db.endTransaction(txn);
}
}

View File

@@ -150,40 +150,35 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook
}
@Override
public void removePrivateGroup(GroupId g) throws DbException {
Transaction txn = db.startTransaction(false);
try {
public void removePrivateGroup(Transaction txn, GroupId g)
throws DbException {
for (PrivateGroupHook hook : hooks) {
hook.removingGroup(txn, g);
}
Group group = db.getGroup(txn, g);
db.removeGroup(txn, group);
db.commitTransaction(txn);
} finally {
db.endTransaction(txn);
}
@Override
public void removePrivateGroup(GroupId g) throws DbException {
db.transaction(false, txn -> removePrivateGroup(txn, g));
}
@Override
public MessageId getPreviousMsgId(GroupId g) throws DbException {
MessageId previousMsgId;
Transaction txn = db.startTransaction(true);
try {
previousMsgId = getPreviousMsgId(txn, g);
db.commitTransaction(txn);
} catch (FormatException e) {
throw new DbException(e);
} finally {
db.endTransaction(txn);
}
return previousMsgId;
return db.transactionWithResult(true,
txn -> getPreviousMsgId(txn, g));
}
private MessageId getPreviousMsgId(Transaction txn, GroupId g)
throws DbException, FormatException {
public MessageId getPreviousMsgId(Transaction txn, GroupId g)
throws DbException {
try {
BdfDictionary d = clientHelper.getGroupMetadataAsDictionary(txn, g);
byte[] previousMsgIdBytes = d.getRaw(KEY_PREVIOUS_MSG_ID);
return new MessageId(previousMsgIdBytes);
} catch (FormatException e) {
throw new DbException(e);
}
}
private void setPreviousMsgId(Transaction txn, GroupId g,
@@ -483,11 +478,16 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook
return messageTracker.getGroupCount(g);
}
@Override
public void setReadFlag(Transaction txn, GroupId g, MessageId m,
boolean read) throws DbException {
messageTracker.setReadFlag(txn, g, m, read);
}
@Override
public void setReadFlag(GroupId g, MessageId m, boolean read)
throws DbException {
db.transaction(false, txn ->
messageTracker.setReadFlag(txn, g, m, read));
db.transaction(false, txn -> setReadFlag(txn, g, m, read));
}
@Override