summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mail/src/leap/mail/imap/mailbox.py22
-rw-r--r--mail/src/leap/mail/imap/memorystore.py17
-rw-r--r--mail/src/leap/mail/imap/messages.py14
3 files changed, 36 insertions, 17 deletions
diff --git a/mail/src/leap/mail/imap/mailbox.py b/mail/src/leap/mail/imap/mailbox.py
index c188f919..6e472ee7 100644
--- a/mail/src/leap/mail/imap/mailbox.py
+++ b/mail/src/leap/mail/imap/mailbox.py
@@ -824,12 +824,12 @@ class SoledadMailbox(WithMsgFields, MBoxParser):
memstore = self._memstore
def createCopy(result):
- exist, new_fdoc, hdoc = result
+ exist, new_fdoc = result
if exist:
# Should we signal error on the callback?
logger.warning("Destination message already exists!")
- # XXX I'm still not clear if we should raise the
+ # XXX I'm not sure if we should raise the
# errback. This actually rases an ugly warning
# in some muas like thunderbird. I guess the user does
# not deserve that.
@@ -848,8 +848,7 @@ class SoledadMailbox(WithMsgFields, MBoxParser):
self._memstore.create_message(
self.mbox, uid_next,
- MessageWrapper(
- new_fdoc, hdoc),
+ MessageWrapper(new_fdoc),
observer=observer,
notify_on_disk=False)
@@ -862,6 +861,9 @@ class SoledadMailbox(WithMsgFields, MBoxParser):
"""
Get a copy of the fdoc for this message, and check whether
it already exists.
+
+ :return: exist, new_fdoc
+ :rtype: tuple
"""
# XXX for clarity, this could be delegated to a
# MessageCollection mixin that implements copy too, and
@@ -869,22 +871,16 @@ class SoledadMailbox(WithMsgFields, MBoxParser):
msg = message
memstore = self._memstore
- # XXX should use a public api instead
- fdoc = msg._fdoc
- hdoc = msg._hdoc
- if not fdoc:
+ if empty(msg.fdoc):
logger.warning("Tried to copy a MSG with no fdoc")
return
- new_fdoc = copy.deepcopy(fdoc.content)
- copy_hdoc = copy.deepcopy(hdoc.content)
+ new_fdoc = copy.deepcopy(msg.fdoc.content)
fdoc_chash = new_fdoc[fields.CONTENT_HASH_KEY]
- # XXX is this hitting the db??? --- probably.
- # We should profile after the pre-fetch.
dest_fdoc = memstore.get_fdoc_from_chash(
fdoc_chash, self.mbox)
exist = dest_fdoc and not empty(dest_fdoc.content)
- return exist, new_fdoc, copy_hdoc
+ return exist, new_fdoc
# convenience fun
diff --git a/mail/src/leap/mail/imap/memorystore.py b/mail/src/leap/mail/imap/memorystore.py
index b198e128..4156c0b1 100644
--- a/mail/src/leap/mail/imap/memorystore.py
+++ b/mail/src/leap/mail/imap/memorystore.py
@@ -592,7 +592,8 @@ class MemoryStore(object):
:param mbox: the mailbox
:type mbox: str or unicode
- :param flag_docs: a dict with the content for the flag docs.
+ :param flag_docs: a dict with the content for the flag docs, indexed
+ by uid.
:type flag_docs: dict
"""
# We can do direct assignments cause we know this will only
@@ -601,6 +602,20 @@ class MemoryStore(object):
for uid in flag_docs:
fdoc_store[uid] = ReferenciableDict(flag_docs[uid])
+ def load_header_docs(self, header_docs):
+ """
+ Load the flag documents for the given mbox.
+ Used during header docs prefetch, and during cache after
+ a read from soledad if the hdoc property in message did not
+ find its value in here.
+
+ :param flag_docs: a dict with the content for the flag docs.
+ :type flag_docs: dict
+ """
+ hdoc_store = self._hdoc_store
+ for chash in header_docs:
+ hdoc_store[chash] = ReferenciableDict(header_docs[chash])
+
def all_flags(self, mbox):
"""
Return a dictionary with all the flags for a given mbox.
diff --git a/mail/src/leap/mail/imap/messages.py b/mail/src/leap/mail/imap/messages.py
index fbae05f7..4b956894 100644
--- a/mail/src/leap/mail/imap/messages.py
+++ b/mail/src/leap/mail/imap/messages.py
@@ -153,12 +153,20 @@ class LeapMessage(fields, MailParser, MBoxParser):
"""
An accessor to the headers document.
"""
- if self._container is not None:
+ container = self._container
+ if container is not None:
hdoc = self._container.hdoc
if hdoc and not empty(hdoc.content):
return hdoc
- # XXX cache this into the memory store !!!
- return self._get_headers_doc()
+ hdoc = self._get_headers_doc()
+
+ if container and not empty(hdoc.content):
+ # mem-cache it
+ hdoc_content = hdoc.content
+ chash = hdoc_content.get(fields.CONTENT_HASH_KEY)
+ hdocs = {chash: hdoc_content}
+ container.memstore.load_header_docs(hdocs)
+ return hdoc
@property
def chash(self):