From a47feef81e9f3ec18aa50a66fcb8860ae1208eaf Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Wed, 26 Jun 2002 03:21:20 +0000 Subject: [PATCH] Speed improvements for GEDCOM export svn: r1056 --- gramps/src/AddSpouse.py | 4 ++ gramps/src/AttrEdit.py | 8 ++- gramps/src/EditPerson.py | 1 - gramps/src/GrampsXML.py | 5 +- gramps/src/RelLib.py | 3 + gramps/src/latin_ansel.py | 57 +++++++++++++++ gramps/src/plugins/ReadGedcom.py | 16 +++-- gramps/src/plugins/WriteGedcom.py | 112 +++++++++++++++++------------- 8 files changed, 148 insertions(+), 58 deletions(-) diff --git a/gramps/src/AddSpouse.py b/gramps/src/AddSpouse.py index 6ef366aa0..140f6ebb6 100644 --- a/gramps/src/AddSpouse.py +++ b/gramps/src/AddSpouse.py @@ -21,6 +21,10 @@ The AddSpouse module provides the AddSpouse class that allows the user to add a new spouse to the active person. """ + +__author__ = "Donald N. Allingham" +__version__ = "$Revision$" + #------------------------------------------------------------------------- # # internationalization diff --git a/gramps/src/AttrEdit.py b/gramps/src/AttrEdit.py index 5de705208..aeac5e980 100644 --- a/gramps/src/AttrEdit.py +++ b/gramps/src/AttrEdit.py @@ -22,6 +22,9 @@ The AttrEdit module provides the AddressEditor class. This provides a mechanism for the user to edit address information. """ +__author__ = "Donald N. Allingham" +__version__ = "$Revision$" + #------------------------------------------------------------------------- # # GTK/Gnome modules @@ -36,8 +39,8 @@ import libglade #------------------------------------------------------------------------- import const import Utils -from RelLib import * import Sources +from RelLib import Attribute from intl import gettext _ = gettext @@ -47,7 +50,7 @@ _ = gettext # AttributeEditor class # #------------------------------------------------------------------------- -class AttributeEditor(Sources.SourceTab): +class AttributeEditor: """ Displays a dialog that allows the user to edit an attribute. """ @@ -60,6 +63,7 @@ class AttributeEditor(Sources.SourceTab): title - The title of the dialog box list - list of options for the pop down menu """ + self.parent = parent self.attrib = attrib self.top = libglade.GladeXML(const.dialogFile, "attr_edit") diff --git a/gramps/src/EditPerson.py b/gramps/src/EditPerson.py index 69be08956..0028c04a6 100644 --- a/gramps/src/EditPerson.py +++ b/gramps/src/EditPerson.py @@ -75,7 +75,6 @@ class EditPerson: def __init__(self,person,db,callback=None): """Creates an edit window. Associates a person with the window.""" self.person = person - print 1/0 self.original_id = person.getId() self.db = db self.callback = callback diff --git a/gramps/src/GrampsXML.py b/gramps/src/GrampsXML.py index e5a662a8f..b6ee9fe2e 100644 --- a/gramps/src/GrampsXML.py +++ b/gramps/src/GrampsXML.py @@ -27,7 +27,10 @@ class GrampsXML(GrampsDB): def get_base(self): return const.xmlFile - + + def new(self): + GrampsDB.new(self) + def save(self,name,callback): WriteXML.exportData(self,name,callback) diff --git a/gramps/src/RelLib.py b/gramps/src/RelLib.py index 3f569820b..f976191cd 100644 --- a/gramps/src/RelLib.py +++ b/gramps/src/RelLib.py @@ -1935,6 +1935,9 @@ class GrampsDB(Persistent): self.sourceMap = {} self.placeMap = {} self.objectMap = {} + self.personTable = {} + self.placeTable = {} + self.sourceTable = {} self.smapIndex = 0 self.pmapIndex = 0 self.fmapIndex = 0 diff --git a/gramps/src/latin_ansel.py b/gramps/src/latin_ansel.py index 97dea5e16..7621fd910 100644 --- a/gramps/src/latin_ansel.py +++ b/gramps/src/latin_ansel.py @@ -130,3 +130,60 @@ def latin_to_ansel(s): buff.close() return ans +if __name__ == "__main__": + + print 'static unsigned char s0[] = {' + for i in range(256): + if i == 255: + suf = '};\n\n' + else: + suf = ',' + if i%16 == 0 and i != 0: + print '\n', + try: + print "%3d%s" % (_s0[i],suf), + except: + print "%3d%s" % (i,suf), + + print 'static unsigned char t0[] = {' + for i in range(256): + if i == 255: + suf = '};\n\n' + else: + suf = ',' + if i%16 == 0 and i != 0: + print '\n', + try: + print "%3d%s" % (ord(_t0[i]),suf), + except KeyError: + print '0%s' % suf, + + print 'static unsigned char* t1[] = {' + for i in range(256): + if i == 255: + suf = '};\n\n' + else: + suf = ',' + if i%8== 0 and i != 0: + print '\n', + try: + t = _t1[i] + print '"\\%03o\\%03o"%s' % (ord(t[0]),ord(t[1]),suf), + except KeyError: + print '"\\%03o"%s' % (i,suf), + + for key in _s1.keys(): + print 'static unsigned char s_%x[] = {' % key + for i in range(256): + if i == 255: + suf = '};\n\n' + else: + suf = ',' + if i%16 == 0 and i != 0: + print '\n', + try: + print "%3d%s" % (_s1[key][i],suf), + except: + print "%3d%s" % (i,suf), + + diff --git a/gramps/src/plugins/ReadGedcom.py b/gramps/src/plugins/ReadGedcom.py index 0b5ec561b..64f6e1721 100644 --- a/gramps/src/plugins/ReadGedcom.py +++ b/gramps/src/plugins/ReadGedcom.py @@ -48,7 +48,12 @@ import gnome.mime #------------------------------------------------------------------------- from RelLib import * import Date -import latin_ansel +try: + from ansel import ansel_to_latin +except: + from latin_ansel import ansel_to_latin + +import ansel import latin_utf8 import intl import Utils @@ -105,7 +110,7 @@ fromtoRegexp = re.compile(r"\s*FROM\s+@#D([^@]+)@\s*(.*)\s+TO\s+@#D([^@]+)@\s*(. # # #------------------------------------------------------------------------- -def importData(database, filename): +def importData(database, filename, cb=None): global callback @@ -139,7 +144,10 @@ def importData(database, filename): statusWindow.destroy() Utils.modified() - if callback: + if cb: + statusWindow.destroy() + cb(1) + elif callback: callback(1) #------------------------------------------------------------------------- @@ -1383,7 +1391,7 @@ class GedcomParser: self.cnv = latin_utf8.utf8_to_latin elif matches[2] == "ANSEL": self.code = ANSEL - self.cnv = latin_ansel.ansel_to_latin + self.cnv = ansel_to_latin self.ignore_sub_junk(2) self.update(self.encoding_obj,matches[2]) elif matches[1] == "GEDC": diff --git a/gramps/src/plugins/WriteGedcom.py b/gramps/src/plugins/WriteGedcom.py index e4074a1f7..e5690df1b 100644 --- a/gramps/src/plugins/WriteGedcom.py +++ b/gramps/src/plugins/WriteGedcom.py @@ -38,7 +38,11 @@ import gnome.ui import libglade from GedcomInfo import * -from latin_ansel import latin_to_ansel +try: + from ansel import latin_to_ansel +except: + from latin_ansel import latin_to_ansel + from latin_utf8 import latin_to_utf8 #------------------------------------------------------------------------- @@ -84,15 +88,15 @@ def add_familys_sources(family,slist,private): continue for source_ref in event.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in slist: - slist.append(sbase) + if sbase != None and not slist.has_key(sbase): + slist[sbase.getId()] = 1 for attr in family.getAttributeList(): if private and attr.getPrivacy(): continue for source_ref in attr.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in slist: - slist.append(sbase) + if sbase != None and not slist.has_key(sbase.getId()): + slist[sbase.getId()] = 1 #------------------------------------------------------------------------- # @@ -109,32 +113,32 @@ def add_persons_sources(person,slist,private): continue for source_ref in event.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in slist: - slist.append(sbase) + if sbase != None and not slist.has_key(sbase.getId()): + slist[sbase.getId()] = 1 for event in person.getAddressList(): if private and event.getPrivacy(): continue for source_ref in event.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in slist: - slist.append(sbase) + if sbase != None and not slist.has_key(sbase.getId()): + slist[sbase.getId()] = 1 for event in person.getAttributeList(): if private and event.getPrivacy(): continue for source_ref in event.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in slist: - slist.append(sbase) + if sbase != None and not slist.has_key(sbase.getId()): + slist[sbase.getId()] = 1 for name in person.getAlternateNames() + [person.getPrimaryName()]: if private and name.getPrivacy(): continue for source_ref in name.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in slist: - slist.append(sbase) + if sbase != None and not slist.has_key(sbase.getId()): + slist[sbase.getId()] = 1 #------------------------------------------------------------------------- # @@ -303,9 +307,9 @@ class GedcomWriter: self.restrict = 1 self.private = 1 self.cnvtxt = latin_to_ansel - self.plist = [] - self.slist = [] - self.flist = [] + self.plist = {} + self.slist = {} + self.flist = {} self.adopt = ADOPT_EVENT self.fidval = 0 self.fidmap = {} @@ -381,17 +385,20 @@ class GedcomWriter: name = self.topDialog.get_widget("filename").get_text() if cfilter == None: - self.plist = self.db.getPersonMap().values() + for p in self.db.getPersonKeys(): + self.plist[p] = 1 else: - self.plist = cfilter.apply(self.db.getPersonMap().values()) + for p in cfilter.apply(self.db.getPersonMap().values()): + self.plist[p.getId()] = 1 - self.flist = [] - self.slist = [] - for p in self.plist[:]: + self.flist = {} + self.slist = {} + for key in self.plist.keys(): + p = self.db.getPerson(key) add_persons_sources(p,self.slist,self.private) for family in p.getFamilyList(): add_familys_sources(family,self.slist,self.private) - self.flist.append(family) + self.flist[family.getId()] = 1 Utils.destroy_passed_object(obj) @@ -412,7 +419,6 @@ class GedcomWriter: closebtn.set_sensitive(0) self.export_data(name) - closebtn.set_sensitive(1) def export_data(self,filename): @@ -429,7 +435,7 @@ class GedcomWriter: return date = string.split(time.ctime(time.time())) - + self.g.write("0 HEAD\n") self.g.write("1 SOUR GRAMPS\n") self.g.write("2 VERS " + const.version + "\n") @@ -477,15 +483,17 @@ class GedcomWriter: self.g.write('1 ADDR Not Provided\n') self.g.write('2 CONT Not Provided\n') - self.plist.sort(sortById) + pkeys = self.plist.keys() + pkeys.sort() nump = float(len(self.plist)) index = 0.0 - for person in self.plist: - self.write_person(person) + for key in pkeys: + self.write_person(self.db.getPerson(key)) index = index + 1 - self.pbar.set_value((100*index)/nump) - while(gtk.events_pending()): - gtk.mainiteration() + if index%100 == 0: + self.pbar.set_value((100*index)/nump) + while(gtk.events_pending()): + gtk.mainiteration() self.pbar.set_value(100.0) self.write_families() @@ -497,17 +505,18 @@ class GedcomWriter: def write_families(self): nump = float(len(self.flist)) index = 0.0 - for family in self.flist: + for key in self.flist.keys(): + family = self.db.getFamily(key) father_alive = mother_alive = 0 self.g.write("0 @%s@ FAM\n" % self.fid(family.getId())) self.prefn(family) person = family.getFather() - if person != None and person in self.plist: + if person != None and self.plist.has_key(person.getId()): self.g.write("1 HUSB @%s@\n" % self.pid(person.getId())) father_alive = person.probablyAlive() person = family.getMother() - if person != None and person in self.plist: + if person != None and self.plist.has_key(person.getId()): self.g.write("1 WIFE @%s@\n" % self.pid(person.getId())) mother_alive = person.probablyAlive() @@ -534,7 +543,7 @@ class GedcomWriter: self.dump_event_stats(event) for person in family.getChildList(): - if person not in self.plist: + if not self.plist.has_key(person.getId()): continue self.g.write("1 CHIL @%s@\n" % self.pid(person.getId())) if self.adopt == ADOPT_FTW: @@ -554,15 +563,17 @@ class GedcomWriter: break index = index + 1 - self.fbar.set_value((100*index)/nump) - while(gtk.events_pending()): - gtk.mainiteration() + if index % 100 == 0: + self.fbar.set_value((100*index)/nump) + while(gtk.events_pending()): + gtk.mainiteration() self.fbar.set_value(100.0) def write_sources(self): nump = float(len(self.slist)) index = 0.0 - for source in self.slist: + for key in self.slist.keys(): + source = self.db.getSource(key) self.g.write("0 @%s@ SOUR\n" % self.sid(source.getId())) if source.getTitle() != "": self.g.write("1 TITL %s\n" % fmtline(self.cnvtxt(source.getTitle()),248,1)) @@ -575,11 +586,12 @@ class GedcomWriter: if source.getCallNumber() != "": self.g.write("1 CALN %s\n" % self.cnvtxt(source.getCallNumber())) if source.getNote() != "": - self.write_long_text("NOTE",1,source.getNote()) + self.write_long_text("NOTE",1,self.cnvtxt(source.getNote())) index = index + 1 - self.sbar.set_value((100*index)/nump) - while(gtk.events_pending()): - gtk.mainiteration() + if index % 100 == 0: + self.sbar.set_value((100*index)/nump) + while(gtk.events_pending()): + gtk.mainiteration() self.sbar.set_value(100.0) def write_person(self,person): @@ -690,7 +702,7 @@ class GedcomWriter: self.g.write("2 TYPE %s\n" % self.cnvtxt(name)) self.g.write("2 PLAC %s\n" % self.cnvtxt(attr.getValue())) if attr.getNote() != "": - self.write_long_text("NOTE",2,attr.getNote()) + self.write_long_text("NOTE",2,self.cnvtxt(attr.getNote())) for srcref in attr.getSourceRefList(): self.write_source_ref(2,srcref) @@ -718,19 +730,19 @@ class GedcomWriter: if text: self.g.write("2 PLAC %s\n" % text) if addr.getNote() != "": - self.write_long_text("NOTE",3,addr.getNote()) + self.write_long_text("NOTE",3,self.cnvtxt(addr.getNote())) for srcref in addr.getSourceRefList(): self.write_source_ref(3,srcref) for family in person.getParentList(): - if family in self.flist: + if self.flist.has_key(family[0].getId()): self.g.write("1 FAMC @%s@\n" % self.fid(family[0].getId())) if self.adopt == ADOPT_PEDI: if string.lower(family[1]) == "adopted": self.g.write("2 PEDI Adopted\n") for family in person.getFamilyList(): - if family != None and family in self.flist: + if family != None and self.flist.has_key(family.getId()): self.g.write("1 FAMS @%s@\n" % self.fid(family.getId())) if self.obje: @@ -743,7 +755,7 @@ class GedcomWriter: self.g.write('2 FILE %s\n' % url.get_path()) if person.getNote() != "": - self.write_long_text("NOTE",1,person.getNote()) + self.write_long_text("NOTE",1,self.cnvtxt(person.getNote())) def write_long_text(self,tag,level,note): if self.conc == CONC_OK: @@ -817,7 +829,7 @@ class GedcomWriter: if event.getCause() != "": self.g.write("2 CAUS %s\n" % self.cnvtxt(event.getCause())) if event.getNote() != "": - self.write_long_text("NOTE",2,event.getNote()) + self.write_long_text("NOTE",2,self.cnvtxt(event.getNote())) for srcref in event.getSourceRefList(): self.write_source_ref(2,srcref) @@ -835,7 +847,7 @@ class GedcomWriter: if ord.getStatus() != 0: self.g.write("2 STAT %s\n" % self.cnvtxt(statlist[ord.getStatus()])) if ord.getNote() != "": - self.write_long_text("NOTE",index+1,ord.getNote()) + self.write_long_text("NOTE",index+1,self.cnvtxt(ord.getNote())) for srcref in ord.getSourceRefList(): self.write_source_ref(index+1,srcref) @@ -895,7 +907,7 @@ class GedcomWriter: if nick != "": self.g.write('2 NICK %s\n' % nick) if name.getNote() != "": - self.write_long_text("NOTE",2,name.getNote()) + self.write_long_text("NOTE",2,self.cnvtxt(name.getNote())) for srcref in name.getSourceRefList(): self.write_source_ref(2,srcref)