blob: ab40ca75c89a2a926f19e1b8685bd3a2d7f180cb [file] [log] [blame]
Skip Montanarod9683292003-02-03 15:09:03 +00001#!/usr/bin/env python
2
3"""
4Synopsis: %(prog)s [-h|-b|-r] dbfile [ picklefile ]
5
6Convert the bsddb database file given on the command like to a pickle
7representation. The optional flags indicate the type of the database (hash,
8btree, recno). The default is hash. If a pickle file is named it is opened
9for write access (deleting any existing data). If no pickle file is named,
10the pickle output is written to standard output.
11
12"""
13
14import getopt
15try:
16 import bsddb
17except ImportError:
18 bsddb = None
19try:
20 import dbm
21except ImportError:
22 dbm = None
23try:
24 import anydbm
25except ImportError:
26 anydbm = None
27import sys
28try:
29 import cPickle as pickle
30except ImportError:
31 import pickle
32
33prog = sys.argv[0]
34
35def usage():
Skip Montanaroda72d932003-02-03 15:29:34 +000036 sys.stderr.write(__doc__ % globals())
Skip Montanarod9683292003-02-03 15:09:03 +000037
38def main(args):
39 try:
40 opts, args = getopt.getopt(args, "hbrda",
41 ["hash", "btree", "recno", "dbm", "anydbm"])
42 except getopt.error:
43 usage()
44 return 1
45
46 if len(args) == 0 or len(args) > 2:
47 usage()
48 return 1
49 elif len(args) == 1:
50 dbfile = args[0]
51 pfile = sys.stdout
52 else:
53 dbfile = args[0]
54 try:
Skip Montanaroda72d932003-02-03 15:29:34 +000055 pfile = open(args[1], 'wb')
Skip Montanarod9683292003-02-03 15:09:03 +000056 except IOError:
Skip Montanaroda72d932003-02-03 15:29:34 +000057 sys.stderr.write("Unable to open %s\n" % args[1])
Skip Montanarod9683292003-02-03 15:09:03 +000058 return 1
59
60 dbopen = None
61 for opt, arg in opts:
62 if opt in ("-h", "--hash"):
63 try:
64 dbopen = bsddb.hashopen
65 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000066 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000067 return 1
68 elif opt in ("-b", "--btree"):
69 try:
70 dbopen = bsddb.btopen
71 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000072 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000073 return 1
74 elif opt in ("-r", "--recno"):
75 try:
76 dbopen = bsddb.rnopen
77 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000078 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000079 return 1
80 elif opt in ("-a", "--anydbm"):
81 try:
82 dbopen = anydbm.open
83 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000084 sys.stderr.write("anydbm module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000085 return 1
86 elif opt in ("-d", "--dbm"):
87 try:
88 dbopen = dbm.open
89 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000090 sys.stderr.write("dbm module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000091 return 1
92 if dbopen is None:
93 if bsddb is None:
Skip Montanaroda72d932003-02-03 15:29:34 +000094 sys.stderr.write("bsddb module unavailable - ")
95 sys.stderr.write("must specify dbtype.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000096 return 1
97 else:
98 dbopen = bsddb.hashopen
99
100 try:
101 db = dbopen(dbfile, 'r')
102 except bsddb.error:
Skip Montanaroda72d932003-02-03 15:29:34 +0000103 sys.stderr.write("Unable to open %s. " % dbfile)
104 sys.stderr.write("Check for format or version mismatch.\n")
Skip Montanarod9683292003-02-03 15:09:03 +0000105 return 1
Tim Peters0eadaac2003-04-24 16:02:54 +0000106
Skip Montanarod9683292003-02-03 15:09:03 +0000107 for k in db.keys():
108 pickle.dump((k, db[k]), pfile, 1==1)
109
110 db.close()
111 pfile.close()
112
113 return 0
114
115if __name__ == "__main__":
116 sys.exit(main(sys.argv[1:]))