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:
parent
8139998822
commit
4487df24da
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
@ -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('&','&')
|
l = l.replace('&','&')
|
||||||
|
Loading…
Reference in New Issue
Block a user