Fix tree cursor for read-only databases

This commit is contained in:
Nick Hall 2014-05-25 00:00:40 +01:00
parent 545b99e348
commit 72b96c96f9

View File

@ -202,10 +202,12 @@ class DbReadCursor(BsddbBaseCursor):
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class DbBsddbTreeCursor(BsddbBaseCursor): class DbBsddbTreeCursor(BsddbBaseCursor):
def __init__(self, source, txn=None, **kwargs): def __init__(self, source, primary, readonly, txn=None, **kwargs):
BsddbBaseCursor.__init__(self, txn=txn, **kwargs) BsddbBaseCursor.__init__(self, txn=txn, **kwargs)
self.cursor = source.cursor(txn) self.cursor = source.cursor(txn)
self.source = source self.source = source
self.primary = primary
self.readonly = readonly
def __iter__(self): def __iter__(self):
""" """
@ -218,7 +220,14 @@ class DbBsddbTreeCursor(BsddbBaseCursor):
key = key.encode('utf-8') if not isinstance(key, bytes) else key key = key.encode('utf-8') if not isinstance(key, bytes) else key
data = self.set(key) data = self.set(key)
while data: while data:
payload = pickle.loads(data[1]) ### FIXME: this is a dirty hack that works without no
### sensible explanation. For some reason, for a readonly
### database, secondary index returns a primary table key
### corresponding to the data, not the data.
if self.readonly:
payload = self.primary.get(data[1], txn=self.txn)
else:
payload = pickle.loads(data[1])
yield (payload[0], payload) yield (payload[0], payload)
to_do.append(payload[0]) to_do.append(payload[0])
data = _n() data = _n()
@ -512,7 +521,8 @@ class DbBsddbRead(DbReadBase, Callback):
return self.get_cursor(self.place_map, *args, **kwargs) return self.get_cursor(self.place_map, *args, **kwargs)
def get_place_tree_cursor(self, *args, **kwargs): def get_place_tree_cursor(self, *args, **kwargs):
return DbBsddbTreeCursor(self.parents, self.txn) return DbBsddbTreeCursor(self.parents, self.place_map, self.readonly,
self.txn)
def get_source_cursor(self, *args, **kwargs): def get_source_cursor(self, *args, **kwargs):
return self.get_cursor(self.source_map, *args, **kwargs) return self.get_cursor(self.source_map, *args, **kwargs)