Skip to content

Commit 9db49c8

Browse files
author
Skip Montanaro
committed
convert pickles generated by db2pickle.py back to database files
1 parent 4c6c9c4 commit 9db49c8

1 file changed

Lines changed: 127 additions & 0 deletions

File tree

Tools/scripts/pickle2db.py

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
Synopsis: %(prog)s [-h|-b|-r|-a|-d] dbfile [ picklefile ]
5+
6+
Read the given picklefile as a series of key/value pairs and write to a new
7+
bsddb database. If the database already exists, any contents are deleted.
8+
The optional flags indicate the type of the database (bsddb hash, bsddb
9+
btree, bsddb recno, anydbm, dbm). The default is hash. If a pickle file is
10+
named it is opened for read access. If no pickle file is named, the pickle
11+
input is read from standard input.
12+
13+
Note that recno databases can only contain numeric keys, so you can't dump a
14+
hash or btree database using bsddb2pickle.py and reconstitute it to a recno
15+
database with %(prog)s.
16+
"""
17+
18+
import getopt
19+
try:
20+
import bsddb
21+
except ImportError:
22+
bsddb = None
23+
try:
24+
import dbm
25+
except ImportError:
26+
dbm = None
27+
try:
28+
import anydbm
29+
except ImportError:
30+
anydbm = None
31+
import sys
32+
try:
33+
import cPickle as pickle
34+
except ImportError:
35+
import pickle
36+
37+
prog = sys.argv[0]
38+
39+
def usage():
40+
print >> sys.stderr, __doc__ % globals()
41+
42+
def main(args):
43+
try:
44+
opts, args = getopt.getopt(args, "hbrda",
45+
["hash", "btree", "recno", "dbm", "anydbm"])
46+
except getopt.error:
47+
usage()
48+
return 1
49+
50+
if len(args) == 0 or len(args) > 2:
51+
usage()
52+
return 1
53+
elif len(args) == 1:
54+
dbfile = args[0]
55+
pfile = sys.stdin
56+
else:
57+
dbfile = args[0]
58+
try:
59+
pfile = file(args[1], 'rb')
60+
except IOError:
61+
print >> sys.stderr, "Unable to open", args[1]
62+
return 1
63+
64+
dbopen = None
65+
for opt, arg in opts:
66+
if opt in ("-h", "--hash"):
67+
try:
68+
dbopen = bsddb.hashopen
69+
except AttributeError:
70+
print >> sys.stderr, "bsddb module unavailable."
71+
return 1
72+
elif opt in ("-b", "--btree"):
73+
try:
74+
dbopen = bsddb.btopen
75+
except AttributeError:
76+
print >> sys.stderr, "bsddb module unavailable."
77+
return 1
78+
elif opt in ("-r", "--recno"):
79+
try:
80+
dbopen = bsddb.rnopen
81+
except AttributeError:
82+
print >> sys.stderr, "bsddb module unavailable."
83+
return 1
84+
elif opt in ("-a", "--anydbm"):
85+
try:
86+
dbopen = anydbm.open
87+
except AttributeError:
88+
print >> sys.stderr, "anydbm module unavailable."
89+
return 1
90+
elif opt in ("-d", "--dbm"):
91+
try:
92+
dbopen = dbm.open
93+
except AttributeError:
94+
print >> sys.stderr, "dbm module unavailable."
95+
return 1
96+
if dbopen is None:
97+
if bsddb is None:
98+
print >> sys.stderr, "bsddb module unavailable -"
99+
print >> sys.stderr, "must specify dbtype."
100+
return 1
101+
else:
102+
dbopen = bsddb.hashopen
103+
104+
try:
105+
db = dbopen(dbfile, 'c')
106+
except bsddb.error:
107+
print >> sys.stderr, "Unable to open", dbfile,
108+
print >> sys.stderr, "Check for format or version mismatch."
109+
return 1
110+
else:
111+
for k in db.keys():
112+
del db[k]
113+
114+
while 1:
115+
try:
116+
(key, val) = pickle.load(pfile)
117+
except EOFError:
118+
break
119+
db[key] = val
120+
121+
db.close()
122+
pfile.close()
123+
124+
return 0
125+
126+
if __name__ == "__main__":
127+
sys.exit(main(sys.argv[1:]))

0 commit comments

Comments
 (0)