|
@@ -112,12 +112,11 @@ class Store(object):
|
|
|
if not self.compact:
|
|
|
return
|
|
|
self.io.close_band()
|
|
|
+ def lookup(ns, key):
|
|
|
+ return key in self.indexes[ns]
|
|
|
for band in self.compact:
|
|
|
- for ns, key, offset, size in self.io.iter_objects(band):
|
|
|
- if key in self.indexes[ns]:
|
|
|
- del self.indexes[ns][key]
|
|
|
- data = self.io.read(band, offset)
|
|
|
- self.indexes[ns][key] = self.io.write(ns, key, data)
|
|
|
+ for ns, key, data in self.io.iter_objects(band, lookup):
|
|
|
+ self.indexes[ns][key] = self.io.write(ns, key, data)
|
|
|
for band in self.compact:
|
|
|
self.io.delete_band(band)
|
|
|
|
|
@@ -343,7 +342,7 @@ class BandIO(object):
|
|
|
assert magic == 0
|
|
|
return fd.read(size - self.header_fmt.size)
|
|
|
|
|
|
- def iter_objects(self, band):
|
|
|
+ def iter_objects(self, band, lookup):
|
|
|
fd = self.get_fd(band)
|
|
|
fd.seek(0)
|
|
|
assert fd.read(8) == 'DARCBAND'
|
|
@@ -351,10 +350,11 @@ class BandIO(object):
|
|
|
data = fd.read(self.header_fmt.size)
|
|
|
while data:
|
|
|
size, magic, ns, key = self.header_fmt.unpack(data)
|
|
|
- size -= self.header_fmt.size
|
|
|
- yield ns, key, offset, size
|
|
|
- offset += size + self.header_fmt.size
|
|
|
- fd.seek(offset)
|
|
|
+ offset += size
|
|
|
+ if lookup(ns, key):
|
|
|
+ yield ns, key, fd.read(size - self.header_fmt.size)
|
|
|
+ else:
|
|
|
+ fd.seek(offset)
|
|
|
data = fd.read(self.header_fmt.size)
|
|
|
|
|
|
def write(self, ns, id, data):
|