summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDon Sanders <don.sanders@nokia.com>2009-04-24 15:45:55 +1000
committerDon Sanders <don.sanders@nokia.com>2009-04-24 15:45:55 +1000
commit85f0a047d34a0e77f4b9b6f3408fb9ecff542c85 (patch)
tree813f438ef853b50ea528c245332a377482838851
parente0dc5671b0a7f03c2aa00b7b0038d48e031aa97b (diff)
Reduce peak memory use when exporting changes (which is used by example client when gettting mail).2009W17
Done byusing QMailKey to avoid keeping in memory a list of all serverUids in the mailstore for each folder in the account being checked. This reduces peak memory use in the case when lots of mails are already in the mailstore.
-rw-r--r--src/plugins/messageservices/imap/imapstrategy.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/plugins/messageservices/imap/imapstrategy.cpp b/src/plugins/messageservices/imap/imapstrategy.cpp
index fccabb99..a8b8c618 100644
--- a/src/plugins/messageservices/imap/imapstrategy.cpp
+++ b/src/plugins/messageservices/imap/imapstrategy.cpp
@@ -1356,13 +1356,15 @@ void ImapExportUpdatesStrategy::handleLogin(ImapStrategyContextBase *context)
"disabled for account name" << name << "id" << id;
}
QMailFolderIdList folders(context->client()->mailboxIds());
+ QMailMessageKey statusKey(QMailMessageKey::status(QMailMessage::Read, QMailDataComparator::Includes));
+ statusKey &= ~QMailMessageKey::status(QMailMessage::ReadElsewhere, QMailDataComparator::Includes);
+ ImapClient *c(context->client());
foreach(QMailFolderId folderId, folders) {
QStringList deletedUids;
if (imapCfg.canDeleteMail())
deletedUids = context->client()->deletedMessages(folderId);
- QStringList readElsewereUids(context->client()->serverUids(folderId, QMailMessage::ReadElsewhere));
- QStringList readUids(context->client()->serverUids(folderId, QMailMessage::Read));
- readUids = inFirstButNotSecond(readUids, readElsewereUids);
+ QMailMessageKey folderKey(c->messagesKey(folderId) | c->trashKey(folderId));
+ QStringList readUids = c->serverUids(folderKey & statusKey);
if (!deletedUids.isEmpty() || !readUids.isEmpty())
_mailboxList.append(folderId);
}
@@ -1387,17 +1389,18 @@ void ImapExportUpdatesStrategy::handleSelect(ImapStrategyContextBase *context)
// Only interested in messages that are going to be operated on
ImapConfiguration imapCfg(context->config());
QMailFolderId folderId(_currentMailbox.id());
- QStringList readElsewereUids(context->client()->serverUids(folderId, QMailMessage::ReadElsewhere));
-
+ QMailMessageKey statusKey(QMailMessageKey::status(QMailMessage::Read, QMailDataComparator::Includes));
+ statusKey &= ~QMailMessageKey::status(QMailMessage::ReadElsewhere, QMailDataComparator::Includes);
+ ImapClient *c(context->client());
+ QMailMessageKey folderKey(c->messagesKey(folderId) | c->trashKey(folderId));
+ _clientReadUids = c->serverUids(folderKey & statusKey);
if (imapCfg.canDeleteMail())
_clientDeletedUids = context->client()->deletedMessages(folderId);
- _clientReadUids = context->client()->serverUids(folderId, QMailMessage::Read);
- _clientReadUids = inFirstButNotSecond(_clientReadUids, readElsewereUids);
+
if (_clientDeletedUids.isEmpty() && _clientReadUids.isEmpty()) {
processUidSearchResults(context);
return;
}
-
QStringList changedUids = _clientDeletedUids + _clientReadUids;
QString uidList = "UID " + stripFolderPrefix(changedUids).join(",");
context->protocol().sendUidSearch(MFlag_All, uidList);