2006-05-15 Alex Roitman <shura@gramps-project.org>

* src/GrampsDb/_GrampsXMLDB.py: Use callback, call parent's
	close() on close.
	* src/GrampsDb/_GrampsGEDDB.py: Use callback, call parent's
	close() on close.
	* src/GrampsDb/_WriteXML.py: Use new callback class.
	* src/GrampsDb/_WriteGedcom.py: Use new callback class.
	* src/GrampsDb/_DbUtils.py (db_copy): Update secondary indices for
	the InMem databases.



svn: r6679
This commit is contained in:
Alex Roitman 2006-05-16 03:47:58 +00:00
parent 8139998822
commit 4487df24da
6 changed files with 73 additions and 69 deletions

View File

@ -1,3 +1,13 @@
2006-05-15 Alex Roitman <shura@gramps-project.org>
* src/GrampsDb/_GrampsXMLDB.py: Use callback, call parent's
close() on close.
* src/GrampsDb/_GrampsGEDDB.py: Use callback, call parent's
close() on close.
* src/GrampsDb/_WriteXML.py: Use new callback class.
* src/GrampsDb/_WriteGedcom.py: Use new callback class.
* src/GrampsDb/_DbUtils.py (db_copy): Update secondary indices for
the InMem databases.
2006-05-15 Don Allingham <don@gramps-project.org> 2006-05-15 Don Allingham <don@gramps-project.org>
* src/ViewManager.py: new stock icon support * src/ViewManager.py: new stock icon support
* src/gramps_main.py: new stock icon support * src/gramps_main.py: new stock icon support

View File

@ -159,47 +159,59 @@ def get_total(db):
place_len + source_len + obj_len + repo_len place_len + source_len + obj_len + repo_len
def db_copy(from_db,to_db,callback): def db_copy(from_db,to_db,callback):
uc = UpdateCallback(from_db,callback) uc = UpdateCallback(callback)
uc.set_total(get_total(from_db)) uc.set_total(get_total(from_db))
primary_tables = { tables = {
'Person': {'cursor_func': from_db.get_person_cursor, 'Person': {'cursor_func': from_db.get_person_cursor,
'table': to_db.person_map }, 'table': to_db.person_map,
'sec_table' : to_db.id_trans },
'Family': {'cursor_func': from_db.get_family_cursor, 'Family': {'cursor_func': from_db.get_family_cursor,
'table': to_db.family_map }, 'table': to_db.family_map,
'sec_table' : to_db.fid_trans },
'Event': {'cursor_func': from_db.get_event_cursor, 'Event': {'cursor_func': from_db.get_event_cursor,
'table': to_db.event_map }, 'table': to_db.event_map,
'sec_table' : to_db.eid_trans },
'Place': {'cursor_func': from_db.get_place_cursor, 'Place': {'cursor_func': from_db.get_place_cursor,
'table': to_db.place_map }, 'table': to_db.place_map,
'sec_table' : to_db.pid_trans },
'Source': {'cursor_func': from_db.get_source_cursor, 'Source': {'cursor_func': from_db.get_source_cursor,
'table': to_db.source_map }, 'table': to_db.source_map,
'sec_table' : to_db.sid_trans },
'MediaObject': {'cursor_func': from_db.get_media_cursor, 'MediaObject': {'cursor_func': from_db.get_media_cursor,
'table': to_db.media_map }, 'table': to_db.media_map,
'sec_table' : to_db.oid_trans },
'Repository': {'cursor_func': from_db.get_repository_cursor, 'Repository': {'cursor_func': from_db.get_repository_cursor,
'table': to_db.repository_map }, 'table': to_db.repository_map,
'sec_table' : to_db.rid_trans },
} }
if to_db.__class__.__name__ == 'GrampsBSDDB': if to_db.__class__.__name__ == 'GrampsBSDDB':
if to_db.UseTXN: if to_db.UseTXN:
add_data = add_data_txn add_data = add_data_txn
else: else:
add_data = add_data_notxn add_data = add_data_notxn
update_secondary = update_secondary_empty
else: else:
add_data = add_data_dict add_data = add_data_dict
# For InMem databases, the secondary indices need to be
# created as we copy objects
update_secondary = update_secondary_inmem
# Start batch transaction to use async TXN and other tricks # Start batch transaction to use async TXN and other tricks
trans = to_db.transaction_begin("",batch=True) trans = to_db.transaction_begin("",batch=True)
for table_name in primary_tables.keys(): for table_name in tables.keys():
cursor_func = primary_tables[table_name]['cursor_func'] cursor_func = tables[table_name]['cursor_func']
table = primary_tables[table_name]['table'] table = tables[table_name]['table']
sec_table = tables[table_name]['sec_table']
cursor = cursor_func() cursor = cursor_func()
item = cursor.first() item = cursor.first()
while item: while item:
(handle,data) = item (handle,data) = item
add_data(to_db,table,handle,data) add_data(to_db,table,handle,data)
update_secondary(sec_table,handle,data)
item = cursor.next() item = cursor.next()
uc.update() uc.update()
cursor.close() cursor.close()
@ -213,6 +225,7 @@ def db_copy(from_db,to_db,callback):
data = from_db.metadata.get(handle) data = from_db.metadata.get(handle)
to_db.metadata[handle] = data to_db.metadata[handle] = data
def add_data_txn(db,table,handle,data): def add_data_txn(db,table,handle,data):
the_txn = db.env.txn_begin() the_txn = db.env.txn_begin()
table.put(handle,data,txn=the_txn) table.put(handle,data,txn=the_txn)
@ -223,3 +236,9 @@ def add_data_notxn(db,table,handle,data):
def add_data_dict(db,table,handle,data): def add_data_dict(db,table,handle,data):
table[handle] = data table[handle] = data
def update_secondary_empty(sec_table,handle,data):
pass
def update_secondary_inmem(sec_table,handle,data):
sec_table[str(data[1])] = str(handle)

View File

@ -28,8 +28,8 @@ of GEDCOM files.
from RelLib import * from RelLib import *
from _GrampsInMemDB import * from _GrampsInMemDB import *
import _ReadGedcom as ReadGedcom from _ReadGedcom import importData
import _WriteGedcom as WriteGedcom from _WriteGedcom import GedcomWriter
from _DbUtils import db_copy from _DbUtils import db_copy
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -49,7 +49,7 @@ class GrampsGEDDB(GrampsInMemDB):
if self.db_is_open: if self.db_is_open:
self.close() self.close()
GrampsInMemDB.load(self,name,callback,mode) GrampsInMemDB.load(self,name,callback,mode)
ReadGedcom.importData(self,name,callback,use_trans=False) importData(self,name,callback,use_trans=False)
self.bookmarks = self.metadata.get('bookmarks') self.bookmarks = self.metadata.get('bookmarks')
if self.bookmarks == None: if self.bookmarks == None:
@ -64,7 +64,8 @@ class GrampsGEDDB(GrampsInMemDB):
if self.bookmarks == None: if self.bookmarks == None:
self.bookmarks = [] self.bookmarks = []
self.db_is_open = True self.db_is_open = True
writer = WriteGedcom.GedcomWriter(self,self.get_default_person()) writer = GedcomWriter(self,self.get_default_person(),
callback=callback)
writer.export_data(self.full_name) writer.export_data(self.full_name)
return 1 return 1
@ -72,6 +73,7 @@ class GrampsGEDDB(GrampsInMemDB):
if not self.db_is_open: if not self.db_is_open:
return return
if not self.readonly and len(self.undodb) > 0: if not self.readonly and len(self.undodb) > 0:
writer = WriteGedcom.GedcomWriter(self,self.get_default_person()) writer = GedcomWriter(self,self.get_default_person())
writer.export_data(self.full_name) writer.export_data(self.full_name)
self.db_is_open = False self.db_is_open = False
GrampsInMemDB.close(self)

View File

@ -28,8 +28,8 @@ of GRAMPS XML format.
from RelLib import * from RelLib import *
from _GrampsInMemDB import * from _GrampsInMemDB import *
import _ReadXML as ReadXML from _ReadXML import importData
import _WriteXML as WriteXML from _WriteXML import quick_write
from _DbUtils import db_copy from _DbUtils import db_copy
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -51,7 +51,7 @@ class GrampsXMLDB(GrampsInMemDB):
GrampsInMemDB.load(self,name,callback,mode) GrampsInMemDB.load(self,name,callback,mode)
self.id_trans = {} self.id_trans = {}
ReadXML.importData(self,name,callback,use_trans=False) importData(self,name,callback,use_trans=False)
self.bookmarks = self.metadata.get('bookmarks') self.bookmarks = self.metadata.get('bookmarks')
if self.bookmarks == None: if self.bookmarks == None:
@ -67,12 +67,13 @@ class GrampsXMLDB(GrampsInMemDB):
if self.bookmarks == None: if self.bookmarks == None:
self.bookmarks = [] self.bookmarks = []
self.db_is_open = True self.db_is_open = True
WriteXML.quick_write(self,self.full_name) quick_write(self,self.full_name,callback)
return 1 return 1
def close(self): def close(self):
if not self.db_is_open: if not self.db_is_open:
return return
if not self.readonly and len(self.undodb) > 0: if not self.readonly and len(self.undodb) > 0:
WriteXML.quick_write(self,self.full_name) quick_write(self,self.full_name)
self.db_is_open = False self.db_is_open = False
GrampsInMemDB.close(self)

View File

@ -69,6 +69,7 @@ import ansel_utf8
import Utils import Utils
import NameDisplay import NameDisplay
from QuestionDialog import ErrorDialog, WarningDialog from QuestionDialog import ErrorDialog, WarningDialog
from BasicUtils import UpdateCallback
def keep_utf8(s): def keep_utf8(s):
return s return s
@ -478,19 +479,16 @@ class GedcomWriterOptionBox:
self.nl = self.cnvtxt(self.target_ged.get_endl()) self.nl = self.cnvtxt(self.target_ged.get_endl())
class GedcomWriter: class GedcomWriter(UpdateCallback):
def __init__(self,database,person,cl=0,filename="",option_box=None, def __init__(self,database,person,cl=0,filename="",option_box=None,
callback=None): callback=None):
UpdateCallback.__init__(self,callback)
self.db = database self.db = database
self.person = person self.person = person
self.option_box = option_box self.option_box = option_box
self.cl = cl self.cl = cl
self.filename = filename self.filename = filename
self.callback = callback
if '__call__' in dir(self.callback): # callback is really callable
self.update = self.update_real
else:
self.update = self.update_empty
self.plist = {} self.plist = {}
self.slist = {} self.slist = {}
@ -550,16 +548,6 @@ class GedcomWriter:
self.slist,self.option_box.private) self.slist,self.option_box.private)
self.flist[family_handle] = 1 self.flist[family_handle] = 1
def update_empty(self):
pass
def update_real(self):
self.count += 1
newval = int(100*self.count/self.total)
if newval != self.oldval:
self.callback(newval)
self.oldval = newval
def cl_setup(self): def cl_setup(self):
self.restrict = 0 self.restrict = 0
self.private = 0 self.private = 0
@ -665,10 +653,8 @@ class GedcomWriter:
self.writeln('2 CONT Not Provided') self.writeln('2 CONT Not Provided')
pkeys = self.plist.keys() pkeys = self.plist.keys()
self.total = len(pkeys) + len(self.flist.keys()) \ self.set_total(len(pkeys) + len(self.flist.keys()) \
+ len(self.slist.keys()) + len(self.slist.keys()))
self.oldval = 0
self.count = 0
sorted = [] sorted = []
for key in pkeys: for key in pkeys:

View File

@ -62,6 +62,7 @@ from QuestionDialog import ErrorDialog
from _GrampsDbBase import \ from _GrampsDbBase import \
PERSON_KEY,FAMILY_KEY,SOURCE_KEY,EVENT_KEY,\ PERSON_KEY,FAMILY_KEY,SOURCE_KEY,EVENT_KEY,\
MEDIA_KEY,PLACE_KEY,REPOSITORY_KEY MEDIA_KEY,PLACE_KEY,REPOSITORY_KEY
from BasicUtils import UpdateCallback
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -120,7 +121,7 @@ def quick_write(database, filename,callback=None):
# #
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class XmlWriter: class XmlWriter(UpdateCallback):
""" """
Writes a database to the XML file. Writes a database to the XML file.
""" """
@ -137,13 +138,9 @@ class XmlWriter:
2: remove leading slash 2: remove leading slash
compress - attempt to compress the database compress - attempt to compress the database
""" """
UpdateCallback.__init__(self,callback)
self.compress = compress self.compress = compress
self.db = db self.db = db
self.callback = callback
if '__call__' in dir(self.callback): # callback is really callable
self.update = self.update_real
else:
self.update = self.update_empty
self.strip_photos = strip_photos self.strip_photos = strip_photos
def write(self,filename): def write(self,filename):
@ -211,18 +208,17 @@ class XmlWriter:
date = time.localtime(time.time()) date = time.localtime(time.time())
owner = self.db.get_researcher() owner = self.db.get_researcher()
person_len = self.db.get_number_of_people()
family_len = len(self.db.get_family_handles())
event_len = len(self.db.get_event_handles())
source_len = len(self.db.get_source_handles())
place_len = len(self.db.get_place_handles())
repo_len = len(self.db.get_repository_handles())
obj_len = len(self.db.get_media_object_handles())
self.total = person_len + family_len + event_len + place_len + \ person_len = self.db.get_number_of_people()
source_len + obj_len + repo_len family_len = self.db.get_number_of_families()
self.count = 0 event_len = self.db.get_number_of_events()
self.oldval = 0 source_len = self.db.get_number_of_sources()
place_len = self.db.get_number_of_places()
repo_len = self.db.get_number_of_repositories()
obj_len = self.db.get_number_of_media_objects()
self.set_total(person_len+family_len+event_len+source_len
+place_len+repo_len+obj_len)
self.g.write('<?xml version="1.0" encoding="UTF-8"?>\n') self.g.write('<?xml version="1.0" encoding="UTF-8"?>\n')
self.g.write('<!DOCTYPE database ' self.g.write('<!DOCTYPE database '
@ -340,16 +336,6 @@ class XmlWriter:
self.g.write("</database>\n") self.g.write("</database>\n")
def update_empty(self):
pass
def update_real(self):
self.count += 1
newval = int(100*self.count/self.total)
if newval != self.oldval:
self.callback(newval)
self.oldval = newval
def fix(self,line): def fix(self,line):
l = line.strip() l = line.strip()
l = l.replace('&','&amp;') l = l.replace('&','&amp;')