1 | #!/usr/bin/env python
|
---|
2 |
|
---|
3 | """
|
---|
4 | Synopsis: %(prog)s [-h|-g|-b|-r|-a] dbfile [ picklefile ]
|
---|
5 |
|
---|
6 | Convert the database file given on the command line to a pickle
|
---|
7 | representation. 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 |
|
---|
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.
|
---|
19 |
|
---|
20 | """
|
---|
21 |
|
---|
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
|
---|
44 |
|
---|
45 | prog = sys.argv[0]
|
---|
46 |
|
---|
47 | def usage():
|
---|
48 | sys.stderr.write(__doc__ % globals())
|
---|
49 |
|
---|
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
|
---|
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:
|
---|
68 | pfile = open(args[1], 'wb')
|
---|
69 | except IOError:
|
---|
70 | sys.stderr.write("Unable to open %s\n" % args[1])
|
---|
71 | 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:
|
---|
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
|
---|
118 |
|
---|
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
|
---|
125 |
|
---|
126 | 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 |
|
---|
134 | if __name__ == "__main__":
|
---|
135 | sys.exit(main(sys.argv[1:]))
|
---|