-import mmap
+
+from __future__ import absolute_import
+import glob, mmap, os, struct
+
from bup import _helpers
-from bup.helpers import *
+from bup.compat import range
+from bup.helpers import log, mmap_read
+
MIDX_VERSION = 4
def __init__(self, filename):
self.name = filename
self.force_keep = False
+ self.map = None
assert(filename.endswith('.midx'))
self.map = mmap_read(open(filename))
if str(self.map[0:4]) != 'MIDX':
self.whichlist = buffer(self.map, self.which_ofs, nsha*4)
self.idxnames = str(self.map[self.which_ofs + 4*nsha:]).split('\0')
+ def __del__(self):
+ self.close()
+
def _init_failed(self):
self.bits = 0
self.entries = 1
- self.fanout = buffer('\0\0\0\0')
- self.shatable = buffer('\0'*20)
+ self.fanout = b'\0\0\0\0'
+ self.shatable = b'\0' * 20
self.idxnames = []
def _fanget(self, i):
def _get_idxname(self, i):
return self.idxnames[self._get_idx_i(i)]
+ def close(self):
+ if self.map is not None:
+ self.map.close()
+ self.map = None
+
def exists(self, hash, want_source=False):
"""Return nonempty if the object exists in the index files."""
global _total_searches, _total_steps
return None
def __iter__(self):
- for i in xrange(self._fanget(self.entries-1)):
- yield buffer(self.shatable, i*20, 20)
+ count = self._fanget(self.entries-1)
+ for ofs in range(0, count * 20, 20):
+ yield self.shatable[ofs : ofs + 20]
def __len__(self):
return int(self._fanget(self.entries-1))
+def clear_midxes(dir=None):
+ for midx in glob.glob(os.path.join(dir, '*.midx')):
+ os.unlink(midx)