diff options
-rw-r--r-- | src/leap/mail/imap/mailbox.py | 29 | ||||
-rw-r--r-- | src/leap/mail/imap/tests/test_imap.py | 10 | ||||
-rw-r--r-- | src/leap/mail/mail.py | 9 |
3 files changed, 31 insertions, 17 deletions
diff --git a/src/leap/mail/imap/mailbox.py b/src/leap/mail/imap/mailbox.py index 91c6549..61baca5 100644 --- a/src/leap/mail/imap/mailbox.py +++ b/src/leap/mail/imap/mailbox.py @@ -307,7 +307,7 @@ class IMAPMailbox(object): d.addCallback(as_a_dict) return d - def addMessage(self, message, flags, date=None): + def addMessage(self, message, flags, date=None, notify_just_mdoc=True): """ Adds a message to this mailbox. @@ -327,6 +327,21 @@ class IMAPMailbox(object): # TODO have a look at the cases for internal date in the rfc # XXX we could treat the message as an IMessage from here + # TODO notify_just_mdoc *sometimes* make the append tests fail. + # have to find a better solution for this. A workaround could probably + # be to have a list of the ongoing deferreds related to append, so that + # we queue for later all the requests having to do with these. + + # notify_just_mdoc=True: feels HACKY, but improves a *lot* the + # responsiveness of the APPENDS: we just need to be notified when the + # mdoc is saved, and let's hope that the other parts are doing just + # fine. This will not catch any errors when the inserts of the other + # parts fail, but on the other hand allows us to return very quickly, + # which seems a good compromise given that we have to serialize the + # appends. + # A better solution will probably involve implementing MULTIAPPEND + # extension or patching imap server to support pipelining. + if isinstance(message, (cStringIO.OutputType, StringIO.StringIO)): message = message.getvalue() @@ -340,19 +355,9 @@ class IMAPMailbox(object): if date is None: date = formatdate(time.time()) - # notify_just_mdoc=True: feels HACKY, but improves a *lot* the - # responsiveness of the APPENDS: we just need to be notified when the - # mdoc is saved, and let's hope that the other parts are doing just - # fine. This will not catch any errors when the inserts of the other - # parts fail, but on the other hand allows us to return very quickly, - # which seems a good compromise given that we have to serialize the - # appends. - # A better solution will probably involve implementing MULTIAPPEND - # extension or patching imap server to support pipelining. - # TODO add notify_new as a callback here... return self.collection.add_msg(message, flags, date=date, - notify_just_mdoc=True) + notify_just_mdoc=notify_just_mdoc) def notify_new(self, *args): """ diff --git a/src/leap/mail/imap/tests/test_imap.py b/src/leap/mail/imap/tests/test_imap.py index a94cea7..c4f752b 100644 --- a/src/leap/mail/imap/tests/test_imap.py +++ b/src/leap/mail/imap/tests/test_imap.py @@ -882,6 +882,7 @@ class LEAPIMAP4ServerTestCase(IMAP4HelperMixin): """ Test partially appending a message to the mailbox """ + # TODO this test sometimes will fail because of the notify_just_mdoc infile = util.sibpath(__file__, 'rfc822.message') acc = self.server.theAccount @@ -990,11 +991,14 @@ class LEAPIMAP4ServerTestCase(IMAP4HelperMixin): def add_messages(): d = self.mailbox.addMessage( - 'test 1', flags=('\\Deleted', 'AnotherFlag')) + 'test 1', flags=('\\Deleted', 'AnotherFlag'), + notify_just_mdoc=False) d.addCallback(lambda _: self.mailbox.addMessage( - 'test 2', flags=('AnotherFlag',))) + 'test 2', flags=('AnotherFlag',), + notify_just_mdoc=False)) d.addCallback(lambda _: self.mailbox.addMessage( - 'test 3', flags=('\\Deleted',))) + 'test 3', flags=('\\Deleted',), + notify_just_mdoc=False)) return d def expunge(): diff --git a/src/leap/mail/mail.py b/src/leap/mail/mail.py index 584cc4a..ef9a0d9 100644 --- a/src/leap/mail/mail.py +++ b/src/leap/mail/mail.py @@ -645,8 +645,13 @@ class MessageCollection(object): for h in hashes: d.append(self.mbox_indexer.delete_doc_by_hash( self.mbox_uuid, h)) - return defer.gatherResults(d).addCallback( - lambda _: uids) + + def return_uids_when_deleted(ignored): + return uids + + all_deleted = defer.gatherResults(d).addCallback( + return_uids_when_deleted) + return all_deleted mdocs_deleted = self.adaptor.del_all_flagged_messages( self.store, self.mbox_uuid) |