diff --git a/ChangeLog b/ChangeLog index 479342e15..aeb6b1065 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,10 @@ transaction_commit): disable secondary index removal/rebuilding due to bugs in bsddb; (_update_reference_map): explicitly check for addition versus update. + * src/GrampsDb/_GrampsDbBase.py: Move _update_reference_map into + _commite_base. + * src/GrampsDb/_GrampsBSDDB.py: Move _update_reference_map into + _commite_base. 2006-01-20 Don Allingham * src/PageView.py: add ellipsize, better dirty/clean management, diff --git a/src/GrampsDb/_GrampsBSDDB.py b/src/GrampsDb/_GrampsBSDDB.py index 3b9930a40..0df537cd6 100644 --- a/src/GrampsDb/_GrampsBSDDB.py +++ b/src/GrampsDb/_GrampsBSDDB.py @@ -603,19 +603,18 @@ class GrampsBSDDB(GrampsDbBase): primary_cur.close() - def _update_reference_map(self, obj, transaction, update=True): + def _update_reference_map(self, obj, transaction, txn=None): """ - If update = True old references are cleaned up and only new references are added - if update = False then it is assumed that the object is not already referenced. + If txn is given, then changes are written right away using txn. """ # Add references to the reference_map for all primary object referenced # from the primary object 'obj' or any of its secondary objects. handle = obj.get_handle() - do_update = self.reference_map_primary_map.has_key(str(handle)) + update = self.reference_map_primary_map.has_key(str(handle)) - if do_update: + if update: # FIXME: this needs to be properly integrated into the transaction # framework so that the reference_map changes are part of the # transaction @@ -674,31 +673,33 @@ class GrampsBSDDB(GrampsDbBase): for (ref_class_name,ref_handle) in new_references: data = ((CLASS_TO_KEY_MAP[obj.__class__.__name__],handle), (CLASS_TO_KEY_MAP[ref_class_name],ref_handle),) - self._add_reference((handle,ref_handle),data,transaction) + self._add_reference((handle,ref_handle),data,transaction,txn) - if do_update: + if update: # handle deletion of old references if len(no_longer_required_references) > 0: for (ref_class_name,ref_handle) in no_longer_required_references: try: - self._remove_reference((handle,ref_handle),transaction) + self._remove_reference((handle,ref_handle),transaction,txn) #self.reference_map.delete(str((handle,ref_handle),), # txn=self.txn) except: # ignore missing old reference pass - def _remove_reference(self,key,transaction): + def _remove_reference(self,key,transaction,txn=None): """ Removes the reference specified by the key, preserving the change in the passed transaction. """ if not self.readonly: - old_data = self.reference_map.get(str(main_key),txn=self.txn) - if not transaction.batch: + if transaction.batch: + self.reference_map.delete(str(key),txn=txn)#=the_txn) + else: + old_data = self.reference_map.get(str(key),txn=self.txn) transaction.add(REFERENCE_KEY,str(key),old_data,None) - transaction.reference_del.append(str(key)) + transaction.reference_del.append(str(key)) - def _add_reference(self,key,data,transaction): + def _add_reference(self,key,data,transaction,txn=None): """ Adds the reference specified by the key and the data, preserving the change in the passed transaction. @@ -708,9 +709,9 @@ class GrampsBSDDB(GrampsDbBase): return if transaction.batch: - the_txn = self.env.txn_begin() - self.reference_map.put(str(key),data,txn=the_txn) - the_txn.commit() + #the_txn = self.env.txn_begin() + self.reference_map.put(str(key),data,txn=txn)#=the_txn) + #the_txn.commit() else: transaction.add(REFERENCE_KEY,str(key),None,data) transaction.reference_add.append((str(key),data)) @@ -941,10 +942,12 @@ class GrampsBSDDB(GrampsDbBase): if transaction.batch: the_txn = self.env.txn_begin() + self._update_reference_map(obj,transaction,txn=the_txn) data_map.put(handle,obj.serialize(),txn=the_txn) the_txn.commit() old_data = None else: + self._update_reference_map(obj,transaction) old_data = data_map.get(handle,txn=self.txn) new_data = obj.serialize() transaction.add(key,handle,old_data,new_data) diff --git a/src/GrampsDb/_GrampsDbBase.py b/src/GrampsDb/_GrampsDbBase.py index 22b6cc416..e8dafdccc 100644 --- a/src/GrampsDb/_GrampsDbBase.py +++ b/src/GrampsDb/_GrampsDbBase.py @@ -368,6 +368,8 @@ class GrampsDbBase(GrampsDBCallback): obj.change = int(time.time()) handle = str(obj.handle) + self._update_reference_map(obj,transaction) + if transaction.batch: data_map[handle] = obj.serialize() old_data = None @@ -387,8 +389,6 @@ class GrampsDbBase(GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(person,transaction) - old_data = self._commit_base( person, self.person_map, PERSON_KEY, transaction.person_update, transaction.person_add, transaction, change_time) @@ -412,8 +412,6 @@ class GrampsDbBase(GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(obj,transaction) - self._commit_base(obj, self.media_map, MEDIA_KEY, transaction.media_update, transaction.media_add, transaction, change_time) @@ -424,8 +422,6 @@ class GrampsDbBase(GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(source,transaction) - self._commit_base(source, self.source_map, SOURCE_KEY, transaction.source_update, transaction.source_add, transaction, change_time) @@ -436,8 +432,6 @@ class GrampsDbBase(GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(place,transaction) - self._commit_base(place, self.place_map, PLACE_KEY, transaction.place_update, transaction.place_add, transaction, change_time) @@ -458,8 +452,6 @@ class GrampsDbBase(GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(event,transaction) - self._commit_base(event, self.event_map, EVENT_KEY, transaction.event_update, transaction.event_add, transaction, change_time) @@ -470,8 +462,6 @@ class GrampsDbBase(GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(family,transaction) - self._commit_base(family, self.family_map, FAMILY_KEY, transaction.family_update, transaction.family_add, transaction, change_time) @@ -485,8 +475,6 @@ class GrampsDbBase(GrampsDBCallback): as part of the transaction. """ - self._update_reference_map(repository,transaction) - self._commit_base(repository, self.repository_map, REPOSITORY_KEY, transaction.repository_update, transaction.repository_add, transaction, change_time)