changeset 71:ad7928372221

added CachedFileStorage class and made it the default; stress test perf improved by a factor of ~5.5.
author Atul Varma <avarma@mozilla.com>
date Tue, 29 Jun 2010 22:28:06 -0700
parents 09c95c2549f3
children 1f03c20b2510
files summitidp/easy.py summitidp/file_storage.py
diffstat 2 files changed, 74 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/summitidp/easy.py	Tue Jun 29 21:52:27 2010 -0700
+++ b/summitidp/easy.py	Tue Jun 29 22:28:06 2010 -0700
@@ -3,7 +3,7 @@
 import json
 
 from summitidp.app import Server, TokenStore, ProfileStore
-from summitidp.file_storage import FileStorage
+from summitidp.file_storage import CachedFileStorage as FileStorage
 from summitidp.locking import synced_app
 
 CHALLENGE_TOKEN_LIFETIME = datetime.timedelta(days=1)
--- a/summitidp/file_storage.py	Tue Jun 29 21:52:27 2010 -0700
+++ b/summitidp/file_storage.py	Tue Jun 29 22:28:06 2010 -0700
@@ -1,6 +1,7 @@
 import re
 import os
 import json
+from copy import deepcopy
 
 class FileStorage(object):
     """
@@ -81,6 +82,78 @@
             return default
         return self[name]
 
+class CachedFileStorage(object):
+    """
+    >>> import tempfile
+    >>> dirname = tempfile.mkdtemp(prefix='test')
+    >>> olddir = os.getcwd()
+    >>> os.chdir(dirname)
+
+    >>> fs = CachedFileStorage('.')
+    >>> 'blah' in fs
+    False
+    >>> os.path.exists('blah.json')
+    False
+    >>> fs['blah'] = {'foo': 1}
+    >>> 'blah' in fs
+    True
+    >>> os.path.exists('blah.json')
+    True
+    >>> open('blah.json').read()
+    '{"foo": 1}'
+    >>> fs['blah']
+    {'foo': 1}
+    >>> for name in fs:
+    ...   print name
+    blah
+    >>> fs.get('blah', 0)
+    {'foo': 1}
+    >>> del fs['blah']
+    >>> fs.get('blah', 0)
+    0
+    >>> 'blah' in fs
+    False
+    >>> '9-p' in fs
+    False
+    >>> '9_p' in fs
+    False
+    >>> os.path.exists('blah.json')
+    False
+
+    >>> os.chdir(olddir)
+    >>> os.rmdir(dirname)
+    """
+
+    def __init__(self, dirname):
+        self.dirname = dirname
+        self.__cache = {}
+        self.__storage = FileStorage(self.dirname)
+        for key in self.__storage:
+            self.__cache[key] = self.__storage[key]
+
+    def __iter__(self):
+        for name in self.__cache:
+            yield name
+
+    def __contains__(self, name):
+        return (name in self.__cache)
+
+    def __delitem__(self, name):
+        del self.__storage[name]
+        del self.__cache[name]
+
+    def __getitem__(self, name):
+        return deepcopy(self.__cache[name])
+
+    def __setitem__(self, name, value):
+        self.__storage[name] = value
+        self.__cache[name] = deepcopy(value)
+
+    def get(self, name, default=None):
+        if not name in self:
+            return default
+        return self[name]
+
 if __name__ == '__main__':
     import doctest