DictionaryDb: now reads/writes on open/close

This commit is contained in:
Doug Blank 2015-05-13 21:29:07 -04:00
parent 8a42966c1f
commit 789158aca5
5 changed files with 170 additions and 71 deletions

View File

@ -28,20 +28,16 @@ Declare constants used by database modules
# constants # constants
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
__all__ = ( __all__ = ( 'DBPAGE', 'DBMODE', 'DBCACHE', 'DBLOCKS', 'DBOBJECTS', 'DBUNDO',
('DBPAGE', 'DBMODE', 'DBCACHE', 'DBLOCKS', 'DBOBJECTS', 'DBUNDO', 'DBEXT', 'DBMODE_R', 'DBMODE_W', 'DBUNDOFN', 'DBLOCKFN',
'DBEXT', 'DBMODE_R', 'DBMODE_W', 'DBUNDOFN', 'DBLOCKFN', 'DBRECOVFN','BDBVERSFN', 'DBLOGNAME', 'SCHVERSFN', 'PCKVERSFN',
'DBRECOVFN','BDBVERSFN', 'DBLOGNAME', 'SCHVERSFN', 'PCKVERSFN', 'DBBACKEND',
'DBBACKEND' 'PERSON_KEY', 'FAMILY_KEY', 'SOURCE_KEY', 'CITATION_KEY',
) + 'EVENT_KEY', 'MEDIA_KEY', 'PLACE_KEY', 'REPOSITORY_KEY',
'NOTE_KEY', 'REFERENCE_KEY', 'TAG_KEY',
('PERSON_KEY', 'FAMILY_KEY', 'SOURCE_KEY', 'CITATION_KEY', 'TXNADD', 'TXNUPD', 'TXNDEL',
'EVENT_KEY', 'MEDIA_KEY', 'PLACE_KEY', 'REPOSITORY_KEY', "CLASS_TO_KEY_MAP", "KEY_TO_CLASS_MAP", "KEY_TO_NAME_MAP"
'NOTE_KEY', 'REFERENCE_KEY', 'TAG_KEY' )
) +
('TXNADD', 'TXNUPD', 'TXNDEL')
)
DBEXT = ".db" # File extension to be used for database files DBEXT = ".db" # File extension to be used for database files
DBUNDOFN = "undo.db" # File name of 'undo' database DBUNDOFN = "undo.db" # File name of 'undo' database
@ -74,3 +70,37 @@ TAG_KEY = 9
CITATION_KEY = 10 CITATION_KEY = 10
TXNADD, TXNUPD, TXNDEL = 0, 1, 2 TXNADD, TXNUPD, TXNDEL = 0, 1, 2
CLASS_TO_KEY_MAP = {"Person": PERSON_KEY,
"Family": FAMILY_KEY,
"Source": SOURCE_KEY,
"Citation": CITATION_KEY,
"Event": EVENT_KEY,
"MediaObject": MEDIA_KEY,
"Place": PLACE_KEY,
"Repository": REPOSITORY_KEY,
"Note" : NOTE_KEY,
"Tag": TAG_KEY}
KEY_TO_CLASS_MAP = {PERSON_KEY: "Person",
FAMILY_KEY: "Family",
SOURCE_KEY: "Source",
CITATION_KEY: "Citation",
EVENT_KEY: "Event",
MEDIA_KEY: "MediaObject",
PLACE_KEY: "Place",
REPOSITORY_KEY: "Repository",
NOTE_KEY: "Note",
TAG_KEY: "Tag"}
KEY_TO_NAME_MAP = {PERSON_KEY: 'person',
FAMILY_KEY: 'family',
EVENT_KEY: 'event',
SOURCE_KEY: 'source',
CITATION_KEY: 'citation',
PLACE_KEY: 'place',
MEDIA_KEY: 'media',
REPOSITORY_KEY: 'repository',
#REFERENCE_KEY: 'reference',
NOTE_KEY: 'note',
TAG_KEY: 'tag'}

View File

@ -130,39 +130,6 @@ DBERRS = (db.DBRunRecoveryError, db.DBAccessError,
# these maps or modifying the values of the keys will break # these maps or modifying the values of the keys will break
# existing databases. # existing databases.
CLASS_TO_KEY_MAP = {Person.__name__: PERSON_KEY,
Family.__name__: FAMILY_KEY,
Source.__name__: SOURCE_KEY,
Citation.__name__: CITATION_KEY,
Event.__name__: EVENT_KEY,
MediaObject.__name__: MEDIA_KEY,
Place.__name__: PLACE_KEY,
Repository.__name__:REPOSITORY_KEY,
Note.__name__: NOTE_KEY,
Tag.__name__: TAG_KEY}
KEY_TO_CLASS_MAP = {PERSON_KEY: Person.__name__,
FAMILY_KEY: Family.__name__,
SOURCE_KEY: Source.__name__,
CITATION_KEY: Citation.__name__,
EVENT_KEY: Event.__name__,
MEDIA_KEY: MediaObject.__name__,
PLACE_KEY: Place.__name__,
REPOSITORY_KEY: Repository.__name__,
NOTE_KEY: Note.__name__,
TAG_KEY: Tag.__name__}
KEY_TO_NAME_MAP = {PERSON_KEY: 'person',
FAMILY_KEY: 'family',
EVENT_KEY: 'event',
SOURCE_KEY: 'source',
CITATION_KEY: 'citation',
PLACE_KEY: 'place',
MEDIA_KEY: 'media',
REPOSITORY_KEY: 'repository',
#REFERENCE_KEY: 'reference',
NOTE_KEY: 'note',
TAG_KEY: 'tag'}
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# Helper functions # Helper functions

View File

@ -28,6 +28,7 @@ import pickle
import base64 import base64
import time import time
import re import re
import os
from gramps.gen.db import DbReadBase, DbWriteBase, DbTxn from gramps.gen.db import DbReadBase, DbWriteBase, DbTxn
from gramps.gen.utils.callback import Callback from gramps.gen.utils.callback import Callback
from gramps.gen.updatecallback import UpdateCallback from gramps.gen.updatecallback import UpdateCallback
@ -40,7 +41,8 @@ from gramps.gen.db import (PERSON_KEY,
PLACE_KEY, PLACE_KEY,
REPOSITORY_KEY, REPOSITORY_KEY,
NOTE_KEY, NOTE_KEY,
TAG_KEY) TAG_KEY,
KEY_TO_NAME_MAP)
from gramps.gen.utils.id import create_id from gramps.gen.utils.id import create_id
from gramps.gen.lib.researcher import Researcher from gramps.gen.lib.researcher import Researcher
@ -197,7 +199,7 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
__callback_map = {} __callback_map = {}
def __init__(self, *args, **kwargs): def __init__(self, directory=None):
DbReadBase.__init__(self) DbReadBase.__init__(self)
DbWriteBase.__init__(self) DbWriteBase.__init__(self)
Callback.__init__(self) Callback.__init__(self)
@ -323,7 +325,7 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
self.place_bookmarks = Bookmarks() self.place_bookmarks = Bookmarks()
self.citation_bookmarks = Bookmarks() self.citation_bookmarks = Bookmarks()
self.source_bookmarks = Bookmarks() self.source_bookmarks = Bookmarks()
self.repository_bookmarks = Bookmarks() self.repo_bookmarks = Bookmarks()
self.media_bookmarks = Bookmarks() self.media_bookmarks = Bookmarks()
self.note_bookmarks = Bookmarks() self.note_bookmarks = Bookmarks()
self.set_person_id_prefix('I%04d') self.set_person_id_prefix('I%04d')
@ -373,6 +375,9 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
self.modified = 0 self.modified = 0
self.txn = DictionaryTxn("DbDictionary Transaction", self) self.txn = DictionaryTxn("DbDictionary Transaction", self)
self.transaction = None self.transaction = None
self._directory = directory
if directory:
self.load(directory)
def version_supported(self): def version_supported(self):
"""Return True when the file has a supported version.""" """Return True when the file has a supported version."""
@ -768,24 +773,66 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
return tag return tag
return None return None
def get_family_from_gramps_id(self, gramps_id):
for family in self.family_map.values():
if family.gramps_id == gramps_id:
return family
return None
def get_person_from_gramps_id(self, gramps_id): def get_person_from_gramps_id(self, gramps_id):
for person in self.person_map.values(): for person in self.person_map.values():
if person.gramps_id == gramps_id: if person.gramps_id == gramps_id:
return person return person
return None return None
def get_family_from_gramps_id(self, gramps_id):
for family in self.family_map.values():
if family.gramps_id == gramps_id:
return family
return None
def get_citation_from_gramps_id(self, gramps_id):
for citation in self.citation_map.values():
if citation.gramps_id == gramps_id:
return citation
return None
def get_source_from_gramps_id(self, gramps_id):
for source in self.source_map.values():
if source.gramps_id == gramps_id:
return source
return None
def get_event_from_gramps_id(self, gramps_id):
for event in self.event_map.values():
if event.gramps_id == gramps_id:
return event
return None
def get_media_from_gramps_id(self, gramps_id):
for media in self.media_map.values():
if media.gramps_id == gramps_id:
return media
return None
def get_place_from_gramps_id(self, gramps_id): def get_place_from_gramps_id(self, gramps_id):
for place in self.place_map.values(): for place in self.place_map.values():
if place.gramps_id == gramps_id: if place.gramps_id == gramps_id:
return place return place
return None return None
def get_repository_from_gramps_id(self, gramps_id):
for repository in self.repository_map.values():
if repository.gramps_id == gramps_id:
return repository
return None
def get_note_from_gramps_id(self, gramps_id):
for note in self.note_map.values():
if note.gramps_id == gramps_id:
return note
return None
def get_tag_from_gramps_id(self, gramps_id):
for tag in self.tag_map.values():
if tag.gramps_id == gramps_id:
return tag
return None
def get_number_of_people(self): def get_number_of_people(self):
return len(self.person_map) return len(self.person_map)
@ -1038,33 +1085,73 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
return obj.handle return obj.handle
def commit_person(self, person, trans, change_time=None): def commit_person(self, person, trans, change_time=None):
if person.handle in self.person_map:
self.emit("person-update", ([person.handle],))
else:
self.emit("person-add", ([person.handle],))
self.person_map[person.handle] = person self.person_map[person.handle] = person
def commit_family(self, family, trans, change_time=None): def commit_family(self, family, trans, change_time=None):
if family.handle in self.family_map:
self.emit("family-update", ([family.handle],))
else:
self.emit("family-add", ([family.handle],))
self.family_map[family.handle] = family self.family_map[family.handle] = family
def commit_citation(self, citation, trans, change_time=None): def commit_citation(self, citation, trans, change_time=None):
if citation.handle in self.citation_map:
self.emit("citation-update", ([citation.handle],))
else:
self.emit("citation-add", ([citation.handle],))
self.citation_map[citation.handle] = citation self.citation_map[citation.handle] = citation
def commit_source(self, source, trans, change_time=None): def commit_source(self, source, trans, change_time=None):
if source.handle in self.source_map:
self.emit("source-update", ([source.handle],))
else:
self.emit("source-add", ([source.handle],))
self.source_map[source.handle] = source self.source_map[source.handle] = source
def commit_repository(self, repository, trans, change_time=None): def commit_repository(self, repository, trans, change_time=None):
if repository.handle in self.repository_map:
self.emit("repository-update", ([repository.handle],))
else:
self.emit("repository-add", ([repository.handle],))
self.repository_map[repository.handle] = repository self.repository_map[repository.handle] = repository
def commit_note(self, note, trans, change_time=None): def commit_note(self, note, trans, change_time=None):
if note.handle in self.note_map:
self.emit("note-update", ([note.handle],))
else:
self.emit("note-add", ([note.handle],))
self.note_map[note.handle] = note self.note_map[note.handle] = note
def commit_place(self, place, trans, change_time=None): def commit_place(self, place, trans, change_time=None):
if place.handle in self.place_map:
self.emit("place-update", ([place.handle],))
else:
self.emit("place-add", ([place.handle],))
self.place_map[place.handle] = place self.place_map[place.handle] = place
def commit_event(self, event, trans, change_time=None): def commit_event(self, event, trans, change_time=None):
if event.handle in self.event_map:
self.emit("event-update", ([event.handle],))
else:
self.emit("event-add", ([event.handle],))
self.event_map[event.handle] = event self.event_map[event.handle] = event
def commit_tag(self, tag, trans, change_time=None): def commit_tag(self, tag, trans, change_time=None):
if tag.handle in self.tag_map:
self.emit("tag-update", ([tag.handle],))
else:
self.emit("tag-add", ([tag.handle],))
self.tag_map[tag.handle] = tag self.tag_map[tag.handle] = tag
def commit_media_object(self, obj, transaction, change_time=None): def commit_media_object(self, obj, transaction, change_time=None):
if commit.handle in self.commit_map:
self.emit("commit-update", ([commit.handle],))
else:
self.emit("commit-add", ([commit.handle],))
self.media_map[obj.handle] = obj self.media_map[obj.handle] = obj
def get_gramps_ids(self, obj_key): def get_gramps_ids(self, obj_key):
@ -1092,7 +1179,16 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
pass pass
def request_rebuild(self): def request_rebuild(self):
pass self.emit('person-rebuild')
self.emit('family-rebuild')
self.emit('place-rebuild')
self.emit('source-rebuild')
self.emit('citation-rebuild')
self.emit('media-rebuild')
self.emit('event-rebuild')
self.emit('repository-rebuild')
self.emit('note-rebuild')
self.emit('tag-rebuild')
def copy_from_db(self, db): def copy_from_db(self, db):
""" """
@ -1163,6 +1259,7 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
self.delete_primary_from_reference_map(handle, transaction, self.delete_primary_from_reference_map(handle, transaction,
txn=self.txn) txn=self.txn)
self.person_map.delete(handle, txn=self.txn) self.person_map.delete(handle, txn=self.txn)
self.emit("person-delete", ([handle],))
transaction.add(PERSON_KEY, TXNDEL, handle, person.serialize(), None) transaction.add(PERSON_KEY, TXNDEL, handle, person.serialize(), None)
def remove_source(self, handle, transaction): def remove_source(self, handle, transaction):
@ -1262,6 +1359,7 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
txn=self.txn) txn=self.txn)
old_data = data_map.get(handle, txn=self.txn) old_data = data_map.get(handle, txn=self.txn)
data_map.delete(handle, txn=self.txn) data_map.delete(handle, txn=self.txn)
self.emit(KEY_TO_NAME_MAP[key] + "-delete", ([handle],))
transaction.add(key, TXNDEL, handle, old_data, None) transaction.add(key, TXNDEL, handle, old_data, None)
def delete_primary_from_reference_map(self, handle, transaction, txn=None): def delete_primary_from_reference_map(self, handle, transaction, txn=None):
@ -1328,7 +1426,12 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
pass pass
def close(self): def close(self):
pass if self._directory:
from gramps.plugins.export.exportxml import XmlWriter
from gramps.cli.user import User
writer = XmlWriter(self, User(), strip_photos=0, compress=1)
filename = os.path.join(self._directory, "data.gramps")
writer.write(filename)
def find_backlink_handles(self, handle, include_classes=None): def find_backlink_handles(self, handle, include_classes=None):
return [] return []
@ -1424,7 +1527,7 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
return [] return []
def get_repo_bookmarks(self): def get_repo_bookmarks(self):
return self.repository_bookmarks return self.repo_bookmarks
def get_repository_types(self): def get_repository_types(self):
return [] return []
@ -1498,12 +1601,17 @@ class DictionaryDb(DbWriteBase, DbReadBase, UpdateCallback, Callback):
def iter_tags(self): def iter_tags(self):
return (key for key in self.tag_map.values()) return (key for key in self.tag_map.values())
def load(self, directory, pulse_progress, mode, def load(self, directory, pulse_progress=None, mode=None,
force_schema_upgrade, force_schema_upgrade=False,
force_bsddb_upgrade, force_bsddb_upgrade=False,
force_bsddb_downgrade, force_bsddb_downgrade=False,
force_python_upgrade): force_python_upgrade=False):
from gramps.plugins.importer.importxml import importData
from gramps.cli.user import User
self._directory = directory self._directory = directory
filename = os.path.join(directory, "data.gramps")
if os.path.isfile(filename):
importData(self, filename, User())
def prepare_import(self): def prepare_import(self):
pass pass

View File

@ -1402,7 +1402,6 @@ class DbDjango(DbWriteBase, DbReadBase, UpdateCallback, Callback):
if not person.gramps_id and set_gid: if not person.gramps_id and set_gid:
person.gramps_id = self.find_next_person_gramps_id() person.gramps_id = self.find_next_person_gramps_id()
self.commit_person(person, trans) self.commit_person(person, trans)
self.emit("person-add", ([person.handle],))
return person.handle return person.handle
def add_family(self, family, trans, set_gid=True): def add_family(self, family, trans, set_gid=True):
@ -1411,7 +1410,6 @@ class DbDjango(DbWriteBase, DbReadBase, UpdateCallback, Callback):
if not family.gramps_id and set_gid: if not family.gramps_id and set_gid:
family.gramps_id = self.find_next_family_gramps_id() family.gramps_id = self.find_next_family_gramps_id()
self.commit_family(family, trans) self.commit_family(family, trans)
self.emit("family-add", ([family.handle],))
return family.handle return family.handle
def add_citation(self, citation, trans, set_gid=True): def add_citation(self, citation, trans, set_gid=True):
@ -1420,7 +1418,6 @@ class DbDjango(DbWriteBase, DbReadBase, UpdateCallback, Callback):
if not citation.gramps_id and set_gid: if not citation.gramps_id and set_gid:
citation.gramps_id = self.find_next_citation_gramps_id() citation.gramps_id = self.find_next_citation_gramps_id()
self.commit_citation(citation, trans) self.commit_citation(citation, trans)
self.emit("citation-add", ([citation.handle],))
return citation.handle return citation.handle
def add_source(self, source, trans, set_gid=True): def add_source(self, source, trans, set_gid=True):
@ -1429,7 +1426,6 @@ class DbDjango(DbWriteBase, DbReadBase, UpdateCallback, Callback):
if not source.gramps_id and set_gid: if not source.gramps_id and set_gid:
source.gramps_id = self.find_next_source_gramps_id() source.gramps_id = self.find_next_source_gramps_id()
self.commit_source(source, trans) self.commit_source(source, trans)
self.emit("source-add", ([source.handle],))
return source.handle return source.handle
def add_repository(self, repository, trans, set_gid=True): def add_repository(self, repository, trans, set_gid=True):
@ -1438,7 +1434,6 @@ class DbDjango(DbWriteBase, DbReadBase, UpdateCallback, Callback):
if not repository.gramps_id and set_gid: if not repository.gramps_id and set_gid:
repository.gramps_id = self.find_next_repository_gramps_id() repository.gramps_id = self.find_next_repository_gramps_id()
self.commit_repository(repository, trans) self.commit_repository(repository, trans)
self.emit("repository-add", ([repository.handle],))
return repository.handle return repository.handle
def add_note(self, note, trans, set_gid=True): def add_note(self, note, trans, set_gid=True):
@ -1447,7 +1442,6 @@ class DbDjango(DbWriteBase, DbReadBase, UpdateCallback, Callback):
if not note.gramps_id and set_gid: if not note.gramps_id and set_gid:
note.gramps_id = self.find_next_note_gramps_id() note.gramps_id = self.find_next_note_gramps_id()
self.commit_note(note, trans) self.commit_note(note, trans)
self.emit("note-add", ([note.handle],))
return note.handle return note.handle
def add_place(self, place, trans, set_gid=True): def add_place(self, place, trans, set_gid=True):

View File

@ -57,7 +57,7 @@ from gramps.gen.lib import (Address, Attribute, AttributeType, ChildRef,
SrcAttribute, SrcAttributeType, StyledText, SrcAttribute, SrcAttributeType, StyledText,
StyledTextTag, StyledTextTagType, Surname, Tag, Url) StyledTextTag, StyledTextTagType, Surname, Tag, Url)
from gramps.gen.db import DbTxn from gramps.gen.db import DbTxn
from gramps.gen.db.write import CLASS_TO_KEY_MAP #from gramps.gen.db.write import CLASS_TO_KEY_MAP
from gramps.gen.errors import GrampsImportError from gramps.gen.errors import GrampsImportError
from gramps.gen.utils.id import create_id from gramps.gen.utils.id import create_id
from gramps.gen.utils.db import family_name from gramps.gen.utils.db import family_name