DB-API and DbDictionary both use same binary handles as BSDDB

This commit is contained in:
Doug Blank
2016-01-31 09:15:52 -05:00
parent 2fb9a018c7
commit 403c87b887
4 changed files with 183 additions and 50 deletions

View File

@@ -1,7 +1,7 @@
# #
# Gramps - a GTK+/GNOME based genealogy program # Gramps - a GTK+/GNOME based genealogy program
# #
# Copyright (C) 2015 Douglas S. Blank <doug.blank@gmail.com> # Copyright (C) 2015-2016 Gramps Development Team
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@@ -34,6 +34,7 @@ import shutil
import bisect import bisect
import ast import ast
import sys import sys
import datetime
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
@@ -272,10 +273,10 @@ class Map(object):
def __setitem__(self, key, value): def __setitem__(self, key, value):
""" """
This is only done in a low-level raw import. This is only done in a assignment via key.
value: serialized object value: serialized object
key: bytes key (ignored in this implementation) key: bytes key (ignored in this function)
""" """
obj = self.table.funcs["class_func"].create(value) obj = self.table.funcs["class_func"].create(value)
self.table.funcs["commit_func"](obj, self.txn) self.table.funcs["commit_func"](obj, self.txn)
@@ -318,7 +319,7 @@ class Cursor(object):
return self return self
def __iter__(self): def __iter__(self):
for item in self.map.keys(): for item in self.map.keys():
yield (bytes(item, "utf-8"), self.map[item]) yield (item, self.map[item])
def __next__(self): def __next__(self):
try: try:
return self._iter.__next__() return self._iter.__next__()
@@ -328,7 +329,7 @@ class Cursor(object):
pass pass
def iter(self): def iter(self):
for item in self.map.keys(): for item in self.map.keys():
yield (bytes(item, "utf-8"), self.map[item]) yield (item, self.map[item])
def first(self): def first(self):
self._iter = self.__iter__() self._iter = self.__iter__()
try: try:
@@ -357,7 +358,7 @@ class TreeCursor(Cursor):
""" """
handles = self.db.get_place_handles(sort_handles=True) handles = self.db.get_place_handles(sort_handles=True)
for handle in handles: for handle in handles:
yield (bytes(handle, "utf-8"), self.db._get_raw_place_data(handle)) yield (handle, self.db._get_raw_place_data(handle))
class Bookmarks(object): class Bookmarks(object):
def __init__(self, default=[]): def __init__(self, default=[]):
@@ -1265,63 +1266,103 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
return gramps_id in key2table[obj_key] return gramps_id in key2table[obj_key]
def has_person_handle(self, handle): def has_person_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.person_map return handle in self.person_map
def has_family_handle(self, handle): def has_family_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.family_map return handle in self.family_map
def has_citation_handle(self, handle): def has_citation_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.citation_map return handle in self.citation_map
def has_source_handle(self, handle): def has_source_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.source_map return handle in self.source_map
def has_repository_handle(self, handle): def has_repository_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.repository_map return handle in self.repository_map
def has_note_handle(self, handle): def has_note_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.note_map return handle in self.note_map
def has_place_handle(self, handle): def has_place_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.place_map return handle in self.place_map
def has_event_handle(self, handle): def has_event_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.event_map return handle in self.event_map
def has_tag_handle(self, handle): def has_tag_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.tag_map return handle in self.tag_map
def has_media_handle(self, handle): def has_media_handle(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return handle in self.media_map return handle in self.media_map
def get_raw_person_data(self, handle): def get_raw_person_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.person_map[handle] return self.person_map[handle]
def get_raw_family_data(self, handle): def get_raw_family_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.family_map[handle] return self.family_map[handle]
def get_raw_citation_data(self, handle): def get_raw_citation_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.citation_map[handle] return self.citation_map[handle]
def get_raw_source_data(self, handle): def get_raw_source_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.source_map[handle] return self.source_map[handle]
def get_raw_repository_data(self, handle): def get_raw_repository_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.repository_map[handle] return self.repository_map[handle]
def get_raw_note_data(self, handle): def get_raw_note_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.note_map[handle] return self.note_map[handle]
def get_raw_place_data(self, handle): def get_raw_place_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.place_map[handle] return self.place_map[handle]
def get_raw_media_data(self, handle): def get_raw_media_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.media_map[handle] return self.media_map[handle]
def get_raw_tag_data(self, handle): def get_raw_tag_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.tag_map[handle] return self.tag_map[handle]
def get_raw_event_data(self, handle): def get_raw_event_data(self, handle):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
return self.event_map[handle] return self.event_map[handle]
def add_person(self, person, trans, set_gid=True): def add_person(self, person, trans, set_gid=True):
@@ -1517,6 +1558,8 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
class_ = db._tables[key]["class_func"] class_ = db._tables[key]["class_func"]
for (handle, data) in cursor(): for (handle, data) in cursor():
map = getattr(self, "%s_map" % key.lower()) map = getattr(self, "%s_map" % key.lower())
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
map[handle] = class_.create(data) map[handle] = class_.create(data)
def get_transaction_class(self): def get_transaction_class(self):
@@ -1990,7 +2033,8 @@ class DbGeneric(DbWriteBase, DbReadBase, UpdateCallback, Callback):
from gramps.plugins.export.exportxml import XmlWriter from gramps.plugins.export.exportxml import XmlWriter
from gramps.cli.user import User from gramps.cli.user import User
writer = XmlWriter(self, User(), strip_photos=0, compress=1) writer = XmlWriter(self, User(), strip_photos=0, compress=1)
filename = os.path.join(self._directory, "data.gramps") timestamp = '{0:%Y-%m-%d-%H-%M-%S}'.format(datetime.datetime.now())
filename = os.path.join(self._directory, "backup-%s.gramps" % timestamp)
writer.write(filename) writer.write(filename)
def get_undodb(self): def get_undodb(self):

View File

@@ -190,8 +190,8 @@ def diff_dbs(db1, db2, user=None):
for item in ['Person', 'Family', 'Source', 'Citation', 'Event', 'Media', for item in ['Person', 'Family', 'Source', 'Citation', 'Event', 'Media',
'Place', 'Repository', 'Note', 'Tag']: 'Place', 'Repository', 'Note', 'Tag']:
step() step()
handles1 = sorted([handle.decode('utf-8') for handle in db1._tables[item]["handles_func"]()]) handles1 = sorted([handle for handle in db1._tables[item]["handles_func"]()])
handles2 = sorted([handle.decode('utf-8') for handle in db2._tables[item]["handles_func"]()]) handles2 = sorted([handle for handle in db2._tables[item]["handles_func"]()])
p1 = 0 p1 = 0
p2 = 0 p2 = 0
while p1 < len(handles1) and p2 < len(handles2): while p1 < len(handles1) and p2 < len(handles2):

View File

@@ -336,17 +336,17 @@ class DBAPI(DbGeneric):
else: else:
self.dbapi.execute("SELECT handle FROM person;") self.dbapi.execute("SELECT handle FROM person;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_family_handles(self): def get_family_handles(self):
self.dbapi.execute("SELECT handle FROM family;") self.dbapi.execute("SELECT handle FROM family;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_event_handles(self): def get_event_handles(self):
self.dbapi.execute("SELECT handle FROM event;") self.dbapi.execute("SELECT handle FROM event;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_citation_handles(self, sort_handles=False): def get_citation_handles(self, sort_handles=False):
if sort_handles: if sort_handles:
@@ -354,7 +354,7 @@ class DBAPI(DbGeneric):
else: else:
self.dbapi.execute("SELECT handle FROM citation;") self.dbapi.execute("SELECT handle FROM citation;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_source_handles(self, sort_handles=False): def get_source_handles(self, sort_handles=False):
if sort_handles: if sort_handles:
@@ -362,7 +362,7 @@ class DBAPI(DbGeneric):
else: else:
self.dbapi.execute("SELECT handle from source;") self.dbapi.execute("SELECT handle from source;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_place_handles(self, sort_handles=False): def get_place_handles(self, sort_handles=False):
if sort_handles: if sort_handles:
@@ -370,12 +370,12 @@ class DBAPI(DbGeneric):
else: else:
self.dbapi.execute("SELECT handle FROM place;") self.dbapi.execute("SELECT handle FROM place;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_repository_handles(self): def get_repository_handles(self):
self.dbapi.execute("SELECT handle FROM repository;") self.dbapi.execute("SELECT handle FROM repository;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_media_handles(self, sort_handles=False): def get_media_handles(self, sort_handles=False):
if sort_handles: if sort_handles:
@@ -383,12 +383,12 @@ class DBAPI(DbGeneric):
else: else:
self.dbapi.execute("SELECT handle FROM media;") self.dbapi.execute("SELECT handle FROM media;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_note_handles(self): def get_note_handles(self):
self.dbapi.execute("SELECT handle FROM note;") self.dbapi.execute("SELECT handle FROM note;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_tag_handles(self, sort_handles=False): def get_tag_handles(self, sort_handles=False):
if sort_handles: if sort_handles:
@@ -396,7 +396,7 @@ class DBAPI(DbGeneric):
else: else:
self.dbapi.execute("SELECT handle FROM tag;") self.dbapi.execute("SELECT handle FROM tag;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
return [row[0] for row in rows] return [bytes(row[0], "utf-8") for row in rows]
def get_tag_from_name(self, name): def get_tag_from_name(self, name):
self.dbapi.execute("""select handle from tag where order_by = ?;""", self.dbapi.execute("""select handle from tag where order_by = ?;""",
@@ -960,7 +960,8 @@ class DBAPI(DbGeneric):
Remove the Person specified by the database handle from the database, Remove the Person specified by the database handle from the database,
preserving the change in the passed transaction. preserving the change in the passed transaction.
""" """
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
if self.readonly or not handle: if self.readonly or not handle:
return return
if handle in self.person_map: if handle in self.person_map:
@@ -973,6 +974,8 @@ class DBAPI(DbGeneric):
person.serialize(), None) person.serialize(), None)
def _do_remove(self, handle, transaction, data_map, data_id_map, key): def _do_remove(self, handle, transaction, data_map, data_id_map, key):
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
key2table = { key2table = {
PERSON_KEY: "person", PERSON_KEY: "person",
FAMILY_KEY: "family", FAMILY_KEY: "family",
@@ -1013,6 +1016,8 @@ class DBAPI(DbGeneric):
result_list = list(find_backlink_handles(handle)) result_list = list(find_backlink_handles(handle))
""" """
if isinstance(handle, bytes):
handle = str(handle, "utf-8")
self.dbapi.execute("SELECT obj_class, obj_handle FROM reference WHERE ref_handle = ?;", self.dbapi.execute("SELECT obj_class, obj_handle FROM reference WHERE ref_handle = ?;",
[handle]) [handle])
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
@@ -1082,61 +1087,61 @@ class DBAPI(DbGeneric):
self.dbapi.execute("SELECT handle FROM person;") self.dbapi.execute("SELECT handle FROM person;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def iter_family_handles(self): def iter_family_handles(self):
self.dbapi.execute("SELECT handle FROM family;") self.dbapi.execute("SELECT handle FROM family;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def iter_citation_handles(self): def iter_citation_handles(self):
self.dbapi.execute("SELECT handle FROM citation;") self.dbapi.execute("SELECT handle FROM citation;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def iter_event_handles(self): def iter_event_handles(self):
self.dbapi.execute("SELECT handle FROM event;") self.dbapi.execute("SELECT handle FROM event;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def iter_media_handles(self): def iter_media_handles(self):
self.dbapi.execute("SELECT handle FROM media;") self.dbapi.execute("SELECT handle FROM media;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def iter_note_handles(self): def iter_note_handles(self):
self.dbapi.execute("SELECT handle FROM note;") self.dbapi.execute("SELECT handle FROM note;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def iter_place_handles(self): def iter_place_handles(self):
self.dbapi.execute("SELECT handle FROM place;") self.dbapi.execute("SELECT handle FROM place;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def iter_repository_handles(self): def iter_repository_handles(self):
self.dbapi.execute("SELECT handle FROM repository;") self.dbapi.execute("SELECT handle FROM repository;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def iter_source_handles(self): def iter_source_handles(self):
self.dbapi.execute("SELECT handle FROM source;") self.dbapi.execute("SELECT handle FROM source;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def iter_tag_handles(self): def iter_tag_handles(self):
self.dbapi.execute("SELECT handle FROM tag;") self.dbapi.execute("SELECT handle FROM tag;")
rows = self.dbapi.fetchall() rows = self.dbapi.fetchall()
for row in rows: for row in rows:
yield row[0] yield bytes(row[0], "utf-8")
def reindex_reference_map(self, callback): def reindex_reference_map(self, callback):
callback(4) callback(4)
@@ -1188,42 +1193,62 @@ class DBAPI(DbGeneric):
self.dbapi.commit() self.dbapi.commit()
def has_handle_for_person(self, key): def has_handle_for_person(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM person WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM person WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
def has_handle_for_family(self, key): def has_handle_for_family(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM family WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM family WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
def has_handle_for_source(self, key): def has_handle_for_source(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM source WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM source WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
def has_handle_for_citation(self, key): def has_handle_for_citation(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM citation WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM citation WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
def has_handle_for_event(self, key): def has_handle_for_event(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM event WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM event WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
def has_handle_for_media(self, key): def has_handle_for_media(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM media WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM media WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
def has_handle_for_place(self, key): def has_handle_for_place(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM place WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM place WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
def has_handle_for_repository(self, key): def has_handle_for_repository(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM repository WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM repository WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
def has_handle_for_note(self, key): def has_handle_for_note(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM note WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM note WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
def has_handle_for_tag(self, key): def has_handle_for_tag(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT 1 FROM tag WHERE handle = ?", [key]) self.dbapi.execute("SELECT 1 FROM tag WHERE handle = ?", [key])
return self.dbapi.fetchone() != None return self.dbapi.fetchone() != None
@@ -1309,6 +1334,8 @@ class DBAPI(DbGeneric):
return [row[0] for row in rows] return [row[0] for row in rows]
def _get_raw_person_data(self, key): def _get_raw_person_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM person WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM person WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
@@ -1321,6 +1348,8 @@ class DBAPI(DbGeneric):
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_family_data(self, key): def _get_raw_family_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM family WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM family WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
@@ -1333,6 +1362,8 @@ class DBAPI(DbGeneric):
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_source_data(self, key): def _get_raw_source_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM source WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM source WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
@@ -1345,6 +1376,8 @@ class DBAPI(DbGeneric):
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_citation_data(self, key): def _get_raw_citation_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM citation WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM citation WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
@@ -1357,6 +1390,8 @@ class DBAPI(DbGeneric):
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_event_data(self, key): def _get_raw_event_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM event WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM event WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
@@ -1369,6 +1404,8 @@ class DBAPI(DbGeneric):
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_media_data(self, key): def _get_raw_media_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM media WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM media WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
@@ -1381,6 +1418,8 @@ class DBAPI(DbGeneric):
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_place_data(self, key): def _get_raw_place_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM place WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM place WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
@@ -1393,18 +1432,24 @@ class DBAPI(DbGeneric):
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_repository_data(self, key): def _get_raw_repository_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM repository WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM repository WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_repository_from_id_data(self, key): def _get_raw_repository_from_id_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM repository WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM repository WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_note_data(self, key): def _get_raw_note_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM note WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM note WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:
@@ -1417,6 +1462,8 @@ class DBAPI(DbGeneric):
return pickle.loads(row[0]) return pickle.loads(row[0])
def _get_raw_tag_data(self, key): def _get_raw_tag_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
self.dbapi.execute("SELECT blob_data FROM tag WHERE handle = ?", [key]) self.dbapi.execute("SELECT blob_data FROM tag WHERE handle = ?", [key])
row = self.dbapi.fetchone() row = self.dbapi.fetchone()
if row: if row:

View File

@@ -128,39 +128,39 @@ class DictionaryDb(DbGeneric):
def get_person_handles(self, sort_handles=False): def get_person_handles(self, sort_handles=False):
## Fixme: implement sort ## Fixme: implement sort
return self._person_dict.keys() return [bytes(key, "utf-8") for key in self._person_dict.keys()]
def get_family_handles(self): def get_family_handles(self):
return self._family_dict.keys() return [bytes(key, "utf-8") for key in self._family_dict.keys()]
def get_event_handles(self): def get_event_handles(self):
return self._event_dict.keys() return [bytes(key, "utf-8") for key in self._event_dict.keys()]
def get_citation_handles(self, sort_handles=False): def get_citation_handles(self, sort_handles=False):
## Fixme: implement sort ## Fixme: implement sort
return self._citation_dict.keys() return [bytes(key, "utf-8") for key in self._citation_dict.keys()]
def get_source_handles(self, sort_handles=False): def get_source_handles(self, sort_handles=False):
## Fixme: implement sort ## Fixme: implement sort
return self._source_dict.keys() return [bytes(key, "utf-8") for key in self._source_dict.keys()]
def get_place_handles(self, sort_handles=False): def get_place_handles(self, sort_handles=False):
## Fixme: implement sort ## Fixme: implement sort
return self._place_dict.keys() return [bytes(key, "utf-8") for key in self._place_dict.keys()]
def get_repository_handles(self): def get_repository_handles(self):
return self._repository_dict.keys() return [bytes(key, "utf-8") for key in self._repository_dict.keys()]
def get_media_handles(self, sort_handles=False): def get_media_handles(self, sort_handles=False):
## Fixme: implement sort ## Fixme: implement sort
return self._media_dict.keys() return [bytes(key, "utf-8") for key in self._media_dict.keys()]
def get_note_handles(self): def get_note_handles(self):
return self._note_dict.keys() return [bytes(key, "utf-8") for key in self._note_dict.keys()]
def get_tag_handles(self, sort_handles=False): def get_tag_handles(self, sort_handles=False):
# FIXME: implement sort # FIXME: implement sort
return self._tag_dict.keys() return [bytes(key, "utf-8") for key in self._tag_dict.keys()]
def get_tag_from_name(self, name): def get_tag_from_name(self, name):
return self._tag_name_dict.get(name, None) return self._tag_name_dict.get(name, None)
@@ -636,6 +636,8 @@ class DictionaryDb(DbGeneric):
result_list = list(find_backlink_handles(handle)) result_list = list(find_backlink_handles(handle))
""" """
if isinstance(handle, bytes):
key = str(handle, "utf-8")
#self._reference_list = [[obj.handle, #self._reference_list = [[obj.handle,
# obj.__class__.__name__, # obj.__class__.__name__,
# ref_handle, # ref_handle,
@@ -656,34 +658,34 @@ class DictionaryDb(DbGeneric):
return list(self._person_dict.values())[0] return list(self._person_dict.values())[0]
def iter_person_handles(self): def iter_person_handles(self):
return (handle for handle in self._person_dict.keys()) return (bytes(handle, "utf-8") for handle in self._person_dict.keys())
def iter_family_handles(self): def iter_family_handles(self):
return (handle for handle in self._family_dict.keys()) return (bytes(handle, "utf-8") for handle in self._family_dict.keys())
def iter_citation_handles(self): def iter_citation_handles(self):
return (key for key in self._citation_dict.keys()) return (bytes(key, "utf-8") for key in self._citation_dict.keys())
def iter_event_handles(self): def iter_event_handles(self):
return (key for key in self._event_dict.keys()) return (bytes(key, "utf-8") for key in self._event_dict.keys())
def iter_media_handles(self): def iter_media_handles(self):
return (key for key in self._media_dict.keys()) return (bytes(key, "utf-8") for key in self._media_dict.keys())
def iter_note_handles(self): def iter_note_handles(self):
return (key for key in self._note_dict.keys()) return (bytes(key, "utf-8") for key in self._note_dict.keys())
def iter_place_handles(self): def iter_place_handles(self):
return (key for key in self._place_dict.keys()) return (bytes(key, "utf-8") for key in self._place_dict.keys())
def iter_repository_handles(self): def iter_repository_handles(self):
return (key for key in self._repository_dict.keys()) return (bytes(key, "utf-8") for key in self._repository_dict.keys())
def iter_source_handles(self): def iter_source_handles(self):
return (key for key in self._source_dict.keys()) return (bytes(key, "utf-8") for key in self._source_dict.keys())
def iter_tag_handles(self): def iter_tag_handles(self):
return (key for key in self._tag_dict.keys()) return (bytes(key, "utf-8") for key in self._tag_dict.keys())
def reindex_reference_map(self, callback): def reindex_reference_map(self, callback):
callback(4) callback(4)
@@ -723,33 +725,53 @@ class DictionaryDb(DbGeneric):
self.surname_list = self.build_surname_list() self.surname_list = self.build_surname_list()
def has_handle_for_person(self, key): def has_handle_for_person(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._person_dict return key in self._person_dict
def has_handle_for_family(self, key): def has_handle_for_family(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._family_dict return key in self._family_dict
def has_handle_for_source(self, key): def has_handle_for_source(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._source_dict return key in self._source_dict
def has_handle_for_citation(self, key): def has_handle_for_citation(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._citation_dict return key in self._citation_dict
def has_handle_for_event(self, key): def has_handle_for_event(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._event_dict return key in self._event_dict
def has_handle_for_media(self, key): def has_handle_for_media(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._media_dict return key in self._media_dict
def has_handle_for_place(self, key): def has_handle_for_place(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._place_dict return key in self._place_dict
def has_handle_for_repository(self, key): def has_handle_for_repository(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._repository_dict return key in self._repository_dict
def has_handle_for_note(self, key): def has_handle_for_note(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._note_dict return key in self._note_dict
def has_handle_for_tag(self, key): def has_handle_for_tag(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
return key in self._tag_dict return key in self._tag_dict
def has_gramps_id_for_person(self, key): def has_gramps_id_for_person(self, key):
@@ -807,6 +829,8 @@ class DictionaryDb(DbGeneric):
return [x.gramps_id for x in self._note_dict.values()] return [x.gramps_id for x in self._note_dict.values()]
def _get_raw_person_data(self, key): def _get_raw_person_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._person_dict: if key in self._person_dict:
return self._person_dict[key].serialize() return self._person_dict[key].serialize()
@@ -815,6 +839,8 @@ class DictionaryDb(DbGeneric):
return self._person_id_dict[key].serialize() return self._person_id_dict[key].serialize()
def _get_raw_family_data(self, key): def _get_raw_family_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._family_dict: if key in self._family_dict:
return self._family_dict[key].serialize() return self._family_dict[key].serialize()
@@ -823,6 +849,8 @@ class DictionaryDb(DbGeneric):
return self._family_id_dict[key].serialize() return self._family_id_dict[key].serialize()
def _get_raw_source_data(self, key): def _get_raw_source_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._source_dict: if key in self._source_dict:
return self._source_dict[key].serialize() return self._source_dict[key].serialize()
@@ -831,6 +859,8 @@ class DictionaryDb(DbGeneric):
return self._source_id_dict[key].serialize() return self._source_id_dict[key].serialize()
def _get_raw_citation_data(self, key): def _get_raw_citation_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._citation_dict: if key in self._citation_dict:
return self._citation_dict[key].serialize() return self._citation_dict[key].serialize()
@@ -839,6 +869,8 @@ class DictionaryDb(DbGeneric):
return self._citation_id_dict[key].serialize() return self._citation_id_dict[key].serialize()
def _get_raw_event_data(self, key): def _get_raw_event_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._event_dict: if key in self._event_dict:
return self._event_dict[key].serialize() return self._event_dict[key].serialize()
@@ -847,6 +879,8 @@ class DictionaryDb(DbGeneric):
return self._event_id_dict[key].serialize() return self._event_id_dict[key].serialize()
def _get_raw_media_data(self, key): def _get_raw_media_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._media_dict: if key in self._media_dict:
return self._media_dict[key].serialize() return self._media_dict[key].serialize()
@@ -855,6 +889,8 @@ class DictionaryDb(DbGeneric):
return self._media_id_dict[key].serialize() return self._media_id_dict[key].serialize()
def _get_raw_place_data(self, key): def _get_raw_place_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._place_dict: if key in self._place_dict:
return self._place_dict[key].serialize() return self._place_dict[key].serialize()
@@ -863,6 +899,8 @@ class DictionaryDb(DbGeneric):
return self._place_id_dict[key].serialize() return self._place_id_dict[key].serialize()
def _get_raw_repository_data(self, key): def _get_raw_repository_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._repository_dict: if key in self._repository_dict:
return self._repository_dict[key].serialize() return self._repository_dict[key].serialize()
@@ -871,6 +909,8 @@ class DictionaryDb(DbGeneric):
return self._repository_id_dict[key].serialize() return self._repository_id_dict[key].serialize()
def _get_raw_note_data(self, key): def _get_raw_note_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._note_dict: if key in self._note_dict:
return self._note_dict[key].serialize() return self._note_dict[key].serialize()
@@ -879,6 +919,8 @@ class DictionaryDb(DbGeneric):
return self._note_id_dict[key].serialize() return self._note_id_dict[key].serialize()
def _get_raw_tag_data(self, key): def _get_raw_tag_data(self, key):
if isinstance(key, bytes):
key = str(key, "utf-8")
if key in self._tag_dict: if key in self._tag_dict:
return self._tag_dict[key].serialize() return self._tag_dict[key].serialize()