blob: 7e699f44b1b7df703f9ddcf6da8f57ff48123762 [file] [log] [blame]
Skip Montanaro9db49c82003-02-03 15:08:42 +00001#!/usr/bin/env python
2
3"""
Skip Montanaro48f9c6d2003-10-28 16:17:54 +00004Synopsis: %(prog)s [-h|-b|-g|-r|-a|-d] dbfile [ picklefile ]
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
8optional flags indicate the type of the database (bsddb hash, bsddb btree,
9bsddb recno, anydbm, dbm). The default is hash. If a pickle file is named
10it is opened for read access. If no pickle file is named, the pickle input
11is read from standard input.
Skip Montanaro9db49c82003-02-03 15:08:42 +000012
13Note that recno databases can only contain numeric keys, so you can't dump a
Skip Montanaroea7598e2003-03-07 00:47:40 +000014hash or btree database using db2pickle.py and reconstitute it to a recno
Skip Montanaro9db49c82003-02-03 15:08:42 +000015database with %(prog)s.
16"""
17
18import getopt
19try:
20 import bsddb
21except ImportError:
22 bsddb = None
23try:
24 import dbm
25except ImportError:
26 dbm = None
27try:
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000028 import gdbm
29except ImportError:
30 gdbm = None
31try:
Skip Montanaro9db49c82003-02-03 15:08:42 +000032 import anydbm
33except ImportError:
34 anydbm = None
35import sys
36try:
37 import cPickle as pickle
38except ImportError:
39 import pickle
40
41prog = sys.argv[0]
42
43def usage():
Tim Peters0eadaac2003-04-24 16:02:54 +000044 sys.stderr.write(__doc__ % globals())
Skip Montanaro9db49c82003-02-03 15:08:42 +000045
46def main(args):
47 try:
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000048 opts, args = getopt.getopt(args, "hbrdag",
49 ["hash", "btree", "recno", "dbm", "anydbm",
50 "gdbm"])
Skip Montanaro9db49c82003-02-03 15:08:42 +000051 except getopt.error:
52 usage()
53 return 1
54
55 if len(args) == 0 or len(args) > 2:
56 usage()
57 return 1
58 elif len(args) == 1:
59 dbfile = args[0]
60 pfile = sys.stdin
61 else:
62 dbfile = args[0]
63 try:
Skip Montanaro7c1274d2003-02-03 15:28:23 +000064 pfile = open(args[1], 'rb')
Skip Montanaro9db49c82003-02-03 15:08:42 +000065 except IOError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +000066 sys.stderr.write("Unable to open %s\n" % args[1])
Skip Montanaro9db49c82003-02-03 15:08:42 +000067 return 1
68
69 dbopen = None
70 for opt, arg in opts:
71 if opt in ("-h", "--hash"):
72 try:
73 dbopen = bsddb.hashopen
74 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +000075 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +000076 return 1
77 elif opt in ("-b", "--btree"):
78 try:
79 dbopen = bsddb.btopen
80 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +000081 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +000082 return 1
83 elif opt in ("-r", "--recno"):
84 try:
85 dbopen = bsddb.rnopen
86 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +000087 sys.stderr.write("bsddb module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +000088 return 1
89 elif opt in ("-a", "--anydbm"):
90 try:
91 dbopen = anydbm.open
92 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +000093 sys.stderr.write("anydbm module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +000094 return 1
Skip Montanaro48f9c6d2003-10-28 16:17:54 +000095 elif opt in ("-g", "--gdbm"):
96 try:
97 dbopen = gdbm.open
98 except AttributeError:
99 sys.stderr.write("gdbm module unavailable.\n")
100 return 1
Skip Montanaro9db49c82003-02-03 15:08:42 +0000101 elif opt in ("-d", "--dbm"):
102 try:
103 dbopen = dbm.open
104 except AttributeError:
Skip Montanaro7c1274d2003-02-03 15:28:23 +0000105 sys.stderr.write("dbm module unavailable.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +0000106 return 1
107 if dbopen is None:
108 if bsddb is None:
Skip Montanaro7c1274d2003-02-03 15:28:23 +0000109 sys.stderr.write("bsddb module unavailable - ")
110 sys.stderr.write("must specify dbtype.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +0000111 return 1
112 else:
113 dbopen = bsddb.hashopen
114
115 try:
116 db = dbopen(dbfile, 'c')
117 except bsddb.error:
Skip Montanaro7c1274d2003-02-03 15:28:23 +0000118 sys.stderr.write("Unable to open %s. " % dbfile)
119 sys.stderr.write("Check for format or version mismatch.\n")
Skip Montanaro9db49c82003-02-03 15:08:42 +0000120 return 1
121 else:
122 for k in db.keys():
123 del db[k]
124
125 while 1:
126 try:
127 (key, val) = pickle.load(pfile)
128 except EOFError:
129 break
130 db[key] = val
131
132 db.close()
133 pfile.close()
134
135 return 0
136
137if __name__ == "__main__":
138 sys.exit(main(sys.argv[1:]))