Use the new DB in the main code.
authorCameron Dale <camrdale@gmail.com>
Sat, 12 Jan 2008 18:06:11 +0000 (10:06 -0800)
committerCameron Dale <camrdale@gmail.com>
Sat, 12 Jan 2008 18:06:11 +0000 (10:06 -0800)
apt_dht/MirrorManager.py
apt_dht/apt_dht.py
apt_dht/db.py
apt_dht_Khashmir/khashmir.py

index 8bf197f9d40203749bb4c34ae33938d290e94c51..c41dbe23c8439bda7314794046564c7a1a28940d 100644 (file)
@@ -263,7 +263,7 @@ class MirrorManager:
                 self.updatedFile(url[:-len(ext)], decFile.path)
             
             if self.manager:
-                self.manager.download_complete(hash, url, destFile.path)
+                self.manager.cached_file(hash, url, destFile.path)
         else:
             log.msg("Hashes don't match %s != %s: %s" % (hash.hexexpected(), hash.hexdigest(), url))
 
index 2af1df92d4aeb555f8e33f73ce5a462d338d7cdc..0a0059fdfa83fe17918c07eaf055a6105df6d157 100644 (file)
@@ -12,10 +12,12 @@ from PeerManager import PeerManager
 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)
@@ -188,22 +190,14 @@ class AptDHT:
             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)
index 7f8c4493a2071643f4243fbbb1023bf51aeadafb..9725aa88f10c36e0bd137de1cb5051850d7cde91 100644 (file)
@@ -69,7 +69,11 @@ class DB:
         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)
@@ -81,13 +85,14 @@ class DB:
             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.
index 8c75c48df2727c4d98a60db575bfe24367eb3df3..af6f0d8817156d0eba8af78feb2c4e320af2346f 100644 (file)
@@ -30,7 +30,7 @@ class KhashmirBase(protocol.Factory):
     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")