From 479b3833d9f51eef5d416cbc78e52617bf2872ac Mon Sep 17 00:00:00 2001 From: Richard Taylor Date: Thu, 15 Dec 2005 17:48:48 +0000 Subject: [PATCH] added delete support for the reference_map svn: r5556 --- gramps2/ChangeLog | 4 ++++ gramps2/src/GrampsBSDDB.py | 37 ++++++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index c625aee87..a80784d55 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,7 @@ +2005-12-15 Richard Taylor + * src/GrampsBSDDB.py: added delete support for the + reference_map + 2005-12-15 Richard Taylor * src/GrampsBSDDB.py: implemented get_backlink_handles that uses the reference_map index, _update_reference_map that populates diff --git a/gramps2/src/GrampsBSDDB.py b/gramps2/src/GrampsBSDDB.py index 30c8db25a..376c8448f 100644 --- a/gramps2/src/GrampsBSDDB.py +++ b/gramps2/src/GrampsBSDDB.py @@ -443,11 +443,6 @@ class GrampsBSDDB(GrampsDbBase): @param include_classes: list of class names to include in the results. Default: None means include all classes. @type include_classes: list of class names - - This default implementation does a sequencial scan through all - the primary object databases and is very slow. Backends can - override this method to provide much faster implementations that - make use of additional capabilities of the backend. Note that this is a generator function, it returns a iterator for use in loops. If you want a list of the results use: @@ -479,7 +474,31 @@ class GrampsBSDDB(GrampsDbBase): return + def _delete_primary_from_reference_map(self, handle): + """Remove all references to the primary object from the reference_map""" + primary_cur = self.get_reference_map_primary_cursor() + + ret = primary_cur.set(handle) + + while (ret is not None): + (key,data) = ret + + # data values are of the form: + # ((primary_object_class_name, primary_object_handle), + # (referenced_object_class_name, referenced_object_handle)) + + # so we need the second tuple give us a reference that we can + # combine with the primary_handle to get the main key. + + main_key = (handle, cPickle.loads(data)[1][1]) + + self.reference_map.delete(str(main_key)) + + ret = primary_cur.next_dup() + + primary_cur.close() + def _update_reference_map(self, obj, class_name): # Add references to the reference_map for all primary object referenced @@ -502,6 +521,7 @@ class GrampsBSDDB(GrampsDbBase): primary_cur = self.get_reference_map_primary_cursor() ret = primary_cur.set(handle) + while (ret is not None): (key,data) = ret @@ -596,24 +616,31 @@ class GrampsBSDDB(GrampsDbBase): self.metadata = None def _del_person(self,handle): + self._delete_primary_from_reference_map(handle) self.person_map.delete(str(handle)) def _del_source(self,handle): + self._delete_primary_from_reference_map(handle) self.source_map.delete(str(handle)) def _del_repository(self,handle): + self._delete_primary_from_reference_map(handle) self.repository_map.delete(str(handle)) def _del_place(self,handle): + self._delete_primary_from_reference_map(handle) self.place_map.delete(str(handle)) def _del_media(self,handle): + self._delete_primary_from_reference_map(handle) self.media_map.delete(str(handle)) def _del_family(self,handle): + self._delete_primary_from_reference_map(handle) self.family_map.delete(str(handle)) def _del_event(self,handle): + self._delete_primary_from_reference_map(handle) self.event_map.delete(str(handle)) def set_name_group_mapping(self,name,group):