1 | #!/usr/bin/env python
|
---|
2 |
|
---|
3 | """
|
---|
4 | Synopsis: %(prog)s [-h|-b|-g|-r|-a|-d] [ picklefile ] dbfile
|
---|
5 |
|
---|
6 | Read the given picklefile as a series of key/value pairs and write to a new
|
---|
7 | database. If the database already exists, any contents are deleted. The
|
---|
8 | optional flags indicate the type of the output database:
|
---|
9 |
|
---|
10 | -a - open using anydbm
|
---|
11 | -b - open as bsddb btree file
|
---|
12 | -d - open as dbm file
|
---|
13 | -g - open as gdbm file
|
---|
14 | -h - open as bsddb hash file
|
---|
15 | -r - open as bsddb recno file
|
---|
16 |
|
---|
17 | The default is hash. If a pickle file is named it is opened for read
|
---|
18 | access. If no pickle file is named, the pickle input is read from standard
|
---|
19 | input.
|
---|
20 |
|
---|
21 | Note that recno databases can only contain integer keys, so you can't dump a
|
---|
22 | hash or btree database using db2pickle.py and reconstitute it to a recno
|
---|
23 | database with %(prog)s unless your keys are integers.
|
---|
24 |
|
---|
25 | """
|
---|
26 |
|
---|
27 | import getopt
|
---|
28 | try:
|
---|
29 | import bsddb
|
---|
30 | except ImportError:
|
---|
31 | bsddb = None
|
---|
32 | try:
|
---|
33 | import dbm
|
---|
34 | except ImportError:
|
---|
35 | dbm = None
|
---|
36 | try:
|
---|
37 | import gdbm
|
---|
38 | except ImportError:
|
---|
39 | gdbm = None
|
---|
40 | try:
|
---|
41 | import anydbm
|
---|
42 | except ImportError:
|
---|
43 | anydbm = None
|
---|
44 | import sys
|
---|
45 | try:
|
---|
46 | import cPickle as pickle
|
---|
47 | except ImportError:
|
---|
48 | import pickle
|
---|
49 |
|
---|
50 | prog = sys.argv[0]
|
---|
51 |
|
---|
52 | def usage():
|
---|
53 | sys.stderr.write(__doc__ % globals())
|
---|
54 |
|
---|
55 | def main(args):
|
---|
56 | try:
|
---|
57 | opts, args = getopt.getopt(args, "hbrdag",
|
---|
58 | ["hash", "btree", "recno", "dbm", "anydbm",
|
---|
59 | "gdbm"])
|
---|
60 | except getopt.error:
|
---|
61 | usage()
|
---|
62 | return 1
|
---|
63 |
|
---|
64 | if len(args) == 0 or len(args) > 2:
|
---|
65 | usage()
|
---|
66 | return 1
|
---|
67 | elif len(args) == 1:
|
---|
68 | pfile = sys.stdin
|
---|
69 | dbfile = args[0]
|
---|
70 | else:
|
---|
71 | try:
|
---|
72 | pfile = open(args[0], 'rb')
|
---|
73 | except IOError:
|
---|
74 | sys.stderr.write("Unable to open %s\n" % args[0])
|
---|
75 | return 1
|
---|
76 | dbfile = args[1]
|
---|
77 |
|
---|
78 | dbopen = None
|
---|
79 | for opt, arg in opts:
|
---|
80 | if opt in ("-h", "--hash"):
|
---|
81 | try:
|
---|
82 | dbopen = bsddb.hashopen
|
---|
83 | except AttributeError:
|
---|
84 | sys.stderr.write("bsddb module unavailable.\n")
|
---|
85 | return 1
|
---|
86 | elif opt in ("-b", "--btree"):
|
---|
87 | try:
|
---|
88 | dbopen = bsddb.btopen
|
---|
89 | except AttributeError:
|
---|
90 | sys.stderr.write("bsddb module unavailable.\n")
|
---|
91 | return 1
|
---|
92 | elif opt in ("-r", "--recno"):
|
---|
93 | try:
|
---|
94 | dbopen = bsddb.rnopen
|
---|
95 | except AttributeError:
|
---|
96 | sys.stderr.write("bsddb module unavailable.\n")
|
---|
97 | return 1
|
---|
98 | elif opt in ("-a", "--anydbm"):
|
---|
99 | try:
|
---|
100 | dbopen = anydbm.open
|
---|
101 | except AttributeError:
|
---|
102 | sys.stderr.write("anydbm module unavailable.\n")
|
---|
103 | return 1
|
---|
104 | elif opt in ("-g", "--gdbm"):
|
---|
105 | try:
|
---|
106 | dbopen = gdbm.open
|
---|
107 | except AttributeError:
|
---|
108 | sys.stderr.write("gdbm module unavailable.\n")
|
---|
109 | return 1
|
---|
110 | elif opt in ("-d", "--dbm"):
|
---|
111 | try:
|
---|
112 | dbopen = dbm.open
|
---|
113 | except AttributeError:
|
---|
114 | sys.stderr.write("dbm module unavailable.\n")
|
---|
115 | return 1
|
---|
116 | if dbopen is None:
|
---|
117 | if bsddb is None:
|
---|
118 | sys.stderr.write("bsddb module unavailable - ")
|
---|
119 | sys.stderr.write("must specify dbtype.\n")
|
---|
120 | return 1
|
---|
121 | else:
|
---|
122 | dbopen = bsddb.hashopen
|
---|
123 |
|
---|
124 | try:
|
---|
125 | db = dbopen(dbfile, 'c')
|
---|
126 | except bsddb.error:
|
---|
127 | sys.stderr.write("Unable to open %s. " % dbfile)
|
---|
128 | sys.stderr.write("Check for format or version mismatch.\n")
|
---|
129 | return 1
|
---|
130 | else:
|
---|
131 | for k in db.keys():
|
---|
132 | del db[k]
|
---|
133 |
|
---|
134 | while 1:
|
---|
135 | try:
|
---|
136 | (key, val) = pickle.load(pfile)
|
---|
137 | except EOFError:
|
---|
138 | break
|
---|
139 | db[key] = val
|
---|
140 |
|
---|
141 | db.close()
|
---|
142 | pfile.close()
|
---|
143 |
|
---|
144 | return 0
|
---|
145 |
|
---|
146 | if __name__ == "__main__":
|
---|
147 | sys.exit(main(sys.argv[1:]))
|
---|