moved to using in keys rather than class names in the referece_map table

svn: r5575
This commit is contained in:
Richard Taylor 2005-12-17 22:02:48 +00:00
parent 2990b9c72c
commit ff90348642
4 changed files with 49 additions and 16 deletions

View File

@ -1,3 +1,11 @@
2005-12-17 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
* 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 <rjt-gramps@thegrindstone.me.uk> 2005-12-17 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
* src/GrampsDbBase.py: fixed UNDO buffer issue * src/GrampsDbBase.py: fixed UNDO buffer issue
* test/GrampsDbBase_Test.py: improved performance test * test/GrampsDbBase_Test.py: improved performance test

View File

@ -463,7 +463,7 @@ class GrampsBSDDB(GrampsDbBase):
# so we need the first tuple to give us the type to compare # so we need the first tuple to give us the type to compare
data = cPickle.loads(data) 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] yield data[0]
ret = referenced_cur.next_dup() ret = referenced_cur.next_dup()
@ -500,8 +500,7 @@ class GrampsBSDDB(GrampsDbBase):
primary_cur.close() 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 # Add references to the reference_map for all primary object referenced
# from the primary object 'obj' or any of its secondary objects. # 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 # Looks like there is a bug in the set() and next_dup() methods
# because they do not run the data through cPickle.loads before # because they do not run the data through cPickle.loads before
# returning it, so we have to here. # 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() ret = primary_cur.next_dup()
primary_cur.close() primary_cur.close()
@ -554,10 +555,11 @@ class GrampsBSDDB(GrampsDbBase):
new_references = current_references.difference(existing_references) new_references = current_references.difference(existing_references)
# handle addition of new references # handle addition of new references
if len(new_references) > 0: if len(new_references) > 0:
for (ref_class_name,ref_handle) in new_references: for (ref_class_name,ref_handle) in new_references:
self.reference_map[str((handle,ref_handle),)] = ((class_name,handle), self.reference_map[str((handle,ref_handle),)] = ((CLASS_TO_KEY_MAP[obj.__class__.__name__],handle),
(ref_class_name,ref_handle),) (CLASS_TO_KEY_MAP[ref_class_name],ref_handle),)
# handle deletion of old references # handle deletion of old references
if len(no_longer_required_references) > 0: if len(no_longer_required_references) > 0:
@ -612,7 +614,7 @@ class GrampsBSDDB(GrampsDbBase):
obj = class_func() obj = class_func()
obj.unserialize(val) obj.unserialize(val)
self._update_reference_map(obj,primary_table_name) self._update_reference_map(obj)
data = cursor.next() data = cursor.next()

View File

@ -74,6 +74,29 @@ MEDIA_COL_KEY = 'media_columns'
REPOSITORY_COL_KEY = 'repository_columns' REPOSITORY_COL_KEY = 'repository_columns'
EVENT_COL_KEY = 'event_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', _sigbase = ('person', 'family', 'source', 'event',
'media', 'place', 'repository') 'media', 'place', 'repository')
@ -342,7 +365,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
as part of the transaction. as part of the transaction.
""" """
self._update_reference_map(person,'Person') self._update_reference_map(person)
old_data = self._commit_base( old_data = self._commit_base(
person, self.person_map, PERSON_KEY, transaction.person_update, person, self.person_map, PERSON_KEY, transaction.person_update,
@ -367,7 +390,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
as part of the transaction. 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, self._commit_base(obj, self.media_map, MEDIA_KEY,
transaction.media_update, transaction.media_add, transaction.media_update, transaction.media_add,
@ -379,7 +402,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
as part of the transaction. 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, self._commit_base(source, self.source_map, SOURCE_KEY,
transaction.source_update, transaction.source_add, transaction.source_update, transaction.source_add,
@ -391,7 +414,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
as part of the transaction. 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, self._commit_base(place, self.place_map, PLACE_KEY,
transaction.place_update, transaction.place_add, transaction.place_update, transaction.place_add,
@ -413,7 +436,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
as part of the transaction. 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, self._commit_base(event, self.event_map, EVENT_KEY,
transaction.event_update, transaction.event_add, transaction.event_update, transaction.event_add,
@ -425,7 +448,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
as part of the transaction. 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, self._commit_base(family, self.family_map, FAMILY_KEY,
transaction.family_update, transaction.family_add, transaction.family_update, transaction.family_add,
@ -440,7 +463,7 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback):
as part of the transaction. 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, self._commit_base(repository, self.repository_map, REPOSITORY_KEY,
transaction.repository_update, transaction.repository_add, transaction.repository_update, transaction.repository_add,

View File

@ -153,7 +153,7 @@ class ReferenceMapTest (unittest.TestCase):
references = [ ref for ref in self._db.find_backlink_handles(source.get_handle()) ] references = [ ref for ref in self._db.find_backlink_handles(source.get_handle()) ]
assert len(references) == 1 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): def test_delete_primary(self):
"""check that deleting a primary will remove the backreferences """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 # unhook the reference_map update function so that we
# can insert some records without the reference_map being updated. # can insert some records without the reference_map being updated.
update_method = self._db._update_reference_map 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. # Insert a person/source pair.
source = self._add_source() source = self._add_source()