* src/GrampsDb/_GrampsBSDDB.py: More upgrade fixes.

svn: r7361
This commit is contained in:
Alex Roitman 2006-10-07 05:56:58 +00:00
parent 53630ba56f
commit e87d4d084c
2 changed files with 99 additions and 124 deletions

View File

@ -9,6 +9,7 @@
* src/GrampsDb/_GrampsBSDDB.py (load): Do not create logs when TXN
is disabled;
(gramps_upgrade_9): Include upgrade_11 steps into upgrade_9.
* src/GrampsDb/_GrampsBSDDB.py: More upgrade fixes.
2006-10-05 Alex Roitman <shura@gramps-project.org>
* src/DataViews/_PersonView.py (set_inactive): Check active status.

View File

@ -1402,10 +1402,11 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback):
self.gramps_upgrade_8()
if version < 9:
self.gramps_upgrade_9()
elif version < 10:
self.gramps_upgrade_10()
elif version < 11:
self.gramps_upgrade_11()
else:
if version < 10:
self.gramps_upgrade_10()
if version < 11:
self.gramps_upgrade_11()
print "Upgrade time:", int(time.time()-t), "seconds"
def gramps_upgrade_6(self):
@ -1488,6 +1489,18 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback):
self.metadata.sync()
def gramps_upgrade_9(self):
"""
This is the PIVOTAL upgrade point. Before this, things were
stored as pickled class and attribute names. After this, things
are stored as builtin Python objects: every class serializes
its members recursively, up until everything is in terms of builtins.
So we have tuples with numbers, strings, and tuples, etc.
Because of this, every subsequent upgrade must also be included
into this routine. Otherwise this routine will fail when trying
to commit the objects, because the unpickled objects will lack
some attributes that are necessary for serialization on commit.
"""
print "Upgrading to DB version 11 -- this may take a while"
# The very very first thing is to check for duplicates in the
# primary tables and remove them.
@ -1887,7 +1900,7 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback):
print "Done upgrading to DB version 11"
def gramps_upgrade_10(self):
print "Upgrading to DB version 10 -- this may take a while"
print "Upgrading to DB version 10..."
# Remove event column metadata, since columns have changed.
# This will reset all columns to defaults in event view
@ -1907,48 +1920,32 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback):
if self.UseTXN:
the_txn.abort()
# Create one secondary index for reference_map
# because every commit will require this to exist
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)
# so starting (batch) transaction here.
trans = self.transaction_begin("",True)
# This upgrade adds attribute lists to Event and EventRef objects
length = self.get_number_of_events() + len(self.person_map) \
+ self.get_number_of_families()
self.set_total(length)
for handle in self.event_map.keys():
info = self.event_map[handle]
info = self.event_map[handle]
(junk_handle, gramps_id, the_type, date,description,
place, cause,source_list, note, media_list,
change, marker, private) = info
new_info = (handle, gramps_id, the_type, date,
description, place, source_list, note, media_list,
[], change, marker, private)
event = Event()
event.unserialize(new_info)
# Cause is removed, so we're converting it into an attribute
if cause.strip():
attr = Attribute()
attr.set_type(AttributeType.CAUSE)
attr.set_value(cause)
event.add_attribute(attr)
attr_list = [attr.serialize()]
else:
attr_list = []
self.commit_event(event,trans)
info = (handle, gramps_id, the_type, date,
description, place, source_list, note, media_list,
attr_list, change, marker, private)
self.event_map.put(str(handle),info)
self.update()
# Personal event references
@ -1962,28 +1959,25 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback):
urls,lds_ord_list,source_list,note,change,marker,
private,person_ref_list,) = info
new_info = (handle,gramps_id,gender,Name().serialize(),[],
death_ref_index,birth_ref_index,[],
family_list,parent_family_list,media_list,address_list,
attribute_list,urls,lds_ord_list,source_list,note,
change,marker,private,person_ref_list,)
person = Person()
person.unserialize(new_info)
# Names lost the "sname" attribute
person.primary_name.unserialize(convert_name_10(primary_name))
person.alternate_names = [Name().unserialize(convert_name_10(name))
for name in alternate_names]
# Events gained attribute_list
for (privacy,note,ref,role) in event_ref_list:
event_ref = EventRef()
new_event_ref_data = (privacy,note,[],ref,role)
event_ref.unserialize(new_event_ref_data)
person.add_event_ref(event_ref)
new_primary_name = convert_name_10(primary_name)
new_alternate_names = [convert_name_10(name)
for name in alternate_names]
self.commit_person(person,trans)
# Events gained attribute_list
new_event_ref_list = [
(privacy,note,[],ref,role)
for (privacy,note,ref,role) in event_ref_list]
info = (handle,gramps_id,gender,new_primary_name,
new_alternate_names,
death_ref_index,birth_ref_index,new_event_ref_list,
family_list,parent_family_list,media_list,address_list,
attribute_list,urls,lds_ord_list,source_list,note,
change,marker,private,person_ref_list,)
# self.commit_person(person,trans)
self.person_map.put(str(handle),info)
self.update()
# Family event references
@ -1995,28 +1989,20 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback):
media_list,attribute_list,lds_seal_list,source_list,note,
change, marker, private) = info
new_info = (handle,gramps_id,father_handle,
mother_handle,child_ref_list,the_type,[],
new_event_ref_list = [
(privacy,note,[],ref,role)
for (privacy,note,ref,role) in event_ref_list]
info = (handle,gramps_id,father_handle,
mother_handle,child_ref_list,the_type,
new_event_ref_list,
media_list,attribute_list,lds_seal_list,
source_list,note,change, marker, private)
family = Family()
family.unserialize(new_info)
for (privacy,note,ref,role) in event_ref_list:
event_ref = EventRef()
new_event_ref_data = (privacy,note,[],ref,role)
event_ref.unserialize(new_event_ref_data)
family.add_event_ref(event_ref)
self.commit_family(family,trans)
self.family_map.put(str(handle),info)
self.update()
self.reset()
self.transaction_commit(trans,"Upgrade to DB version 10")
# Close secodnary index
self.reference_map_primary_map.close()
if self.UseTXN:
# Separate transaction to save metadata
the_txn = self.env.txn_begin()
@ -2031,101 +2017,74 @@ class GrampsBSDDB(GrampsDbBase,UpdateCallback):
print "Done upgrading to DB version 10"
def gramps_upgrade_11(self):
print "Upgrading to DB version 11 -- this may take a while"
print "Upgrading to DB version 11..."
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)
# This upgrade modifies address
# This upgrade modifies addresses and locations
length = len(self.person_map) + len(self.place_map) \
+ len(self.repository_map)
self.set_total(length)
# so starting (batch) transaction here.
trans = self.transaction_begin("",True)
# Personal addresses
for handle in self.person_map.keys():
info = self.person_map[handle]
new_address_list = []
for addr in info[11]:
loc = ( addr[9], addr[4], u'', addr[5], addr[6],
addr[7], addr[8])
addr = (addr[0],addr[1],addr[2],addr[3], loc)
new_address_list.append(addr)
(junk_handle,gramps_id,gender,
primary_name,alternate_names,death_ref_index,
birth_ref_index,event_ref_list,family_list,
parent_family_list,media_list,address_list,attribute_list,
urls,lds_ord_list,source_list,note,change,marker,
private,person_ref_list,) = info
new_info = info[0:11] + (new_address_list,) + info[12:]
new_address_list = [convert_address_11(addr)
for addr in address_list]
person = Person()
person.unserialize(new_info)
info = (handle,gramps_id,gender,
primary_name,alternate_names,death_ref_index,
birth_ref_index,event_ref_list,family_list,
parent_family_list,media_list,new_address_list,
attribute_list,
urls,lds_ord_list,source_list,note,change,marker,
private,person_ref_list,)
self.commit_person(person,trans)
self.person_map.put(str(handle),info)
self.update()
# Repositories
for handle in self.repository_map.keys():
info = self.repository_map[handle]
new_address_list = []
for addr in info[5]:
loc = ( addr[9], addr[4], u'', addr[5], addr[6],
addr[7], addr[8])
addr = (addr[0],addr[1],addr[2],addr[3], loc)
new_address_list.append(addr)
(junk_handle, gramps_id, the_type, name, note,
address_list, urls, marker, private) = info
new_info = info[0:5] + (new_address_list,) + info[6:]
new_address_list = [convert_address_11(addr)
for addr in address_list]
repository = Repository()
repository.unserialize(new_info)
self.commit_repository(repository,trans)
info = (handle, gramps_id, the_type, name, note,
new_address_list, urls, marker, private)
self.repository_map.put(str(handle),info)
self.update()
# Places
for handle in self.place_map.keys():
info = self.place_map[handle]
(h, gramps_id, title, long, lat, main_loc, alt_loc, urls,
(junk_handle, gramps_id, title, long, lat, main_loc, alt_loc, urls,
media_list, source_list, note, change, marker, private) = info
if main_loc:
m, p, c = main_loc
m = ((u'', m[0], c, m[1], m[2], m[3], m[4]))
main_loc = (m, p)
main_loc = convert_location_11(main_loc)
loc_list = []
for l in alt_loc:
new_alt_loc = [convert_location_11(loc) for loc in alt_loc]
m, p, c = l
m = ((u'', m[0], c, m[1], m[2], m[3], m[4]))
l = (m, p)
loc_list.append(l)
info = (h, gramps_id, title, long, lat, main_loc, loc_list, urls,
info = (handle,gramps_id,title,long,lat,main_loc,new_alt_loc,urls,
media_list, source_list, note, change, marker, private)
place = Place()
place.unserialize(info)
self.commit_place(place,trans)
self.place_map.put(str(handle),info)
self.update()
self.reset()
self.transaction_commit(trans,"Upgrade to DB version 10")
self.reference_map_primary_map.close()
if self.UseTXN:
# Separate transaction to save metadata
the_txn = self.env.txn_begin()
@ -2295,6 +2254,21 @@ def convert_name_10(name):
return (privacy,source_list,note,date,first_name,surname,suffix,title,
name_type,prefix,patronymic,group_as,sort_as,display_as,call)
def convert_address_11(addr):
# addresses got location instead of city,...
(privacy,source_list,note,date,
city,state,country,postal,phone,street) = addr
county = u''
location_base = (street,city,county,state,country,postal,phone)
return (privacy,source_list,note,date,location_base)
def convert_location_11(loc):
(location_base,parish,county) = loc
(city,state,country,postal,phone) = location_base
street = u''
new_location_base = (street,city,county,state,country,postal,phone)
return (new_location_base,parish)
if __name__ == "__main__":
import sys