lbry-sdk/lbrynet/dht/datastore.py

56 lines
1.8 KiB
Python
Raw Normal View History

2015-08-20 17:27:15 +02:00
import UserDict
import constants
2017-10-10 19:08:22 +02:00
from interface import IDataStore
from zope.interface import implements
2015-08-20 17:27:15 +02:00
2017-10-10 19:08:22 +02:00
class DictDataStore(UserDict.DictMixin):
2015-08-20 17:27:15 +02:00
""" A datastore using an in-memory Python dictionary """
2017-10-10 19:08:22 +02:00
implements(IDataStore)
2017-03-31 19:32:43 +02:00
2018-05-23 22:53:35 +02:00
def __init__(self, getTime=None):
2015-08-20 17:27:15 +02:00
# Dictionary format:
# { <key>: (<value>, <lastPublished>, <originallyPublished> <originalPublisherID>) }
self._dict = {}
2018-05-23 22:53:35 +02:00
if not getTime:
from twisted.internet import reactor
getTime = reactor.seconds
self._getTime = getTime
2015-08-20 17:27:15 +02:00
def keys(self):
""" Return a list of the keys in this data store """
return self._dict.keys()
def removeExpiredPeers(self):
2018-05-23 22:53:35 +02:00
now = int(self._getTime())
2017-03-31 19:32:43 +02:00
2015-08-20 17:27:15 +02:00
def notExpired(peer):
if (now - peer[2]) > constants.dataExpireTimeout:
return False
return True
2017-03-31 19:32:43 +02:00
2015-08-20 17:27:15 +02:00
for key in self._dict.keys():
unexpired_peers = filter(notExpired, self._dict[key])
self._dict[key] = unexpired_peers
def hasPeersForBlob(self, key):
if key in self._dict and len(self._dict[key]) > 0:
return True
return False
def addPeerToBlob(self, key, value, lastPublished, originallyPublished, originalPublisherID):
if key in self._dict:
self._dict[key].append((value, lastPublished, originallyPublished, originalPublisherID))
else:
self._dict[key] = [(value, lastPublished, originallyPublished, originalPublisherID)]
def getPeersForBlob(self, key):
if key in self._dict:
return [val[0] for val in self._dict[key]]
2017-10-10 19:27:44 +02:00
def removePeer(self, value):
for key in self._dict:
self._dict[key] = [val for val in self._dict[key] if val[0] != value]
if not self._dict[key]:
del self._dict[key]