Issue #7117, continued: Remove substitution of %g-style formatting for
[python.git] / Tools / scripts / db2pickle.py
blob795011b62d9bec89c716c342850b5a0e8e980d06
1 #!/usr/bin/env python
3 """
4 Synopsis: %(prog)s [-h|-g|-b|-r|-a] dbfile [ picklefile ]
6 Convert the database file given on the command line to a pickle
7 representation. The optional flags indicate the type of the database:
9 -a - open using anydbm
10 -b - open as bsddb btree file
11 -d - open as dbm file
12 -g - open as gdbm file
13 -h - open as bsddb hash file
14 -r - open as bsddb recno file
16 The default is hash. If a pickle file is named it is opened for write
17 access (deleting any existing data). If no pickle file is named, the pickle
18 output is written to standard output.
20 """
22 import getopt
23 try:
24 import bsddb
25 except ImportError:
26 bsddb = None
27 try:
28 import dbm
29 except ImportError:
30 dbm = None
31 try:
32 import gdbm
33 except ImportError:
34 gdbm = None
35 try:
36 import anydbm
37 except ImportError:
38 anydbm = None
39 import sys
40 try:
41 import cPickle as pickle
42 except ImportError:
43 import pickle
45 prog = sys.argv[0]
47 def usage():
48 sys.stderr.write(__doc__ % globals())
50 def main(args):
51 try:
52 opts, args = getopt.getopt(args, "hbrdag",
53 ["hash", "btree", "recno", "dbm",
54 "gdbm", "anydbm"])
55 except getopt.error:
56 usage()
57 return 1
59 if len(args) == 0 or len(args) > 2:
60 usage()
61 return 1
62 elif len(args) == 1:
63 dbfile = args[0]
64 pfile = sys.stdout
65 else:
66 dbfile = args[0]
67 try:
68 pfile = open(args[1], 'wb')
69 except IOError:
70 sys.stderr.write("Unable to open %s\n" % args[1])
71 return 1
73 dbopen = None
74 for opt, arg in opts:
75 if opt in ("-h", "--hash"):
76 try:
77 dbopen = bsddb.hashopen
78 except AttributeError:
79 sys.stderr.write("bsddb module unavailable.\n")
80 return 1
81 elif opt in ("-b", "--btree"):
82 try:
83 dbopen = bsddb.btopen
84 except AttributeError:
85 sys.stderr.write("bsddb module unavailable.\n")
86 return 1
87 elif opt in ("-r", "--recno"):
88 try:
89 dbopen = bsddb.rnopen
90 except AttributeError:
91 sys.stderr.write("bsddb module unavailable.\n")
92 return 1
93 elif opt in ("-a", "--anydbm"):
94 try:
95 dbopen = anydbm.open
96 except AttributeError:
97 sys.stderr.write("anydbm module unavailable.\n")
98 return 1
99 elif opt in ("-g", "--gdbm"):
100 try:
101 dbopen = gdbm.open
102 except AttributeError:
103 sys.stderr.write("gdbm module unavailable.\n")
104 return 1
105 elif opt in ("-d", "--dbm"):
106 try:
107 dbopen = dbm.open
108 except AttributeError:
109 sys.stderr.write("dbm module unavailable.\n")
110 return 1
111 if dbopen is None:
112 if bsddb is None:
113 sys.stderr.write("bsddb module unavailable - ")
114 sys.stderr.write("must specify dbtype.\n")
115 return 1
116 else:
117 dbopen = bsddb.hashopen
119 try:
120 db = dbopen(dbfile, 'r')
121 except bsddb.error:
122 sys.stderr.write("Unable to open %s. " % dbfile)
123 sys.stderr.write("Check for format or version mismatch.\n")
124 return 1
126 for k in db.keys():
127 pickle.dump((k, db[k]), pfile, 1==1)
129 db.close()
130 pfile.close()
132 return 0
134 if __name__ == "__main__":
135 sys.exit(main(sys.argv[1:]))