diff options
author | Don Sanders <don.sanders@nokia.com> | 2009-04-24 15:45:55 +1000 |
---|---|---|
committer | Don Sanders <don.sanders@nokia.com> | 2009-04-24 15:45:55 +1000 |
commit | 85f0a047d34a0e77f4b9b6f3408fb9ecff542c85 (patch) | |
tree | 813f438ef853b50ea528c245332a377482838851 | |
parent | e0dc5671b0a7f03c2aa00b7b0038d48e031aa97b (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.cpp | 19 |
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); |