diff options
-rw-r--r-- | mail/changes/bug_defer-unset-recent | 2 | ||||
-rw-r--r-- | mail/changes/bug_enqueue-unset-recent | 2 | ||||
-rw-r--r-- | mail/changes/bug_safety-check-for-last-uid | 1 | ||||
-rw-r--r-- | mail/src/leap/mail/imap/server.py | 40 |
4 files changed, 35 insertions, 10 deletions
diff --git a/mail/changes/bug_defer-unset-recent b/mail/changes/bug_defer-unset-recent deleted file mode 100644 index e651d113..00000000 --- a/mail/changes/bug_defer-unset-recent +++ /dev/null @@ -1,2 +0,0 @@ - o deferToThread unsetting of recent flag. this was holding the new - mails from being displayed soonish. diff --git a/mail/changes/bug_enqueue-unset-recent b/mail/changes/bug_enqueue-unset-recent new file mode 100644 index 00000000..8903804a --- /dev/null +++ b/mail/changes/bug_enqueue-unset-recent @@ -0,0 +1,2 @@ + o Enqueue unsetting of recent flag. this was holding the new + mails from being displayed soonish. diff --git a/mail/changes/bug_safety-check-for-last-uid b/mail/changes/bug_safety-check-for-last-uid new file mode 100644 index 00000000..bb0229fb --- /dev/null +++ b/mail/changes/bug_safety-check-for-last-uid @@ -0,0 +1 @@ + o Sanity check on last_uid setter. Avoids incomplete fetches. diff --git a/mail/src/leap/mail/imap/server.py b/mail/src/leap/mail/imap/server.py index c79cf856..d92ab9da 100644 --- a/mail/src/leap/mail/imap/server.py +++ b/mail/src/leap/mail/imap/server.py @@ -755,7 +755,7 @@ class LeapMessage(WithMsgFields): logger.error("Unicode error {0}".format(e)) content = content.encode(charset, 'replace') fd.write(content) - # SHOULD use a separate BODY FIELD ... + # XXX SHOULD use a separate BODY FIELD ... fd.seek(0) return fd @@ -856,7 +856,12 @@ class SoledadDocWriter(object): empty = queue.empty() while not empty: item = queue.get() - self._soledad.create_doc(item) + payload = item['payload'] + mode = item['mode'] + if mode == "create": + self._soledad.create_doc(payload) + elif mode == "put": + self._soledad.put_doc(payload) empty = queue.empty() @@ -925,7 +930,7 @@ class MessageCollection(WithMsgFields, IndexedDB): # to be processed serially by the consumer (the writer). We just # need to `put` the new material on its plate. - self._soledad_writer = MessageProducer( + self.soledad_writer = MessageProducer( SoledadDocWriter(soledad), period=0.1) @@ -1003,7 +1008,10 @@ class MessageCollection(WithMsgFields, IndexedDB): content[self.UID_KEY] = uid logger.debug('enqueuing message for write') - self._soledad_writer.put(content) + + # XXX create namedtuple + self.soledad_writer.put({"mode": "create", + "payload": content}) # XXX have to decide what shall we do with errors with this change... #return self._soledad.create_doc(content) @@ -1422,7 +1430,22 @@ class SoledadMailbox(WithMsgFields): leap_assert(isinstance(uid, int), "uid has to be int") mbox = self._get_mbox() key = self.LAST_UID_KEY - mbox.content[key] = uid + + count = mbox.getMessageCount() + + # XXX safety-catch. If we do get duplicates, + # we want to avoid further duplication. + + if uid >= count: + value = uid + else: + # something is wrong, + # just set the last uid + # beyond the max msg count. + logger.debug("WRONG uid < count. Setting last uid to ", count) + value = count + + mbox.content[key] = value self._soledad.put_doc(mbox) last_uid = property( @@ -1650,7 +1673,7 @@ class SoledadMailbox(WithMsgFields): print "fetch %s, no msg found!!!" % msg_id if self.isWriteable(): - deferToThread(self._unset_recent_flag) + self._unset_recent_flag() return tuple(result) @@ -1761,8 +1784,9 @@ class SoledadMailbox(WithMsgFields): """ Updates document in u1db database """ - #log.msg('updating doc... %s ' % doc) - self._soledad.put_doc(doc) + # XXX create namedtuple + self.messages.soledad_writer.put({"mode": "put", + "payload": doc}) def __repr__(self): """ |