blob: 795011b62d9bec89c716c342850b5a0e8e980d06 [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 Montanaroe2b61e02004-03-03 17:42:08 +00007representation. The optional flags indicate the type of the database:
8
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
15
16The default is hash. If a pickle file is named it is opened for write
17access (deleting any existing data). If no pickle file is named, the pickle
18output is written to standard output.
Skip Montanarod9683292003-02-03 15:09:03 +000019
20"""
21
22import getopt
23try:
24 import bsddb
25except ImportError:
26 bsddb = None
27try:
28 import dbm
29except ImportError:
30 dbm = None
31try:
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000032 import gdbm
33except ImportError:
34 gdbm = None
35try:
Skip Montanarod9683292003-02-03 15:09:03 +000036 import anydbm
37except ImportError:
38 anydbm = None
39import sys
40try:
41 import cPickle as pickle
42except ImportError:
43 import pickle
44
45prog = sys.argv[0]
46
47def usage():
Skip Montanaroda72d932003-02-03 15:29:34 +000048 sys.stderr.write(__doc__ % globals())
Skip Montanarod9683292003-02-03 15:09:03 +000049
50def main(args):
51 try:
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000052 opts, args = getopt.getopt(args, "hbrdag",
53 ["hash", "btree", "recno", "dbm",
54 "gdbm", "anydbm"])
Skip Montanarod9683292003-02-03 15:09:03 +000055 except getopt.error:
56 usage()
57 return 1
58
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:
Skip Montanaroda72d932003-02-03 15:29:34 +000068 pfile = open(args[1], 'wb')
Skip Montanarod9683292003-02-03 15:09:03 +000069 except IOError:
Skip Montanaroda72d932003-02-03 15:29:34 +000070 sys.stderr.write("Unable to open %s\n" % args[1])
Skip Montanarod9683292003-02-03 15:09:03 +000071 return 1
72
73 dbopen = None
74 for opt, arg in opts:
75 if opt in ("-h", "--hash"):
76 try:
77 dbopen = bsddb.hashopen
78 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000079 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000080 return 1
81 elif opt in ("-b", "--btree"):
82 try:
83 dbopen = bsddb.btopen
84 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000085 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000086 return 1
87 elif opt in ("-r", "--recno"):
88 try:
89 dbopen = bsddb.rnopen
90 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000091 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000092 return 1
93 elif opt in ("-a", "--anydbm"):
94 try:
95 dbopen = anydbm.open
96 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +000097 sys.stderr.write("anydbm module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +000098 return 1
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000099 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
Skip Montanarod9683292003-02-03 15:09:03 +0000105 elif opt in ("-d", "--dbm"):
106 try:
107 dbopen = dbm.open
108 except AttributeError:
Skip Montanaroda72d932003-02-03 15:29:34 +0000109 sys.stderr.write("dbm module unavailable.\n")
Skip Montanarod9683292003-02-03 15:09:03 +0000110 return 1
111 if dbopen is None:
112 if bsddb is None:
Skip Montanaroda72d932003-02-03 15:29:34 +0000113 sys.stderr.write("bsddb module unavailable - ")
114 sys.stderr.write("must specify dbtype.\n")
Skip Montanarod9683292003-02-03 15:09:03 +0000115 return 1
116 else:
117 dbopen = bsddb.hashopen
118
119 try:
120 db = dbopen(dbfile, 'r')
121 except bsddb.error:
Skip Montanaroda72d932003-02-03 15:29:34 +0000122 sys.stderr.write("Unable to open %s. " % dbfile)
123 sys.stderr.write("Check for format or version mismatch.\n")
Skip Montanarod9683292003-02-03 15:09:03 +0000124 return 1
Tim Peters0eadaac2003-04-24 16:02:54 +0000125
Skip Montanarod9683292003-02-03 15:09:03 +0000126 for k in db.keys():
127 pickle.dump((k, db[k]), pfile, 1==1)
128
129 db.close()
130 pfile.close()
131
132 return 0
133
134if __name__ == "__main__":
135 sys.exit(main(sys.argv[1:]))