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:])) 136