tahoe-lafs/src/allmydata/immutable/filenode.py

119 lines
3.2 KiB
Python
Raw Normal View History

from zope.interface import implements
from twisted.internet import defer
from allmydata.interfaces import IFileNode, IFileURI, IURI, ICheckable
from allmydata import uri
from allmydata.immutable.checker import Results, \
SimpleCHKFileChecker, SimpleCHKFileVerifier
class FileNode:
implements(IFileNode, ICheckable)
def __init__(self, uri, client):
u = IFileURI(uri)
self.uri = u.to_string()
self._client = client
def get_uri(self):
return self.uri
def is_mutable(self):
return False
def is_readonly(self):
return True
def get_readonly_uri(self):
return self.uri
def get_size(self):
return IFileURI(self.uri).get_size()
def __hash__(self):
return hash((self.__class__, self.uri))
def __cmp__(self, them):
if cmp(type(self), type(them)):
return cmp(type(self), type(them))
if cmp(self.__class__, them.__class__):
return cmp(self.__class__, them.__class__)
return cmp(self.uri, them.uri)
def get_verifier(self):
return IFileURI(self.uri).get_verifier()
def check(self, verify=False, repair=False):
assert repair is False # not implemented yet
vcap = self.get_verifier()
if verify:
v = SimpleCHKFileVerifier(self._client, vcap)
return v.start()
else:
peer_getter = self._client.get_permuted_peers
v = SimpleCHKFileChecker(peer_getter, vcap)
return v.check()
def download(self, target):
downloader = self._client.getServiceNamed("downloader")
return downloader.download(self.uri, target)
def download_to_data(self):
downloader = self._client.getServiceNamed("downloader")
return downloader.download_to_data(self.uri)
class LiteralFileNode:
implements(IFileNode, ICheckable)
def __init__(self, my_uri, client):
u = IFileURI(my_uri)
assert isinstance(u, uri.LiteralFileURI)
self.uri = u.to_string()
self._client = client
def get_uri(self):
return self.uri
def is_mutable(self):
return False
def is_readonly(self):
return True
def get_readonly_uri(self):
return self.uri
def get_size(self):
return len(IURI(self.uri).data)
def __hash__(self):
return hash((self.__class__, self.uri))
def __cmp__(self, them):
if cmp(type(self), type(them)):
return cmp(type(self), type(them))
if cmp(self.__class__, them.__class__):
return cmp(self.__class__, them.__class__)
return cmp(self.uri, them.uri)
def get_verifier(self):
return None
def check(self, verify=False, repair=False):
# neither verify= nor repair= affect LIT files
r = Results(None)
r.healthy = True
r.problems = []
return defer.succeed(r)
def download(self, target):
# note that this does not update the stats_provider
data = IURI(self.uri).data
target.open(len(data))
target.write(data)
target.close()
return defer.maybeDeferred(target.finish)
def download_to_data(self):
data = IURI(self.uri).data
return defer.succeed(data)