Brandon Low <lostlogic@lostlogicx.com> 2011-02-04
"""
-import sys, os, math, mmap
+
+from __future__ import absolute_import
+import sys, os, math, mmap, struct
+
from bup import _helpers
-from bup.helpers import *
+from bup.helpers import (debug1, debug2, log, mmap_read, mmap_readwrite,
+ mmap_readwrite_private, unlink)
+
BLOOM_VERSION = 2
MAX_BITS_EACH = 32 # Kinda arbitrary, but 4 bytes per entry is pretty big
bloom_contains = _helpers.bloom_contains
bloom_add = _helpers.bloom_add
+# FIXME: check bloom create() and ShaBloom handling/ownership of "f".
+# The ownership semantics should be clarified since the caller needs
+# to know who is responsible for closing it.
class ShaBloom:
"""Wrapper which contains data from multiple index files. """
k = self.k
return 100*(1-math.exp(-k*float(n)/m))**k
- def add_idx(self, ix):
- """Add the object to the filter, return current pfalse_positive."""
+ def add(self, ids):
+ """Add the hashes in ids (packed binary 20-bytes) to the filter."""
if not self.map:
raise Exception("Cannot add to closed bloom")
- self.entries += bloom_add(self.map, ix.shatable, self.bits, self.k)
+ self.entries += bloom_add(self.map, ids, self.bits, self.k)
+
+ def add_idx(self, ix):
+ """Add the object to the filter."""
+ self.add(ix.shatable)
self.idxnames.append(os.path.basename(ix.name))
def exists(self, sha):
expected = 1
return ShaBloom(name, f=f, readwrite=True, expected=expected)
+
+def clear_bloom(dir):
+ unlink(os.path.join(dir, 'bup.bloom'))