reduce object instances, skip querying db if we want to keep all messages

pull/161/head
Unpublished 6 years ago
parent d692faf117
commit 1bb0d00b29

@ -122,6 +122,8 @@ class Core {
private static final long YIELD_DURATION = 200L; // milliseconds
private static final long MIN_HIDE = 60 * 1000L; // milliseconds
private static final FlagTerm FLAGGED = new FlagTerm(new Flags(Flags.Flag.FLAGGED), true);
static void processOperations(
Context context,
EntityAccount account, EntityFolder folder,
@ -1050,7 +1052,11 @@ class Core {
if (keep_time < 0)
keep_time = 0;
Log.i(folder.name + " sync=" + new Date(sync_time) + " keep=" + new Date(keep_time));
Date syncDate = new Date(sync_time);
if (folder.keep_days == Integer.MAX_VALUE) {
Log.i(folder.name + " sync=" + syncDate + " keep=∞");
} else {
Log.i(folder.name + " sync=" + syncDate + " keep=" + new Date(keep_time));
// Delete old local messages
if (auto_delete) {
@ -1069,18 +1075,21 @@ class Core {
int old = db.message().deleteMessagesBefore(folder.id, keep_time, delete_unseen);
Log.i(folder.name + " local old=" + old);
}
}
// Get list of local uids
final List<Long> uids = db.message().getUids(folder.id, sync_kept ? null : sync_time);
Log.i(folder.name + " local count=" + uids.size());
// Reduce list of local uids
SearchTerm searchTerm = new ReceivedDateTerm(ComparisonTerm.GE, new Date(sync_time));
ReceivedDateTerm receivedDateSyncTerm = new ReceivedDateTerm(ComparisonTerm.GE, syncDate);
SearchTerm searchTerm = receivedDateSyncTerm;
if (sync_unseen)
searchTerm = new OrTerm(searchTerm, new FlagTerm(new Flags(Flags.Flag.SEEN), false));
if (sync_flagged && ifolder.getPermanentFlags().contains(Flags.Flag.FLAGGED))
searchTerm = new OrTerm(searchTerm, new FlagTerm(new Flags(Flags.Flag.FLAGGED), true));
searchTerm = new OrTerm(searchTerm, FLAGGED);
// Get messages to sync from remote
long search = SystemClock.elapsedRealtime();
Message[] imessages;
try {
@ -1088,11 +1097,12 @@ class Core {
} catch (MessagingException ex) {
Log.w(ex.getMessage());
// Fallback to date only search
imessages = ifolder.search(new ReceivedDateTerm(ComparisonTerm.GE, new Date(sync_time)));
imessages = ifolder.search(receivedDateSyncTerm);
}
Log.i(folder.name + " remote count=" + imessages.length +
" search=" + (SystemClock.elapsedRealtime() - search) + " ms");
// Prefetch UIDs and FLAGS of messages to sync
FetchProfile fp = new FetchProfile();
fp.add(UIDFolder.FetchProfileItem.UID); // To check if message exists
fp.add(FetchProfile.Item.FLAGS); // To update existing messages
@ -1113,6 +1123,7 @@ class Core {
}
});
// remove messages to be synced from local list? so we get the list of messages to keep
for (int i = 0; i < imessages.length && state.isRunning() && state.isRecoverable(); i++)
try {
uids.remove(ifolder.getUID(imessages[i]));
@ -1125,6 +1136,7 @@ class Core {
}
if (uids.size() > 0) {
// fetch uids of messages to keep
// This is done outside of JavaMail to prevent changed notifications
if (!ifolder.isOpen())
throw new FolderClosedException(ifolder, "UID FETCH");
@ -1173,7 +1185,7 @@ class Core {
FetchResponse fr = (FetchResponse) response;
UID uid = fr.getItem(UID.class);
if (uid != null)
uids.remove(uid.uid);
uids.remove(uid.uid); // remove message from list if on remote
}
} else {
for (Response response : responses)

Loading…
Cancel
Save