aboutsummaryrefslogtreecommitdiff
blob: 85d5829f39bb7d8f7b4079189d5cefd8be37626f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# Copyright 2020-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import logging
import pickle
import shelve

logger = logging.getLogger(__name__)


def open_shelve(db_file, flag="r"):
    """
    The optional flag parameter has the same interpretation as the flag
    parameter of dbm.open()
    """
    try:
        db = shelve.open(db_file, flag=flag)
    except ImportError as e:
        # ImportError has different attributes for python2 vs. python3
        if getattr(e, "name", None) == "bsddb" or getattr(e, "message", None) in (
            "No module named bsddb",
            "No module named _bsddb",
        ):
            from bsddb3 import dbshelve

            db = dbshelve.open(db_file)
        else:
            raise

    return db


def dump(args):
    src = open_shelve(args.src, flag="r")
    try:
        with open(args.dest, "wb") as dest:
            for key in src:
                try:
                    value = src[key]
                except KeyError:
                    logger.exception(key)
                    continue
                pickle.dump((key, value), dest)
    finally:
        src.close()


def restore(args):
    dest = open_shelve(args.dest, flag="c")
    try:
        with open(args.src, "rb") as src:
            while True:
                try:
                    k, v = pickle.load(src)
                except EOFError:
                    break
                else:
                    dest[k] = v
    finally:
        dest.close()