mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-05 03:35:51 +00:00
* Fix RIPD-509, RIPD-514, RIPD-519, RIPD-525, RIPD-527, RIPD-529, RIPD-530 and RIPD-531. * Protect people from ledger-spew and remove cruft. * Better error messages and handling. * Cache command lists or clears ledger cache. * Better ledger summaries. * Offline mode.
57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
from __future__ import absolute_import, division, print_function, unicode_literals
|
|
|
|
import gzip
|
|
import json
|
|
import os
|
|
|
|
_NONE = object()
|
|
|
|
class FileCache(object):
|
|
"""A two-level cache, which stores expensive results in memory and on disk.
|
|
"""
|
|
def __init__(self, cache_directory, creator, open=gzip.open, suffix='.gz'):
|
|
self.cache_directory = cache_directory
|
|
self.creator = creator
|
|
self.open = open
|
|
self.suffix = suffix
|
|
self.cached_data = {}
|
|
if not os.path.exists(self.cache_directory):
|
|
os.makedirs(self.cache_directory)
|
|
|
|
def get_file_data(self, name):
|
|
if os.path.exists(filename):
|
|
return json.load(self.open(filename))
|
|
|
|
result = self.creator(name)
|
|
return result
|
|
|
|
def get_data(self, name, save_in_cache, can_create, default=None):
|
|
name = str(name)
|
|
result = self.cached_data.get(name, _NONE)
|
|
if result is _NONE:
|
|
filename = os.path.join(self.cache_directory, name) + self.suffix
|
|
if os.path.exists(filename):
|
|
result = json.load(self.open(filename)) or _NONE
|
|
if result is _NONE and can_create:
|
|
result = self.creator(name)
|
|
if save_in_cache:
|
|
json.dump(result, self.open(filename, 'w'))
|
|
return default if result is _NONE else result
|
|
|
|
def _files(self):
|
|
return os.listdir(self.cache_directory)
|
|
|
|
def cache_list(self):
|
|
for f in self._files():
|
|
if f.endswith(self.suffix):
|
|
yield f[:-len(self.suffix)]
|
|
|
|
def file_count(self):
|
|
return len(self._files())
|
|
|
|
def clear(self):
|
|
"""Clears both local files and memory."""
|
|
self.cached_data = {}
|
|
for f in self._files():
|
|
os.remove(os.path.join(self.cache_directory, f))
|