from HTTPServer import TopLevel
from MirrorManager import MirrorManager
from Hash import HashObject
+from db import DB
class AptDHT:
def __init__(self, dht):
log.msg('Initializing the main apt_dht application')
+ self.db = DB(config.get('DEFAULT', 'cache_dir') + '/.apt-dht.db')
self.dht = dht
self.dht.loadConfig(config, config.get('DEFAULT', 'DHT'))
self.dht.join().addCallbacks(self.joinComplete, self.joinError)
return getDefer
return response
- def download_complete(self, hash, url, file_path):
+ def cached_file(self, hash, url, file_path):
assert file_path.startswith(config.get('DEFAULT', 'cache_dir'))
- directory = file_path[:len(config.get('DEFAULT', 'cache_dir'))]
- url_path = file_path[len(config.get('DEFAULT', 'cache_dir')):]
- if url_path[0] == '/':
- url_path = url_path[1:]
- top_directory = url_path.split('/',1)[0]
- url_path = url_path[len(top_directory):]
- http_dir = os.path.join(directory, top_directory)
- new_top = self.http_server.addDirectory(http_dir)
- url_path = '/' + new_top + url_path
- log.msg('now avaliable at %s: %s' % (url_path, url))
+ urlpath, newdir = self.db.storeFile(file_path, hash.digest(), config.get('DEFAULT', 'cache_dir'))
+ log.msg('now avaliable at %s: %s' % (urlpath, url))
if self.my_addr:
site = self.my_addr + ':' + str(config.getint('DEFAULT', 'PORT'))
- full_path = urlunparse(('http', site, url_path, None, None, None))
+ full_path = urlunparse(('http', site, urlpath, None, None, None))
key = hash.norm(bits = config.getint(config.get('DEFAULT', 'DHT'), 'HASH_LENGTH'))
storeDefer = self.dht.storeValue(key, full_path)
storeDefer.addCallback(self.store_done, full_path)
return res
def storeFile(self, path, hash, directory):
- """Store or update a file in the database."""
+ """Store or update a file in the database.
+
+ @return: the urlpath to access the file, and whether a
+ new url top-level directory was needed
+ """
path = os.path.abspath(path)
directory = os.path.abspath(directory)
assert path.startswith(directory)
c.execute("UPDATE files SET hash = ?, size = ?, mtime = ?, refreshed = ?",
(khash(hash), stat.st_size, stat.st_mtime, datetime.now()))
newdir = False
+ urldir = row['urldir']
else:
urldir, newdir = self.findDirectory(directory)
c.execute("INSERT OR REPLACE INTO files VALUES(?, ?, ?, ?, ?, ?, ?)",
(path, khash(hash), urldir, len(directory), stat.st_size, stat.st_mtime, datetime.now()))
self.conn.commit()
c.close()
- return newdir
+ return '/~' + str(urldir) + path[len(directory):], newdir
def getFile(self, path):
"""Get a file from the database.
def setup(self, config, cache_dir):
self.config = config
self.port = config['PORT']
- self.store = DB(os.path.join(cache_dir, 'khashmir.' + str(self.port) + '.db'))
+ self.store = DB(os.path.join(cache_dir, '.khashmir.' + str(self.port) + '.db'))
self.node = self._loadSelfNode('', self.port)
self.table = KTable(self.node, config)
#self.app = service.Application("krpc")