blob: 7b0857c1a6da4b0b7745142037397d89259edead [file] [log] [blame]
Skip Montanarod9683292003-02-03 15:09:03 +00001#!/usr/bin/env python
2
3"""
Skip Montanaro48f9c6d2003-10-28 16:17:54 +00004Synopsis: %(prog)s [-h|-g|-b|-r|-a] dbfile [ picklefile ]
Skip Montanarod9683292003-02-03 15:09:03 +00005
Skip Montanaroc5e5e512003-06-20 01:00:20 +00006Convert the database file given on the command line to a pickle
Skip Montanarod9683292003-02-03 15:09:03 +00007representation. 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:
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000024 import gdbm
25except ImportError:
26 gdbm = None
27try:
Skip Montanarod9683292003-02-03 15:09:03 +000028 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():
Skip Montanaroda72d932003-02-03 15:29:34 +000040 sys.stderr.write(__doc__ % globals())
Skip Montanarod9683292003-02-03 15:09:03 +000041
42def main(args):
43 try:
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000044 opts, args = getopt.getopt(args, "hbrdag",
45 ["hash", "btree", "recno", "dbm",
46 "gdbm", "anydbm"])
Skip Montanarod9683292003-02-03 15:09:03 +000047 except getopt.error:
48 usage()
49 return 1
50
51 if len(args) == 0 or len(args) > 2:
52 usage()
53 return 1
54 elif len(args) == 1:
55 dbfile = args[0]
56 pfile = sys.stdout
57 else:
58 dbfile = args[0]
59 try:
Skip Montanaroda72d932003-02-03 15:29:34 +000060 pfile = open(args[1], 'wb')
Skip Montanarod9683292003-02-03 15:09:03 +000061 except IOError:
Skip Montanaroda72d932003-02-03 15:29:34 +000062 sys.stderr.write("Unable to open %s\n" % args[1])
Skip Montanarod9683292003-02-03 15:09:03 +000063 return 1
64
65 dbopen = None
66 for opt, arg in opts:
67 if opt in ("-h", "--hash"):
68 try:
69 dbopen = bsddb.hashopen
70 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000071 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000072 return 1
73 elif opt in ("-b", "--btree"):
74 try:
75 dbopen = bsddb.btopen
76 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000077 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000078 return 1
79 elif opt in ("-r", "--recno"):
80 try:
81 dbopen = bsddb.rnopen
82 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000083 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000084 return 1
85 elif opt in ("-a", "--anydbm"):
86 try:
87 dbopen = anydbm.open
88 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000089 sys.stderr.write("anydbm module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000090 return 1
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000091 elif opt in ("-g", "--gdbm"):
92 try:
93 dbopen = gdbm.open
94 except AttributeError:
95 sys.stderr.write("gdbm module unavailable.\n")
96 return 1
Skip Montanarod9683292003-02-03 15:09:03 +000097 elif opt in ("-d", "--dbm"):
98 try:
99 dbopen = dbm.open
100 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +0000101 sys.stderr.write("dbm module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +0000102 return 1
103 if dbopen is None:
104 if bsddb is None:
Skip Montanaroda72d932003-02-03 15:29:34 +0000105 sys.stderr.write("bsddb module unavailable - ")
106 sys.stderr.write("must specify dbtype.\n")
Skip Montanarod9683292003-02-03 15:09:03 +0000107 return 1
108 else:
109 dbopen = bsddb.hashopen
110
111 try:
112 db = dbopen(dbfile, 'r')
113 except bsddb.error:
Skip Montanaroda72d932003-02-03 15:29:34 +0000114 sys.stderr.write("Unable to open %s. " % dbfile)
115 sys.stderr.write("Check for format or version mismatch.\n")
Skip Montanarod9683292003-02-03 15:09:03 +0000116 return 1
Tim Peters0eadaac2003-04-24 16:02:54 +0000117
Skip Montanarod9683292003-02-03 15:09:03 +0000118 for k in db.keys():
119 pickle.dump((k, db[k]), pfile, 1==1)
120
121 db.close()
122 pfile.close()
123
124 return 0
125
126if __name__ == "__main__":
127 sys.exit(main(sys.argv[1:]))