From ff90348642cec641c2cb325280e9d0603503e097 Mon Sep 17 00:00:00 2001 From: Richard Taylor Date: Sat, 17 Dec 2005 22:02:48 +0000 Subject: [PATCH] moved to using in keys rather than class names in the referece_map table svn: r5575 --- gramps2/ChangeLog | 8 +++++++ gramps2/src/GrampsBSDDB.py | 16 +++++++------ gramps2/src/GrampsDbBase.py | 37 +++++++++++++++++++++++++------ gramps2/test/GrampsDbBase_Test.py | 4 ++-- 4 files changed, 49 insertions(+), 16 deletions(-) diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index a98a5f652..2b31af541 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,11 @@ +2005-12-17 Richard Taylor + * src/GrampsBSDDB.py: reference_map now uses keys rather + than class names + * src/GrampsDbBase.py: reference_map now uses keys rather + than class names + * test/GrampsDbBase_Test.py: reference_map now uses keys rather + than class names + 2005-12-17 Richard Taylor * src/GrampsDbBase.py: fixed UNDO buffer issue * test/GrampsDbBase_Test.py: improved performance test diff --git a/gramps2/src/GrampsBSDDB.py b/gramps2/src/GrampsBSDDB.py index 9b5cf8c14..3367ba592 100644 --- a/gramps2/src/GrampsBSDDB.py +++ b/gramps2/src/GrampsBSDDB.py @@ -463,7 +463,7 @@ class GrampsBSDDB(GrampsDbBase): # so we need the first tuple to give us the type to compare data = cPickle.loads(data) - if include_classes == None or data[0][0] in include_classes: + if include_classes == None or KEY_TO_CLASS_MAP[data[0][0]] in include_classes: yield data[0] ret = referenced_cur.next_dup() @@ -500,8 +500,7 @@ class GrampsBSDDB(GrampsDbBase): primary_cur.close() - def _update_reference_map(self, obj, class_name): - + def _update_reference_map(self, obj): # Add references to the reference_map for all primary object referenced # from the primary object 'obj' or any of its secondary objects. @@ -538,7 +537,9 @@ class GrampsBSDDB(GrampsDbBase): # Looks like there is a bug in the set() and next_dup() methods # because they do not run the data through cPickle.loads before # returning it, so we have to here. - existing_references.add(cPickle.loads(data)[1]) + existing_reference = cPickle.loads(data)[1] + existing_references.add((KEY_TO_CLASS_MAP[existing_reference[0]], + existing_reference[1])) ret = primary_cur.next_dup() primary_cur.close() @@ -554,10 +555,11 @@ class GrampsBSDDB(GrampsDbBase): new_references = current_references.difference(existing_references) # handle addition of new references + if len(new_references) > 0: for (ref_class_name,ref_handle) in new_references: - self.reference_map[str((handle,ref_handle),)] = ((class_name,handle), - (ref_class_name,ref_handle),) + self.reference_map[str((handle,ref_handle),)] = ((CLASS_TO_KEY_MAP[obj.__class__.__name__],handle), + (CLASS_TO_KEY_MAP[ref_class_name],ref_handle),) # handle deletion of old references if len(no_longer_required_references) > 0: @@ -612,7 +614,7 @@ class GrampsBSDDB(GrampsDbBase): obj = class_func() obj.unserialize(val) - self._update_reference_map(obj,primary_table_name) + self._update_reference_map(obj) data = cursor.next() diff --git a/gramps2/src/GrampsDbBase.py b/gramps2/src/GrampsDbBase.py index 76ff96b73..2bd35f973 100644 --- a/gramps2/src/GrampsDbBase.py +++ b/gramps2/src/GrampsDbBase.py @@ -74,6 +74,29 @@ MEDIA_COL_KEY = 'media_columns' REPOSITORY_COL_KEY = 'repository_columns' EVENT_COL_KEY = 'event_columns' + +# The following two dictionaries provide fast translation +# between the primary class names and the keys used to reference +# these classes in the database tables. Beware that changing +# these maps or modifying the values of the keys will break +# existing databases. + +CLASS_TO_KEY_MAP = {Person.__name__: PERSON_KEY, + Family.__name__: FAMILY_KEY, + Source.__name__: SOURCE_KEY, + Event.__name__: EVENT_KEY, + MediaObject.__name__: MEDIA_KEY, + Place.__name__: PLACE_KEY, + Repository.__name__:REPOSITORY_KEY} + +KEY_TO_CLASS_MAP = {PERSON_KEY: Person.__name__, + FAMILY_KEY: Family.__name__, + SOURCE_KEY: Source.__name__, + EVENT_KEY: Event.__name__, + MEDIA_KEY: MediaObject.__name__, + PLACE_KEY: Place.__name__, + REPOSITORY_KEY: Repository.__name__} + _sigbase = ('person', 'family', 'source', 'event', 'media', 'place', 'repository') @@ -342,7 +365,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(person,'Person') + self._update_reference_map(person) old_data = self._commit_base( person, self.person_map, PERSON_KEY, transaction.person_update, @@ -367,7 +390,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(obj,'MediaObject') + self._update_reference_map(obj) self._commit_base(obj, self.media_map, MEDIA_KEY, transaction.media_update, transaction.media_add, @@ -379,7 +402,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(source,'Source') + self._update_reference_map(source) self._commit_base(source, self.source_map, SOURCE_KEY, transaction.source_update, transaction.source_add, @@ -391,7 +414,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(place,'Place') + self._update_reference_map(place) self._commit_base(place, self.place_map, PLACE_KEY, transaction.place_update, transaction.place_add, @@ -413,7 +436,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(event,'Event') + self._update_reference_map(event) self._commit_base(event, self.event_map, EVENT_KEY, transaction.event_update, transaction.event_add, @@ -425,7 +448,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(family,'Family') + self._update_reference_map(family) self._commit_base(family, self.family_map, FAMILY_KEY, transaction.family_update, transaction.family_add, @@ -440,7 +463,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(repository,'Repository') + self._update_reference_map(repository) self._commit_base(repository, self.repository_map, REPOSITORY_KEY, transaction.repository_update, transaction.repository_add, diff --git a/gramps2/test/GrampsDbBase_Test.py b/gramps2/test/GrampsDbBase_Test.py index 1226cc214..7e82f68fe 100644 --- a/gramps2/test/GrampsDbBase_Test.py +++ b/gramps2/test/GrampsDbBase_Test.py @@ -153,7 +153,7 @@ class ReferenceMapTest (unittest.TestCase): references = [ ref for ref in self._db.find_backlink_handles(source.get_handle()) ] assert len(references) == 1 - assert references[0] == ('Person',person.get_handle()) + assert references[0] == (GrampsBSDDB.CLASS_TO_KEY_MAP[RelLib.Person.__name__],person.get_handle()) def test_delete_primary(self): """check that deleting a primary will remove the backreferences @@ -181,7 +181,7 @@ class ReferenceMapTest (unittest.TestCase): # unhook the reference_map update function so that we # can insert some records without the reference_map being updated. update_method = self._db._update_reference_map - self._db._update_reference_map = lambda x,y: 1 + self._db._update_reference_map = lambda x: 1 # Insert a person/source pair. source = self._add_source()