diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 11cc1d1b2..1c11fe5e5 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,13 @@ +2006-05-15 Alex Roitman + * 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 * src/ViewManager.py: new stock icon support * src/gramps_main.py: new stock icon support diff --git a/gramps2/src/GrampsDb/_DbUtils.py b/gramps2/src/GrampsDb/_DbUtils.py index 95c7eff17..d540661d0 100644 --- a/gramps2/src/GrampsDb/_DbUtils.py +++ b/gramps2/src/GrampsDb/_DbUtils.py @@ -159,47 +159,59 @@ def get_total(db): place_len + source_len + obj_len + repo_len def db_copy(from_db,to_db,callback): - uc = UpdateCallback(from_db,callback) + uc = UpdateCallback(callback) uc.set_total(get_total(from_db)) - primary_tables = { + tables = { '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, - 'table': to_db.family_map }, + 'table': to_db.family_map, + 'sec_table' : to_db.fid_trans }, '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, - 'table': to_db.place_map }, + 'table': to_db.place_map, + 'sec_table' : to_db.pid_trans }, '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, - 'table': to_db.media_map }, + 'table': to_db.media_map, + 'sec_table' : to_db.oid_trans }, '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.UseTXN: add_data = add_data_txn else: add_data = add_data_notxn + update_secondary = update_secondary_empty else: 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 trans = to_db.transaction_begin("",batch=True) - for table_name in primary_tables.keys(): - cursor_func = primary_tables[table_name]['cursor_func'] - table = primary_tables[table_name]['table'] + for table_name in tables.keys(): + cursor_func = tables[table_name]['cursor_func'] + table = tables[table_name]['table'] + sec_table = tables[table_name]['sec_table'] cursor = cursor_func() item = cursor.first() while item: (handle,data) = item add_data(to_db,table,handle,data) + update_secondary(sec_table,handle,data) item = cursor.next() uc.update() cursor.close() @@ -213,6 +225,7 @@ def db_copy(from_db,to_db,callback): data = from_db.metadata.get(handle) to_db.metadata[handle] = data + def add_data_txn(db,table,handle,data): the_txn = db.env.txn_begin() 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): 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) diff --git a/gramps2/src/GrampsDb/_GrampsGEDDB.py b/gramps2/src/GrampsDb/_GrampsGEDDB.py index c644456b3..ef857f70c 100644 --- a/gramps2/src/GrampsDb/_GrampsGEDDB.py +++ b/gramps2/src/GrampsDb/_GrampsGEDDB.py @@ -28,8 +28,8 @@ of GEDCOM files. from RelLib import * from _GrampsInMemDB import * -import _ReadGedcom as ReadGedcom -import _WriteGedcom as WriteGedcom +from _ReadGedcom import importData +from _WriteGedcom import GedcomWriter from _DbUtils import db_copy #------------------------------------------------------------------------- @@ -49,7 +49,7 @@ class GrampsGEDDB(GrampsInMemDB): if self.db_is_open: self.close() 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') if self.bookmarks == None: @@ -64,7 +64,8 @@ class GrampsGEDDB(GrampsInMemDB): if self.bookmarks == None: self.bookmarks = [] 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) return 1 @@ -72,6 +73,7 @@ class GrampsGEDDB(GrampsInMemDB): if not self.db_is_open: return 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) self.db_is_open = False + GrampsInMemDB.close(self) diff --git a/gramps2/src/GrampsDb/_GrampsXMLDB.py b/gramps2/src/GrampsDb/_GrampsXMLDB.py index 9de5055e9..088cffa12 100644 --- a/gramps2/src/GrampsDb/_GrampsXMLDB.py +++ b/gramps2/src/GrampsDb/_GrampsXMLDB.py @@ -28,8 +28,8 @@ of GRAMPS XML format. from RelLib import * from _GrampsInMemDB import * -import _ReadXML as ReadXML -import _WriteXML as WriteXML +from _ReadXML import importData +from _WriteXML import quick_write from _DbUtils import db_copy #------------------------------------------------------------------------- @@ -51,7 +51,7 @@ class GrampsXMLDB(GrampsInMemDB): GrampsInMemDB.load(self,name,callback,mode) self.id_trans = {} - ReadXML.importData(self,name,callback,use_trans=False) + importData(self,name,callback,use_trans=False) self.bookmarks = self.metadata.get('bookmarks') if self.bookmarks == None: @@ -67,12 +67,13 @@ class GrampsXMLDB(GrampsInMemDB): if self.bookmarks == None: self.bookmarks = [] self.db_is_open = True - WriteXML.quick_write(self,self.full_name) + quick_write(self,self.full_name,callback) return 1 def close(self): if not self.db_is_open: return 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 + GrampsInMemDB.close(self) diff --git a/gramps2/src/GrampsDb/_WriteGedcom.py b/gramps2/src/GrampsDb/_WriteGedcom.py index 6764739d6..5f3d60380 100644 --- a/gramps2/src/GrampsDb/_WriteGedcom.py +++ b/gramps2/src/GrampsDb/_WriteGedcom.py @@ -69,6 +69,7 @@ import ansel_utf8 import Utils import NameDisplay from QuestionDialog import ErrorDialog, WarningDialog +from BasicUtils import UpdateCallback def keep_utf8(s): return s @@ -478,19 +479,16 @@ class GedcomWriterOptionBox: 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, callback=None): + UpdateCallback.__init__(self,callback) + self.db = database self.person = person self.option_box = option_box self.cl = cl 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.slist = {} @@ -550,16 +548,6 @@ class GedcomWriter: self.slist,self.option_box.private) 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): self.restrict = 0 self.private = 0 @@ -665,10 +653,8 @@ class GedcomWriter: self.writeln('2 CONT Not Provided') pkeys = self.plist.keys() - self.total = len(pkeys) + len(self.flist.keys()) \ - + len(self.slist.keys()) - self.oldval = 0 - self.count = 0 + self.set_total(len(pkeys) + len(self.flist.keys()) \ + + len(self.slist.keys())) sorted = [] for key in pkeys: diff --git a/gramps2/src/GrampsDb/_WriteXML.py b/gramps2/src/GrampsDb/_WriteXML.py index 56086df57..8958c8a46 100644 --- a/gramps2/src/GrampsDb/_WriteXML.py +++ b/gramps2/src/GrampsDb/_WriteXML.py @@ -62,6 +62,7 @@ from QuestionDialog import ErrorDialog from _GrampsDbBase import \ PERSON_KEY,FAMILY_KEY,SOURCE_KEY,EVENT_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. """ @@ -137,13 +138,9 @@ class XmlWriter: 2: remove leading slash compress - attempt to compress the database """ + UpdateCallback.__init__(self,callback) self.compress = compress 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 def write(self,filename): @@ -211,18 +208,17 @@ class XmlWriter: date = time.localtime(time.time()) 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()) + family_len = self.db.get_number_of_families() + event_len = self.db.get_number_of_events() + 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.total = person_len + family_len + event_len + place_len + \ - source_len + obj_len + repo_len - self.count = 0 - self.oldval = 0 + self.set_total(person_len+family_len+event_len+source_len + +place_len+repo_len+obj_len) self.g.write('\n') self.g.write('\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): l = line.strip() l = l.replace('&','&')