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()
|