]> code.delx.au - offlineimap/blobdiff - offlineimap/folder/LocalStatus.py
Merge commit 'origin' into v7
[offlineimap] / offlineimap / folder / LocalStatus.py
index 937825d5ba66c200147016e5d4c082679dc6702a..9f2cf88442dc690ce655c557605ad7b8d74f4ecf 100644 (file)
@@ -1,5 +1,5 @@
 # Local status cache virtual folder
-# Copyright (C) 2002 - 2003 John Goerzen
+# Copyright (C) 2002 - 2008 John Goerzen
 # <jgoerzen@complete.org>
 #
 #    This program is free software; you can redistribute it and/or modify
@@ -22,10 +22,12 @@ import os, threading
 magicline = "OFFLINEIMAP LocalStatus CACHE DATA - DO NOT MODIFY - FORMAT 1"
 
 class LocalStatusFolder(BaseFolder):
-    def __init__(self, root, name, repository, accountname):
+    def __init__(self, root, name, repository, accountname, config):
         self.name = name
         self.root = root
         self.sep = '.'
+        self.config = config
+        self.dofsync = config.getdefaultboolean("general", "fsync", True)
         self.filename = os.path.join(root, name)
         self.filename = repository.getfolderfilename(name)
         self.messagelist = None
@@ -67,6 +69,11 @@ class LocalStatusFolder(BaseFolder):
         file = open(self.filename, "rt")
         self.messagelist = {}
         line = file.readline().strip()
+        if not line and not line.read():
+            # The status file is empty - should not have happened,
+            # but somehow did.
+            file.close()
+            return
         assert(line == magicline)
         for line in file.xreadlines():
             line = line.strip()
@@ -90,8 +97,20 @@ class LocalStatusFolder(BaseFolder):
                 flags.sort()
                 flags = ''.join(flags)
                 file.write("%s:%s\n" % (msg['uid'], flags))
+            file.flush()
+            if self.dofsync:
+                os.fsync(file.fileno())
             file.close()
             os.rename(self.filename + ".tmp", self.filename)
+
+            if self.dofsync:
+                try:
+                    fd = os.open(os.path.dirname(self.filename), os.O_RDONLY)
+                    os.fsync(fd)
+                    os.close(fd)
+                except:
+                    pass
+
         finally:
             self.savelock.release()