def __init__(self, filename, flag='c', mode=None, file_format='pickle'): self.flag = flag # r=readonly, c=create, or n=new self.mode = mode # None or an octal triple like 0644 self.file_format = file_format # 'csv', 'json', or 'pickle' self.filename = filename if flag != 'n' and os.access(filename, os.R_OK): log.debug('Reading %s storage from disk at "%s"', self.file_format, self.filename) fileobj = open(filename, 'rb' if file_format == 'pickle' else 'r') with fileobj: self.load(fileobj)
def get_storage(self, name='main', file_format='pickle', TTL=None): '''Returns a storage for the given name. The returned storage is a fully functioning python dictionary and is designed to be used that way. It is usually not necessary for the caller to load or save the storage manually. If the storage does not already exist, it will be created. .. seealso:: :class:`resources.lib.xbmcswift2b.TimedStorage` for more details. :param name: The name of the storage to retrieve. :param file_format: Choices are 'pickle', 'csv', and 'json'. Pickle is recommended as it supports python objects. .. note:: If a storage already exists for the given name, the file_format parameter is ignored. The format will be determined by the existing storage file. :param TTL: The time to live for storage items specified in minutes or None for no expiration. Since storage items aren't expired until a storage is loaded form disk, it is possible to call get_storage() with a different TTL than when the storage was created. The currently specified TTL is always honored. ''' if not hasattr(self, '_unsynced_storages'): self._unsynced_storages = {} filename = os.path.join(self.storage_path, name) try: storage = self._unsynced_storages[filename] log.debug('Loaded storage "%s" from memory', name) except KeyError: if TTL: TTL = timedelta(minutes=TTL) try: storage = TimedStorage(filename, file_format, TTL) except ValueError: # Thrown when the storage file is corrupted and can't be read. # Prompt user to delete storage. choices = ['Clear storage', 'Cancel'] ret = xbmcgui.Dialog().select('A storage file is corrupted. It' ' is recommended to clear it.', choices) if ret == 0: os.remove(filename) storage = TimedStorage(filename, file_format, TTL) else: raise Exception('Corrupted storage file at %s' % filename) self._unsynced_storages[filename] = storage log.debug('Loaded storage "%s" from disk', name) return storage
def get_storage(self, name='main', file_format='pickle', TTL=None): '''Returns a storage for the given name. The returned storage is a fully functioning python dictionary and is designed to be used that way. It is usually not necessary for the caller to load or save the storage manually. If the storage does not already exist, it will be created. .. seealso:: :class:`resources.lib.xbmcswift2b.TimedStorage` for more details. :param name: The name of the storage to retrieve. :param file_format: Choices are 'pickle', 'csv', and 'json'. Pickle is recommended as it supports python objects. .. note:: If a storage already exists for the given name, the file_format parameter is ignored. The format will be determined by the existing storage file. :param TTL: The time to live for storage items specified in minutes or None for no expiration. Since storage items aren't expired until a storage is loaded form disk, it is possible to call get_storage() with a different TTL than when the storage was created. The currently specified TTL is always honored. ''' if not hasattr(self, '_unsynced_storages'): self._unsynced_storages = {} filename = os.path.join(self.storage_path, name) try: storage = self._unsynced_storages[filename] log.debug('Loaded storage "%s" from memory', name) except KeyError: if TTL: TTL = timedelta(minutes=TTL) try: storage = TimedStorage(filename, file_format, TTL) except ValueError: # Thrown when the storage file is corrupted and can't be read. # Prompt user to delete storage. choices = ['Clear storage', 'Cancel'] ret = xbmcgui.Dialog().select( 'A storage file is corrupted. It' ' is recommended to clear it.', choices) if ret == 0: os.remove(filename) storage = TimedStorage(filename, file_format, TTL) else: raise Exception('Corrupted storage file at %s' % filename) self._unsynced_storages[filename] = storage log.debug('Loaded storage "%s" from disk', name) return storage
def wrapper(*args, **kwargs): key = (function.__name__, kwd_mark,) + args if kwargs: key += (kwd_mark,) + tuple(sorted(kwargs.items())) try: result = storage[key] log.debug('Storage hit for function "%s" with args "%s" ' 'and kwargs "%s"', function.__name__, args, kwargs) except KeyError: log.debug('Storage miss for function "%s" with args "%s" ' 'and kwargs "%s"', function.__name__, args, kwargs) result = function(*args, **kwargs) storage[key] = result storage.sync() return result
def wrapper(*args, **kwargs): key = ( function.__name__, kwd_mark, ) + args if kwargs: key += (kwd_mark, ) + tuple(sorted(kwargs.items())) try: result = storage[key] log.debug( 'Storage hit for function "%s" with args "%s" ' 'and kwargs "%s"', function.__name__, args, kwargs) except KeyError: log.debug( 'Storage miss for function "%s" with args "%s" ' 'and kwargs "%s"', function.__name__, args, kwargs) result = function(*args, **kwargs) storage[key] = result storage.sync() return result