blob: eaa45da34a521699b7a0db87e0f0a12313963ce7 [file] [log] [blame]
Skip Montanaro9db49c82003-02-03 15:08:42 +00001#!/usr/bin/env python
2
3"""
4Synopsis: %(prog)s [-h|-b|-r|-a|-d] dbfile [ picklefile ]
5
6Read the given picklefile as a series of key/value pairs and write to a new
7bsddb database. If the database already exists, any contents are deleted.
8The optional flags indicate the type of the database (bsddb hash, bsddb
9btree, bsddb recno, anydbm, dbm). The default is hash. If a pickle file is
10named it is opened for read access. If no pickle file is named, the pickle
11input is read from standard input.
12
13Note that recno databases can only contain numeric keys, so you can't dump a
14hash or btree database using bsddb2pickle.py and reconstitute it to a recno
15database with %(prog)s.
16"""
17
18import getopt
19try:
20 import bsddb
21except ImportError:
22 bsddb = None
23try:
24 import dbm
25except ImportError:
26 dbm = None
27try:
28 import anydbm
29except ImportError:
30 anydbm = None
31import sys
32try:
33 import cPickle as pickle
34except ImportError:
35 import pickle
36
37prog = sys.argv[0]
38
39def usage():
40 print >> sys.stderr, __doc__ % globals()
41
42def 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
126if __name__ == "__main__":
127 sys.exit(main(sys.argv[1:]))