* src/GrampsDb/_GrampsBSDDB.py: Upgrade path to new RelLib.

* src/RelLib/_Family.py: Require non-empty child_ref.


svn: r6332
This commit is contained in:
Alex Roitman 2006-04-13 18:25:52 +00:00
parent eeb1573d40
commit 6e6f9fbfba
3 changed files with 89 additions and 131 deletions

View File

@ -1,4 +1,6 @@
2006-04-13 Alex Roitman <shura@gramps-project.org>
* src/GrampsDb/_GrampsBSDDB.py: Upgrade path to new RelLib.
* src/RelLib/_Family.py: Require non-empty child_ref.
* src/Editors/_EditPerson.py (reorder_child_ref_list): Use
child_ref_list.
* src/RelLib/_ChildRef.py (serialize): Typo.

View File

@ -56,7 +56,7 @@ from _GrampsDbBase import *
import const
_MINVERSION = 5
_DBVERSION = 10
_DBVERSION = 9
def find_surname(key,data):
return str(data[3][3])
@ -1194,8 +1194,6 @@ class GrampsBSDDB(GrampsDbBase):
self.gramps_upgrade_8()
if version < 9:
self.gramps_upgrade_9()
if version < 10:
self.gramps_upgrade_10()
# self.metadata.put('version',_DBVERSION)
# self.metadata.sync()
print "Upgrade time:", int(time.time()-t), "seconds"
@ -1292,15 +1290,13 @@ class GrampsBSDDB(GrampsDbBase):
trans = self.transaction_begin("",True)
current = 0
# This upgrade adds marker to every primary object.
# We need to extract and commit every primary object
# even if no other changes are made.
# Numerous changes were made between dbversions 8 and 9.
# If nothing else, we switched from storing pickled gramps classes
# to storing builting objects, via running serialize() recursively
# until the very bottom. Every stored objects needs to be
# re-committed here.
# Change every Source to have reporef_list
# cursor = self.get_source_cursor()
# data = cursor.first()
# while data:
# handle,info = data
for handle in self.source_map.keys():
info = self.source_map[handle]
source = Source()
@ -1313,13 +1309,59 @@ class GrampsBSDDB(GrampsDbBase):
self.commit_source(source,trans)
current += 1
self.update(100*current/length)
# data = cursor.next()
# cursor.close()
#cursor = self.get_person_cursor()
#data = cursor.first()
#while data:
# handle,info = data
# Family upgrade
for handle in self.family_map.keys():
info = self.family_map[handle]
family = Family()
family.handle = handle
# Restore data from dbversion 8 (gramps 2.0.9)
(junk_handle, family.gramps_id, family.father_handle,
family.mother_handle, child_list, family.type,
event_list, family.media_list, family.attribute_list,
lds_seal, complete, family.source_list,
family.note, family.change) = info
if complete:
family.marker = (PrimaryObject.MARKER_COMPLETE,"")
# Change every event handle to the EventRef
for event_handle in event_list:
event_ref = EventRef()
event_ref.ref = event_handle
event_ref.role = (EventRef.PRIMARY,'')
family.event_ref_list.append(event_ref)
# Change child_list into child_ref_list
for child_handle in child_list:
child_ref = ChildRef()
child_ref.ref = child_handle
family.child_ref_list.append(child_ref)
# Change relationship type from int to tuple
family.type = (family.type,'')
# In all Attributes, convert type from string to a tuple
for attribute in family.attribute_list:
convert_attribute_9(attribute)
# Cover attributes contained in MediaRefs
for media_ref in family.media_list:
convert_mediaref_9(media_ref)
# Switch from fixed lds ords to a list
if lds_seal:
family.lds_ord_list = [lds_seal]
self.commit_family(family,trans)
current += 1
self.update(100*current/length)
# Person upgrade
# Needs to be run after the family upgrade completed.
dummy_child_ref = ChildRef()
default_frel = dummy_child_ref.frel
default_mrel = dummy_child_ref.mrel
for handle in self.person_map.keys():
info = self.person_map[handle]
person = Person()
@ -1328,9 +1370,9 @@ class GrampsBSDDB(GrampsDbBase):
(junk_handle, person.gramps_id, person.gender,
person.primary_name, person.alternate_names, person.nickname,
death_handle, birth_handle, event_list,
person.family_list, person.parent_family_list,
person.family_list, parent_family_list,
person.media_list, person.address_list, person.attribute_list,
person.urls, person.lds_bapt, person.lds_endow, person.lds_seal,
person.urls, lds_bapt, lds_endow, lds_seal,
complete, person.source_list, person.note,
person.change, person.private) = (info + (False,))[0:23]
@ -1375,12 +1417,24 @@ class GrampsBSDDB(GrampsDbBase):
new_type = (Name.UNKNOWN,"")
name.type = new_type
# In all parent family instances, convert relationships from
# string to a tuple.
new_parent_family_list = [ (family_handle,(mrel,''),(frel,''))
for (family_handle,mrel,frel)
in person.parent_family_list[:] ]
person.parent_family_list = new_parent_family_list
# Change parent_family_list into list of handles
# and transfer the relationship info into the family's
# child_ref (in family.child_ref_list) as tuples.
for (family_handle,mrel,frel) in parent_family_list:
person.parent_family_list.append(family_handle)
# Only change family is the relations are non-default
if (mrel,frel) != (default_mrel[0],default_frel[0]):
family = self.get_family_from_handle(family_handle)
child_handle_list = [ref.ref for ref in
family.child_ref_list]
try:
index = child_handle_list.index(person.handle)
except:
print child_handle_list, person.handle
child_ref = family.child_ref_list[index]
child_ref.frel = (frel,'')
child_ref.mrel = (mrel,'')
self.commit_family(family,trans)
# In all Attributes, convert type from string to a tuple
for attribute in person.attribute_list:
@ -1392,54 +1446,16 @@ class GrampsBSDDB(GrampsDbBase):
# In all Urls, add type attribute
for url in person.urls:
convert_url_9(url)
# Switch from fixed lds ords to a list
person.lds_ord_list = [item for item
in [lds_bapt,lds_endow,lds_seal] if item]
self.commit_person(person,trans)
current += 1
self.update(100*current/length)
#data = cursor.next()
#cursor.close()
#cursor = self.get_family_cursor()
#data = cursor.first()
#while data:
# handle,info = data
for handle in self.family_map.keys():
info = self.family_map[handle]
family = Family()
family.handle = handle
# Restore data from dbversion 8 (gramps 2.0.9)
(junk_handle, family.gramps_id, family.father_handle,
family.mother_handle, family.child_list, family.type,
event_list, family.media_list, family.attribute_list,
family.lds_seal, complete, family.source_list,
family.note, family.change) = info
if complete:
family.marker = (PrimaryObject.MARKER_COMPLETE,"")
# Change every event handle to the EventRef
for event_handle in event_list:
event_ref = EventRef()
event_ref.ref = event_handle
event_ref.role = (EventRef.PRIMARY,'')
family.event_ref_list.append(event_ref)
# Change relationship type from int to tuple
family.type = (family.type,'')
# In all Attributes, convert type from string to a tuple
for attribute in family.attribute_list:
convert_attribute_9(attribute)
# Cover attributes contained in MediaRefs
for media_ref in family.media_list:
convert_mediaref_9(media_ref)
self.commit_family(family,trans)
current += 1
self.update(100*current/length)
# data = cursor.next()
# cursor.close()
# Event upgrade
event_conversion = {
"Alternate Marriage" : (Event.MARR_ALT,""),
"Annulment" : (Event.ANNULMENT,""),
@ -1489,11 +1505,6 @@ class GrampsBSDDB(GrampsDbBase):
"Will" : (Event.WILL,""),
}
# cursor = self.get_event_cursor()
# data = cursor.first()
# while data:
# handle,info = data
# Turns out that a lof ot events have duplicate gramps IDs
# We need to fix this
table_flags = self.open_flags()
@ -1558,15 +1569,9 @@ class GrampsBSDDB(GrampsDbBase):
self.commit_event(event,trans)
current += 1
self.update(100*current/length)
# data = cursor.next()
# cursor.close()
self.eid_trans.close()
# Work out marker addition to the Place
# cursor = self.get_place_cursor()
# data = cursor.first()
# while data:
# handle,info = data
# Place upgrade
for handle in self.place_map.keys():
info = self.place_map[handle]
place = Place()
@ -1586,14 +1591,8 @@ class GrampsBSDDB(GrampsDbBase):
self.commit_place(place,trans)
current += 1
self.update(100*current/length)
# data = cursor.next()
# cursor.close()
# Work out marker addition to the Media
# cursor = self.get_media_cursor()
# data = cursor.first()
# while data:
# handle,info = data
# Media upgrade
for handle in self.media_map.keys():
info = self.media_map[handle]
media_object = MediaObject()
@ -1610,8 +1609,6 @@ class GrampsBSDDB(GrampsDbBase):
self.commit_media_object(media_object,trans)
current += 1
self.update(100*current/length)
# data = cursor.next()
# cursor.close()
self.transaction_commit(trans,"Upgrade to DB version 9")
# Close secodnary index
@ -1620,46 +1617,6 @@ class GrampsBSDDB(GrampsDbBase):
self.metadata.sync()
print "Done upgrading to DB version 9"
def gramps_upgrade_10(self):
print "Upgrading to DB version 10"
table_flags = self.open_flags()
self.reference_map_primary_map = db.DB(self.env)
self.reference_map_primary_map.set_flags(db.DB_DUP)
self.reference_map_primary_map.open(self.full_name,
"reference_map_primary_map",
db.DB_BTREE, flags=table_flags)
self.reference_map.associate(self.reference_map_primary_map,
find_primary_handle,
table_flags)
trans = self.transaction_begin("",True)
for handle in self.person_map.keys():
val = list(self.get_raw_person_data(handle))
lds_list = [ x for x in [val[15],val[16],val[17]] if x ]
data=tuple(val[:15]) + (lds_list,) + tuple(val[18:])
p = Person(data=data)
self.commit_person(p,trans)
for handle in self.family_map.keys():
val = list(self.get_raw_family_data(handle))
if val[9]:
data = tuple(val[:9]) + (val[9],) + tuple(val[10:])
else:
data = tuple(val[:9]) + ([],) + tuple(val[10:])
p = Family()
p.unserialize(data)
self.commit_family(p,trans)
self.transaction_commit(trans,"Upgrade to DB version 10")
self.reference_map_primary_map.close()
self.metadata.put('version',10)
self.metadata.sync()
class BdbTransaction(Transaction):
def __init__(self,msg,db,batch=False,no_magic=False):
Transaction.__init__(self,msg,db,batch,no_magic)

View File

@ -375,9 +375,8 @@ class Family(PrimaryObject,SourceBase,NoteBase,MediaBase,AttributeBase,
@param person_handle: L{Person} database handle
@type person_handle: str
"""
if child_ref and not isinstance(child_ref,ChildRef):
if not isinstance(child_ref,ChildRef):
raise ValueError("expecting ChildRef instance")
assert(child_ref.ref)
self.child_ref_list.append(child_ref)
def remove_child_ref(self,child_ref):
@ -391,7 +390,7 @@ class Family(PrimaryObject,SourceBase,NoteBase,MediaBase,AttributeBase,
in the list.
@rtype: bool
"""
if child_ref and not isinstance(childref,ChildRef):
if not isinstance(childref,ChildRef):
raise ValueError("expecting ChildRef instance")
new_list = [ref for ref in self.child_ref_list
if ref.ref != child_ref.ref ]