eth-cache/eth_cache/store.py

71 lines
2.2 KiB
Python

# standard imports
import logging
import os
# external imports
from hexdir import HexDir
from chainlib.eth.tx import pack
from hexathon import strip_0x
logg = logging.getLogger(__name__)
class PointerHexDir(HexDir):
def __init__(self, root_path, key_length, levels=2, prefix_length=0):
super(PointerHexDir, self).__init__(root_path, key_length, levels, prefix_length)
self.pointers = {}
def register_pointer(self, label, dir_name=None):
if dir_name == None:
dir_name = label
pointer_dir = os.path.join(self.path, dir_name)
os.makedirs(pointer_dir, exist_ok=True)
label_file = os.path.join(pointer_dir, '.label')
try:
os.stat(label_file)
except FileNotFoundError:
f = open(label_file, 'w')
f.write(label)
f.close()
self.pointers[label] = pointer_dir
def add_pointer(self, pointer, pointer_relpath, destination_path):
if isinstance(pointer_relpath, list):
link_path = os.path.join(self.pointers[pointer], *pointer_relpath)
else:
link_path = os.path.join(self.pointers[pointer], pointer_relpath)
os.makedirs(os.path.dirname(link_path), exist_ok=True)
os.symlink(destination_path, link_path)
logg.debug('added link {} -> {}'.format(link_path, destination_path))
def add(self, key, content, prefix=b'', pointers={}):
(c, entry_path) = super(PointerHexDir, self).add(key, content, prefix=prefix)
for k in pointers.keys():
self.add_pointer(k, pointers[k], entry_path)
class TxFileStore:
def __init__(self, chain_spec, backend):
self.backend = backend
self.chain_spec = chain_spec
def put(self, block, tx, addresses=[], attrs={}):
tx_src = tx.as_dict()
tx_raw = pack(tx_src, self.chain_spec)
if len(addresses) == 0:
self.backend.add(bytes.fromhex(tx.hash), tx_raw, pointers={})
return
for address in addresses:
filename = '{}_{}_{}'.format(block.number, tx.index, strip_0x(tx.hash))
self.backend.add(bytes.fromhex(tx.hash), tx_raw, pointers={'address': [strip_0x(address),filename]})