# 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
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
from Base import BaseFolder
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
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()
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()
def getmessagelist(self):
return self.messagelist
- def savemessage(self, uid, content, flags):
+ def savemessage(self, uid, content, flags, rtime):
if uid < 0:
# We cannot assign a uid.
return uid
self.savemessageflags(uid, flags)
return uid
- self.messagelist[uid] = {'uid': uid, 'flags': flags}
+ self.messagelist[uid] = {'uid': uid, 'flags': flags, 'time': rtime}
self.autosave()
return uid
def getmessageflags(self, uid):
return self.messagelist[uid]['flags']
+ def getmessagetime(self, uid):
+ return self.messagelist[uid]['time']
+
def savemessageflags(self, uid, flags):
self.messagelist[uid]['flags'] = flags
self.autosave()