From 7cf2dc078502b011498da48b2eb4286b9cf082e3 Mon Sep 17 00:00:00 2001 From: Alex Roitman Date: Fri, 28 Jul 2006 04:10:43 +0000 Subject: [PATCH] (find_backlink_handles): Work around readonly db problems; (_get_obj_from_gramps_id): Work around readonly db problems. svn: r7087 --- ChangeLog | 2 ++ src/GrampsDb/_GrampsBSDDB.py | 42 +++++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9e0bc58b7..24723536f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,8 @@ * src/GrampsDb/_ReadGrdb.py: Re-map name formats on import. * src/GrampsDb/_GrampsBSDDB.py (_load_metadata): Upgrade custom name formats. + (find_backlink_handles): Work around readonly db problems; + (_get_obj_from_gramps_id): Work around readonly db problems. * src/GrampsDb/_ReadXML.py (start_format): Attempt parsing the active state for the custom name format; re-map format numbers on import. diff --git a/src/GrampsDb/_GrampsBSDDB.py b/src/GrampsDb/_GrampsBSDDB.py index b2d7658de..a6a6e592b 100644 --- a/src/GrampsDb/_GrampsBSDDB.py +++ b/src/GrampsDb/_GrampsBSDDB.py @@ -599,7 +599,14 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): # (referenced_object_class_name, referenced_object_handle)) # so we need the first tuple to give us the type to compare - data = pickle.loads(data) + ### 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: + data = self.reference_map.get(data) + else: + data = pickle.loads(data) if include_classes == None or \ KEY_TO_CLASS_MAP[data[0][0]] in include_classes: yield (KEY_TO_CLASS_MAP[data[0][0]],data[0][1]) @@ -985,11 +992,19 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): vals.sort() return [item[1] for item in vals] - def _get_obj_from_gramps_id(self,val,tbl,class_init): + def _get_obj_from_gramps_id(self,val,tbl,class_init,prim_tbl): if tbl.has_key(str(val)): data = tbl.get(str(val),txn=self.txn) obj = class_init() - obj.unserialize(pickle.loads(data)) + ### 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: + tuple_data = prim_tbl.get(data,txn=self.txn) + else: + tuple_data = pickle.loads(data) + obj.unserialize(tuple_data) return obj else: return None @@ -999,49 +1014,56 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback): Finds a Person in the database from the passed gramps' ID. If no such Person exists, None is returned. """ - return self._get_obj_from_gramps_id(val,self.id_trans,Person) + return self._get_obj_from_gramps_id(val,self.id_trans,Person, + self.person_map) def get_family_from_gramps_id(self,val): """ Finds a Family in the database from the passed gramps' ID. If no such Family exists, None is return. """ - return self._get_obj_from_gramps_id(val,self.fid_trans,Family) + return self._get_obj_from_gramps_id(val,self.fid_trans,Family, + self.family_map) def get_event_from_gramps_id(self,val): """ Finds an Event in the database from the passed gramps' ID. If no such Family exists, None is returned. """ - return self._get_obj_from_gramps_id(val,self.eid_trans,Event) + return self._get_obj_from_gramps_id(val,self.eid_trans,Event, + self.event_map) def get_place_from_gramps_id(self,val): """ Finds a Place in the database from the passed gramps' ID. If no such Place exists, None is returned. """ - return self._get_obj_from_gramps_id(val,self.pid_trans,Place) + return self._get_obj_from_gramps_id(val,self.pid_trans,Place, + self.place_map) def get_source_from_gramps_id(self,val): """ Finds a Source in the database from the passed gramps' ID. If no such Source exists, None is returned. """ - return self._get_obj_from_gramps_id(val,self.sid_trans,Source) + return self._get_obj_from_gramps_id(val,self.sid_trans,Source, + self.source_map) def get_object_from_gramps_id(self,val): """ Finds a MediaObject in the database from the passed gramps' ID. If no such MediaObject exists, None is returned. """ - return self._get_obj_from_gramps_id(val,self.oid_trans,MediaObject) + return self._get_obj_from_gramps_id(val,self.oid_trans,MediaObject, + self.media_map) def get_repository_from_gramps_id(self,val): """ Finds a Repository in the database from the passed gramps' ID. If no such MediaObject exists, None is returned. """ - return self._get_obj_from_gramps_id(val,self.rid_trans,Repository) + return self._get_obj_from_gramps_id(val,self.rid_trans,Repository, + self.repository_map) def _commit_base(self, obj, data_map, key, update_list, add_list, transaction, change_time):