summaryrefslogtreecommitdiff
path: root/giscanner/cachestore.py
diff options
context:
space:
mode:
authorJohan Dahlin <jdahlin@async.com.br>2008-11-07 14:09:02 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-11-07 14:09:02 +0000
commitb2155cf1d785e50f021a48c44224dec3d70e6301 (patch)
treea5270867cd76449d3f52d3860aa7e25c09219e31 /giscanner/cachestore.py
parentf85ee225ce85a0dd6e8da008af6eea5c8ea736ce (diff)
downloadgobject-introspection-b2155cf1d785e50f021a48c44224dec3d70e6301.tar.gz
Handle broken cache entries, write only filesystems and running out of
2008-11-07 Johan Dahlin <jdahlin@async.com.br> * giscanner/cachestore.py: Handle broken cache entries, write only filesystems and running out of diskspace. svn path=/trunk/; revision=867
Diffstat (limited to 'giscanner/cachestore.py')
-rw-r--r--giscanner/cachestore.py32
1 files changed, 29 insertions, 3 deletions
diff --git a/giscanner/cachestore.py b/giscanner/cachestore.py
index 809e1501..264ccee4 100644
--- a/giscanner/cachestore.py
+++ b/giscanner/cachestore.py
@@ -61,6 +61,19 @@ class CacheStore(object):
return (os.stat(store_filename).st_mtime >=
os.stat(filename).st_mtime)
+ def _purge_cache(self, filename):
+ try:
+ os.unlink(filename)
+ except IOError, e:
+ # Permission denied
+ if e.errno == errno.EACCES:
+ return
+ # File does not exist
+ elif e.errno == errno.ENOENT:
+ return
+ else:
+ raise
+
def store(self, filename, data):
store_filename = self._get_filename(filename)
if store_filename is None:
@@ -69,7 +82,14 @@ class CacheStore(object):
self._cache_is_valid(store_filename, filename)):
return None
fd = open(store_filename, 'w')
- cPickle.dump(data, fd)
+ try:
+ cPickle.dump(data, fd)
+ except IOError, e:
+ # No space left on device
+ if e.errno == e.ENOSPC:
+ return
+ else:
+ raise
def load(self, filename):
store_filename = self._get_filename(filename)
@@ -80,8 +100,14 @@ class CacheStore(object):
except IOError, e:
if e.errno == errno.ENOENT:
return None
- raise
+ else:
+ raise
if not self._cache_is_valid(store_filename, filename):
return None
- data = cPickle.load(fd)
+ try:
+ data = cPickle.load(fd)
+ except EOFError:
+ # Broken cache entry, remove it
+ self._purge_cache(store_filename)
+ data = None
return data