diff options
author | Petri Lehtinen <petri@digip.org> | 2012-06-28 10:53:43 (GMT) |
---|---|---|
committer | Petri Lehtinen <petri@digip.org> | 2012-06-28 10:56:14 (GMT) |
commit | dde8cb0899a0feb5a71918cc11bbc4f7f19830d4 (patch) | |
tree | c737036c0873297777e3ee05bb2c2e88219f0f6e /Lib/mailbox.py | |
parent | abb755db11b8f5a5a0b9c97540e3fb4e161e1894 (diff) | |
parent | f29435f9f0659d433ed2e0e3e8b9c15a4c7155fd (diff) | |
download | cpython-dde8cb0899a0feb5a71918cc11bbc4f7f19830d4.zip cpython-dde8cb0899a0feb5a71918cc11bbc4f7f19830d4.tar.gz cpython-dde8cb0899a0feb5a71918cc11bbc4f7f19830d4.tar.bz2 |
#9559: Append data to single-file mailbox files if messages are only added
If messages were only added, a new file is no longer created and
renamed over the old file when flush() is called on an mbox, MMDF or
Babyl mailbox.
Diffstat (limited to 'Lib/mailbox.py')
-rw-r--r-- | Lib/mailbox.py | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/Lib/mailbox.py b/Lib/mailbox.py index d86ad94..39968c6 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -587,16 +587,19 @@ class _singlefileMailbox(Mailbox): self._file = f self._toc = None self._next_key = 0 - self._pending = False # No changes require rewriting the file. + self._pending = False # No changes require rewriting the file. + self._pending_sync = False # No need to sync the file self._locked = False - self._file_length = None # Used to record mailbox size + self._file_length = None # Used to record mailbox size def add(self, message): """Add message and return assigned key.""" self._lookup() self._toc[self._next_key] = self._append_message(message) self._next_key += 1 - self._pending = True + # _append_message appends the message to the mailbox file. We + # don't need a full rewrite + rename, sync is enough. + self._pending_sync = True return self._next_key - 1 def remove(self, key): @@ -642,6 +645,11 @@ class _singlefileMailbox(Mailbox): def flush(self): """Write any pending changes to disk.""" if not self._pending: + if self._pending_sync: + # Messages have only been added, so syncing the file + # is enough. + _sync_flush(self._file) + self._pending_sync = False return # In order to be writing anything out at all, self._toc must @@ -695,6 +703,7 @@ class _singlefileMailbox(Mailbox): self._file = open(self._path, 'rb+') self._toc = new_toc self._pending = False + self._pending_sync = False if self._locked: _lock_file(self._file, dotlock=False) @@ -731,6 +740,9 @@ class _singlefileMailbox(Mailbox): """Append message to mailbox and return (start, stop) offsets.""" self._file.seek(0, 2) before = self._file.tell() + if len(self._toc) == 0: + # This is the first message + self._pre_mailbox_hook(self._file) try: self._pre_message_hook(self._file) offsets = self._install_message(message) |