X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=apt_p2p%2Fdb.py;h=4bb5a754b498c32e2cac9b53ae21c1558f7f8c82;hb=648ac0a2827cc56476ec4bdc7259e417fc3058dd;hp=26409875f3339c37bb74fb086d7cc07fc8ae972f;hpb=253dd262912897565da6b65708905586efc4b542;p=quix0rs-apt-p2p.git diff --git a/apt_p2p/db.py b/apt_p2p/db.py index 2640987..4bb5a75 100644 --- a/apt_p2p/db.py +++ b/apt_p2p/db.py @@ -240,26 +240,28 @@ class DB: For each hash that needs refreshing, finds all the files with that hash. If the file has changed or is missing, it is removed from the table. - @return: dictionary with keys the hashes, values a list of FilePaths + @return: a list of dictionaries of each hash needing refreshing, sorted by age """ t = datetime.now() - timedelta(seconds=expireAfter) # Find all the hashes that need refreshing c = self.conn.cursor() - c.execute("SELECT hashID, hash, pieces FROM hashes WHERE refreshed < ?", (t, )) + c.execute("SELECT hashID, hash, pieces FROM hashes WHERE refreshed < ? ORDER BY refreshed", (t, )) row = c.fetchone() - expired = {} + expired = [] while row: - res = expired.setdefault(row['hash'], {}) - res['hashID'] = row['hashID'] + res = {} res['hash'] = row['hash'] + res['hashID'] = row['hashID'] res['pieces'] = row['pieces'] + expired.append(res) row = c.fetchone() # Make sure there are still valid DHT files for each hash - for hash in expired.values(): + for i in xrange(len(expired)-1, -1, -1): dht = False non_dht = False + hash = expired[i] c.execute("SELECT path, dht, size, mtime FROM files WHERE hashID = ?", (hash['hashID'], )) row = c.fetchone() while row: @@ -270,7 +272,7 @@ class DB: row = c.fetchone() if not dht: # Remove hashes for which no DHT files are still available - del expired[hash['hash']] + del expired[i] if not non_dht: # Remove hashes for which no files are still available c.execute("DELETE FROM hashes WHERE hashID = ?", (hash['hashID'], )) @@ -427,14 +429,14 @@ class TestDB(unittest.TestCase): def test_expiry(self): """Tests retrieving the files from the database that have expired.""" res = self.store.expiredHashes(1) - self.failUnlessEqual(len(res.keys()), 0) + self.failUnlessEqual(len(res), 0) sleep(2) res = self.store.expiredHashes(1) - self.failUnlessEqual(len(res.keys()), 1) - self.failUnlessEqual(res.keys()[0], self.hash) + self.failUnlessEqual(len(res), 1) + self.failUnlessEqual(res[0]['hash'], self.hash) self.store.refreshHash(self.hash) res = self.store.expiredHashes(1) - self.failUnlessEqual(len(res.keys()), 0) + self.failUnlessEqual(len(res), 0) def build_dirs(self): for dir in self.dirs: @@ -449,7 +451,7 @@ class TestDB(unittest.TestCase): """Tests looking up a hash with multiple files in the database.""" self.build_dirs() res = self.store.expiredHashes(1) - self.failUnlessEqual(len(res.keys()), 0) + self.failUnlessEqual(len(res), 0) res = self.store.lookupHash(self.hash) self.failUnless(res) self.failUnlessEqual(len(res), 4) @@ -458,11 +460,11 @@ class TestDB(unittest.TestCase): self.failUnlessEqual(res[0]['refreshed'], res[3]['refreshed']) sleep(2) res = self.store.expiredHashes(1) - self.failUnlessEqual(len(res.keys()), 1) - self.failUnlessEqual(res.keys()[0], self.hash) + self.failUnlessEqual(len(res), 1) + self.failUnlessEqual(res[0]['hash'], self.hash) self.store.refreshHash(self.hash) res = self.store.expiredHashes(1) - self.failUnlessEqual(len(res.keys()), 0) + self.failUnlessEqual(len(res), 0) def test_removeUntracked(self): """Tests removing untracked files from the database."""