Remove low-level bsddb backup code
This commit is contained in:
parent
5dd88052cf
commit
6098ccd468
@ -1,74 +0,0 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2007 Donald N. Allingham
|
||||
# Copyright (C) 2011 Tim G L Lyons
|
||||
#
|
||||
# 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
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# gen/db/backup.py
|
||||
|
||||
"""
|
||||
Description
|
||||
===========
|
||||
|
||||
This module Provides backup and restore functions for a database. The
|
||||
backup function saves the data into backup files, while the restore
|
||||
function loads the data back into a database.
|
||||
|
||||
You should only restore the data into an empty database.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Not all of the database tables need to be backed up, since many are
|
||||
automatically generated from the others. The tables that are backed up
|
||||
are the primary tables and the metadata table.
|
||||
|
||||
The database consists of a table of "pickled" tuples. Each of the
|
||||
primary tables is "walked", and the pickled tuple is extracted, and
|
||||
written to the backup file.
|
||||
|
||||
Restoring the data is just as simple. The backup file is parsed an
|
||||
entry at a time, and inserted into the associated database table. The
|
||||
derived tables are built automatically as the items are entered into
|
||||
db.
|
||||
"""
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# load standard python libraries
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import os
|
||||
import pickle
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Gramps libs
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
from gramps.gen.db.exceptions import DbException
|
||||
from .write import FAMILY_TBL, PLACES_TBL, SOURCES_TBL, MEDIA_TBL, \
|
||||
EVENTS_TBL, PERSON_TBL, REPO_TBL, NOTE_TBL, TAG_TBL, META, CITATIONS_TBL
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Set up logging
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
import logging
|
||||
LOG = logging.getLogger(".Backup")
|
||||
|
@ -2462,38 +2462,6 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
"""
|
||||
return self.brief_name
|
||||
|
||||
def backup(self, user=None):
|
||||
"""
|
||||
Exports the database to a set of backup files. These files consist
|
||||
of the pickled database tables, one file for each table.
|
||||
|
||||
The heavy lifting is done by the private :py:func:`__do__export` function.
|
||||
The purpose of this function is to catch any exceptions that occur.
|
||||
|
||||
:param database: database instance to backup
|
||||
:type database: DbDir
|
||||
"""
|
||||
try:
|
||||
do_export(self)
|
||||
except (OSError, IOError) as msg:
|
||||
raise DbException(str(msg))
|
||||
|
||||
def restore(self):
|
||||
"""
|
||||
Restores the database to a set of backup files. These files consist
|
||||
of the pickled database tables, one file for each table.
|
||||
|
||||
The heavy lifting is done by the private :py:func:`__do__restore` function.
|
||||
The purpose of this function is to catch any exceptions that occur.
|
||||
|
||||
:param database: database instance to restore
|
||||
:type database: DbDir
|
||||
"""
|
||||
try:
|
||||
do_restore(self)
|
||||
except (OSError, IOError) as msg:
|
||||
raise DbException(str(msg))
|
||||
|
||||
def get_summary(self):
|
||||
"""
|
||||
Returns dictionary of summary item.
|
||||
@ -2527,113 +2495,6 @@ class DbBsddb(DbBsddbRead, DbWriteBase, UpdateCallback):
|
||||
_("Database db version"): bsddb_version,
|
||||
}
|
||||
|
||||
def mk_backup_name(database, base):
|
||||
"""
|
||||
Return the backup name of the database table
|
||||
|
||||
:param database: database instance
|
||||
:type database: DbDir
|
||||
:param base: base name of the table
|
||||
:type base: str
|
||||
"""
|
||||
return os.path.join(database.get_save_path(), base + ".gbkp")
|
||||
|
||||
def mk_tmp_name(database, base):
|
||||
"""
|
||||
Return the temporary backup name of the database table
|
||||
|
||||
:param database: database instance
|
||||
:type database: DbDir
|
||||
:param base: base name of the table
|
||||
:type base: str
|
||||
"""
|
||||
return os.path.join(database.get_save_path(), base + ".gbkp.new")
|
||||
|
||||
def do_export(database):
|
||||
"""
|
||||
Loop through each table of the database, saving the pickled data
|
||||
a file.
|
||||
|
||||
:param database: database instance to backup
|
||||
:type database: DbDir
|
||||
"""
|
||||
try:
|
||||
for (base, tbl) in build_tbl_map(database):
|
||||
backup_name = mk_tmp_name(database, base)
|
||||
with open(backup_name, 'wb') as backup_table:
|
||||
|
||||
cursor = tbl.cursor()
|
||||
data = cursor.first()
|
||||
while data:
|
||||
pickle.dump(data, backup_table, 2)
|
||||
data = cursor.next()
|
||||
cursor.close()
|
||||
except (IOError,OSError):
|
||||
return
|
||||
|
||||
for (base, tbl) in build_tbl_map(database):
|
||||
new_name = mk_backup_name(database, base)
|
||||
old_name = mk_tmp_name(database, base)
|
||||
if os.path.isfile(new_name):
|
||||
os.unlink(new_name)
|
||||
os.rename(old_name, new_name)
|
||||
|
||||
def do_restore(database):
|
||||
"""
|
||||
Loop through each table of the database, restoring the pickled data
|
||||
to the appropriate database file.
|
||||
|
||||
:param database: database instance to backup
|
||||
:type database: DbDir
|
||||
"""
|
||||
for (base, tbl) in build_tbl_map(database):
|
||||
backup_name = mk_backup_name(database, base)
|
||||
with open(backup_name, 'rb') as backup_table:
|
||||
load_tbl_txn(database, backup_table, tbl)
|
||||
|
||||
database.rebuild_secondary()
|
||||
|
||||
def load_tbl_txn(database, backup_table, tbl):
|
||||
"""
|
||||
Return the temporary backup name of the database table
|
||||
|
||||
:param database: database instance
|
||||
:type database: DbDir
|
||||
:param backup_table: file containing the backup data
|
||||
:type backup_table: file
|
||||
:param tbl: Berkeley db database table
|
||||
:type tbl: Berkeley db database table
|
||||
"""
|
||||
try:
|
||||
while True:
|
||||
data = pickle.load(backup_table)
|
||||
txn = database.env.txn_begin()
|
||||
tbl.put(data[0], data[1], txn=txn)
|
||||
txn.commit()
|
||||
except EOFError:
|
||||
backup_table.close()
|
||||
|
||||
def build_tbl_map(database):
|
||||
"""
|
||||
Builds a table map of names to database tables.
|
||||
|
||||
:param database: database instance to backup
|
||||
:type database: DbDir
|
||||
"""
|
||||
return [
|
||||
( PERSON_TBL, database.person_map.db),
|
||||
( FAMILY_TBL, database.family_map.db),
|
||||
( PLACES_TBL, database.place_map.db),
|
||||
( SOURCES_TBL, database.source_map.db),
|
||||
( CITATIONS_TBL, database.citation_map.db),
|
||||
( REPO_TBL, database.repository_map.db),
|
||||
( NOTE_TBL, database.note_map.db),
|
||||
( MEDIA_TBL, database.media_map.db),
|
||||
( EVENTS_TBL, database.event_map.db),
|
||||
( TAG_TBL, database.tag_map.db),
|
||||
( META, database.metadata.db),
|
||||
]
|
||||
|
||||
def _mkname(path, name):
|
||||
return os.path.join(path, name + DBEXT)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user