Granular message transaction

This commit is contained in:
M66B 2019-03-30 14:49:51 +01:00
parent f68c63b1ad
commit 90ee847281
2 changed files with 118 additions and 108 deletions

View File

@ -922,7 +922,6 @@ class Core {
for (int j = isub.length - 1; j >= 0 && state.running(); j--) for (int j = isub.length - 1; j >= 0 && state.running(); j--)
try { try {
db.beginTransaction();
EntityMessage message = synchronizeMessage( EntityMessage message = synchronizeMessage(
context, context,
account, folder, account, folder,
@ -930,7 +929,6 @@ class Core {
false, false,
rules); rules);
ids[from + j] = message.id; ids[from + j] = message.id;
db.setTransactionSuccessful();
} catch (MessageRemovedException ex) { } catch (MessageRemovedException ex) {
Log.w(folder.name, ex); Log.w(folder.name, ex);
} catch (FolderClosedException ex) { } catch (FolderClosedException ex) {
@ -945,7 +943,6 @@ class Core {
Log.e(folder.name, ex); Log.e(folder.name, ex);
db.folder().setFolderError(folder.id, Helper.formatThrowable(ex, true)); db.folder().setFolderError(folder.id, Helper.formatThrowable(ex, true));
} finally { } finally {
db.endTransaction();
// Reduce memory usage // Reduce memory usage
((IMAPMessage) isub[j]).invalidateHeaders(); ((IMAPMessage) isub[j]).invalidateHeaders();
} }
@ -1039,6 +1036,7 @@ class Core {
boolean flagged = helper.getFlagged(); boolean flagged = helper.getFlagged();
String flags = helper.getFlags(); String flags = helper.getFlags();
String[] keywords = helper.getKeywords(); String[] keywords = helper.getKeywords();
boolean update = false;
boolean filter = false; boolean filter = false;
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
@ -1076,7 +1074,7 @@ class Core {
dup.msgid = msgid; dup.msgid = msgid;
dup.thread = thread; dup.thread = thread;
dup.error = null; dup.error = null;
db.message().updateMessage(dup); update = true;
message = dup; message = dup;
} }
} }
@ -1123,6 +1121,8 @@ class Core {
} }
} }
MessageHelper.MessageParts parts = helper.getMessageParts();
message = new EntityMessage(); message = new EntityMessage();
message.account = folder.account; message.account = folder.account;
message.folder = folder.id; message.folder = folder.id;
@ -1173,12 +1173,13 @@ class Core {
message.warning = context.getString(R.string.title_via, s[1]); message.warning = context.getString(R.string.title_via, s[1]);
} }
message.id = db.message().insertMessage(message); try {
db.beginTransaction();
message.id = db.message().insertMessage(message);
Log.i(folder.name + " added id=" + message.id + " uid=" + message.uid); Log.i(folder.name + " added id=" + message.id + " uid=" + message.uid);
int sequence = 1; int sequence = 1;
MessageHelper.MessageParts parts = helper.getMessageParts();
for (EntityAttachment attachment : parts.getAttachments()) { for (EntityAttachment attachment : parts.getAttachments()) {
Log.i(folder.name + " attachment seq=" + sequence + Log.i(folder.name + " attachment seq=" + sequence +
" name=" + attachment.name + " type=" + attachment.type + " name=" + attachment.name + " type=" + attachment.type +
@ -1244,9 +1245,15 @@ class Core {
} }
} }
} }
} else {
boolean update = false;
runRules(context, imessage, message, rules);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
} else {
if (!message.seen.equals(seen) || !message.seen.equals(message.ui_seen)) { if (!message.seen.equals(seen) || !message.seen.equals(message.ui_seen)) {
update = true; update = true;
message.seen = seen; message.seen = seen;
@ -1301,14 +1308,26 @@ class Core {
} }
Uri lookupUri = ContactInfo.getLookupUri(context, message.from); Uri lookupUri = ContactInfo.getLookupUri(context, message.from);
if ((message.avatar == null) == (lookupUri != null)) { if ((message.avatar == null) != (lookupUri == null)) {
update = true; update = true;
message.avatar = (lookupUri == null ? null : lookupUri.toString()); message.avatar = (lookupUri == null ? null : lookupUri.toString());
Log.i(folder.name + " updated id=" + message.id + " lookup=" + lookupUri); Log.i(folder.name + " updated id=" + message.id + " lookup=" + lookupUri);
} }
if (update) if (update)
try {
db.beginTransaction();
db.message().updateMessage(message); db.message().updateMessage(message);
if (filter)
runRules(context, imessage, message, rules);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
else if (BuildConfig.DEBUG) else if (BuildConfig.DEBUG)
Log.i(folder.name + " unchanged uid=" + uid); Log.i(folder.name + " unchanged uid=" + uid);
} }
@ -1326,7 +1345,14 @@ class Core {
db.folder().setFolderKeywords(folder.id, DB.Converters.fromStringArray(fkeywords.toArray(new String[0]))); db.folder().setFolderKeywords(folder.id, DB.Converters.fromStringArray(fkeywords.toArray(new String[0])));
} }
if (filter && Helper.isPro(context)) return message;
}
private static void runRules(Context context, IMAPMessage imessage, EntityMessage message, List<EntityRule> rules) {
if (!Helper.isPro(context))
return;
DB db = DB.getInstance(context);
try { try {
for (EntityRule rule : rules) for (EntityRule rule : rules)
if (rule.matches(context, message, imessage)) { if (rule.matches(context, message, imessage)) {
@ -1338,8 +1364,6 @@ class Core {
Log.e(ex); Log.e(ex);
db.message().setMessageError(message.id, Helper.formatThrowable(ex)); db.message().setMessageError(message.id, Helper.formatThrowable(ex));
} }
return message;
} }
static void downloadMessage( static void downloadMessage(

View File

@ -681,19 +681,12 @@ public class ServiceSynchronize extends LifecycleService {
for (Message imessage : e.getMessages()) for (Message imessage : e.getMessages())
try { try {
EntityMessage message; EntityMessage message = Core.synchronizeMessage(
try {
db.beginTransaction();
message = Core.synchronizeMessage(
ServiceSynchronize.this, ServiceSynchronize.this,
account, folder, account, folder,
ifolder, (IMAPMessage) imessage, ifolder, (IMAPMessage) imessage,
false, false,
db.rule().getEnabledRules(folder.id)); db.rule().getEnabledRules(folder.id));
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
if (db.folder().getFolderDownload(folder.id)) if (db.folder().getFolderDownload(folder.id))
Core.downloadMessage(ServiceSynchronize.this, Core.downloadMessage(ServiceSynchronize.this,
@ -771,19 +764,12 @@ public class ServiceSynchronize extends LifecycleService {
fp.add(IMAPFolder.FetchProfileItem.FLAGS); fp.add(IMAPFolder.FetchProfileItem.FLAGS);
ifolder.fetch(new Message[]{e.getMessage()}, fp); ifolder.fetch(new Message[]{e.getMessage()}, fp);
EntityMessage message; EntityMessage message = Core.synchronizeMessage(
try {
db.beginTransaction();
message = Core.synchronizeMessage(
ServiceSynchronize.this, ServiceSynchronize.this,
account, folder, account, folder,
ifolder, (IMAPMessage) e.getMessage(), ifolder, (IMAPMessage) e.getMessage(),
false, false,
db.rule().getEnabledRules(folder.id)); db.rule().getEnabledRules(folder.id));
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
if (db.folder().getFolderDownload(folder.id)) if (db.folder().getFolderDownload(folder.id))
Core.downloadMessage(ServiceSynchronize.this, Core.downloadMessage(ServiceSynchronize.this,