Mercurial > summit-idp
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