Merged revisions 77163 via svnmerge from
[python/dscho.git] / Tools / scripts / pickle2db.py
bloba43ffae448ef09126cd382bb95e3d7cd99a8d201
1 #!/usr/bin/env python
3 """
4 Synopsis: %(prog)s [-h|-b|-g|-r|-a|-d] [ picklefile ] dbfile
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:
10 -a - open using dbm (open any supported format)
11 -b - open as bsddb btree file
12 -d - open as dbm.ndbm file
13 -g - open as dbm.gnu file
14 -h - open as bsddb hash file
15 -r - open as bsddb recno file
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.
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.
25 """
27 import getopt
28 try:
29 import bsddb
30 except ImportError:
31 bsddb = None
32 try:
33 import dbm.ndbm as dbm
34 except ImportError:
35 dbm = None
36 try:
37 import dbm.gnu as gdbm
38 except ImportError:
39 gdbm = None
40 try:
41 import dbm.ndbm as anydbm
42 except ImportError:
43 anydbm = None
44 import sys
45 try:
46 import pickle as pickle
47 except ImportError:
48 import pickle
50 prog = sys.argv[0]
52 def usage():
53 sys.stderr.write(__doc__ % globals())
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
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]
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("dbm 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("dbm.gnu 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.ndbm 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
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 list(db.keys()):
132 del db[k]
134 while 1:
135 try:
136 (key, val) = pickle.load(pfile)
137 except EOFError:
138 break
139 db[key] = val
141 db.close()
142 pfile.close()
144 return 0
146 if __name__ == "__main__":
147 sys.exit(main(sys.argv[1:]))