Remove low-level bsddb backup code
This commit is contained in:
		@@ -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)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user