blob: 86545ccacda11c6cf53f1e7a5822b6361f99fb85 [file] [log] [blame]
Skip Montanaro9db49c82003-02-03 15:08:42 +00001#!/usr/bin/env python
2
3"""
Skip Montanaroe2b61e02004-03-03 17:42:08 +00004Synopsis: %(prog)s [-h|-b|-g|-r|-a|-d] [ picklefile ] dbfile
Skip Montanaro9db49c82003-02-03 15:08:42 +00005
6Read the given picklefile as a series of key/value pairs and write to a new
Skip Montanaro8df717a2003-06-20 01:01:19 +00007database. If the database already exists, any contents are deleted. The
Skip Montanaroe2b61e02004-03-03 17:42:08 +00008optional flags indicate the type of the output database:
Skip Montanaro9db49c82003-02-03 15:08:42 +00009
Skip Montanaroe2b61e02004-03-03 17:42:08 +000010 -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
17The default is hash. If a pickle file is named it is opened for read
18access. If no pickle file is named, the pickle input is read from standard
19input.
20
21Note that recno databases can only contain integer keys, so you can't dump a
Skip Montanaroea7598e2003-03-07 00:47:40 +000022hash or btree database using db2pickle.py and reconstitute it to a recno
Skip Montanaroe2b61e02004-03-03 17:42:08 +000023database with %(prog)s unless your keys are integers.
24
Skip Montanaro9db49c82003-02-03 15:08:42 +000025"""
26
27import getopt
28try:
29 import bsddb
30except ImportError:
31 bsddb = None
32try:
33 import dbm
34except ImportError:
35 dbm = None
36try:
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000037 import gdbm
38except ImportError:
39 gdbm = None
40try:
Skip Montanaro9db49c82003-02-03 15:08:42 +000041 import anydbm
42except ImportError:
43 anydbm = None
44import sys
45try:
46 import cPickle as pickle
47except ImportError:
48 import pickle
49
50prog = sys.argv[0]
51
52def usage():
Tim Peters0eadaac2003-04-24 16:02:54 +000053 sys.stderr.write(__doc__ % globals())
Skip Montanaro9db49c82003-02-03 15:08:42 +000054
55def main(args):
56 try:
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000057 opts, args = getopt.getopt(args, "hbrdag",
58 ["hash", "btree", "recno", "dbm", "anydbm",
59 "gdbm"])
Skip Montanaro9db49c82003-02-03 15:08:42 +000060 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:
Skip Montanaro9db49c82003-02-03 15:08:42 +000068 pfile = sys.stdin
Skip Montanaro9db49c82003-02-03 15:08:42 +000069 dbfile = args[0]
Skip Montanaroe2b61e02004-03-03 17:42:08 +000070 else:
Skip Montanaro9db49c82003-02-03 15:08:42 +000071 try:
Skip Montanaroe2b61e02004-03-03 17:42:08 +000072 pfile = open(args[0], 'rb')
Skip Montanaro9db49c82003-02-03 15:08:42 +000073 except IOError:
Skip Montanaroe2b61e02004-03-03 17:42:08 +000074 sys.stderr.write("Unable to open %s\n" % args[0])
Skip Montanaro9db49c82003-02-03 15:08:42 +000075 return 1
Skip Montanaroe2b61e02004-03-03 17:42:08 +000076 dbfile = args[1]
Skip Montanaro9db49c82003-02-03 15:08:42 +000077
78 dbopen = None
79 for opt, arg in opts:
80 if opt in ("-h", "--hash"):
81 try:
82 dbopen = bsddb.hashopen
83 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +000084 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +000085 return 1
86 elif opt in ("-b", "--btree"):
87 try:
88 dbopen = bsddb.btopen
89 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +000090 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +000091 return 1
92 elif opt in ("-r", "--recno"):
93 try:
94 dbopen = bsddb.rnopen
95 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +000096 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +000097 return 1
98 elif opt in ("-a", "--anydbm"):
99 try:
100 dbopen = anydbm.open
101 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +0000102 sys.stderr.write("anydbm module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +0000103 return 1
Skip Montanaro48f9c6d2003-10-28 16:17:54 +0000104 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
Skip Montanaro9db49c82003-02-03 15:08:42 +0000110 elif opt in ("-d", "--dbm"):
111 try:
112 dbopen = dbm.open
113 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +0000114 sys.stderr.write("dbm module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +0000115 return 1
116 if dbopen is None:
117 if bsddb is None:
Skip Montanaro7c1274d2003-02-03 15:28:23 +0000118 sys.stderr.write("bsddb module unavailable - ")
119 sys.stderr.write("must specify dbtype.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +0000120 return 1
121 else:
122 dbopen = bsddb.hashopen
123
124 try:
125 db = dbopen(dbfile, 'c')
126 except bsddb.error:
Skip Montanaro7c1274d2003-02-03 15:28:23 +0000127 sys.stderr.write("Unable to open %s. " % dbfile)
128 sys.stderr.write("Check for format or version mismatch.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +0000129 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
146if __name__ == "__main__":
147 sys.exit(main(sys.argv[1:]))