| #!/usr/bin/env python3 | 
 |  | 
 | """ | 
 | Synopsis: %(prog)s [-h|-g|-b|-r|-a] dbfile [ picklefile ] | 
 |  | 
 | Convert the database file given on the command line to a pickle | 
 | representation.  The optional flags indicate the type of the database: | 
 |  | 
 |     -a - open using dbm (any supported format) | 
 |     -b - open as bsddb btree file | 
 |     -d - open as dbm file | 
 |     -g - open as gdbm file | 
 |     -h - open as bsddb hash file | 
 |     -r - open as bsddb recno file | 
 |  | 
 | The default is hash.  If a pickle file is named it is opened for write | 
 | access (deleting any existing data).  If no pickle file is named, the pickle | 
 | output is written to standard output. | 
 |  | 
 | """ | 
 |  | 
 | import getopt | 
 | try: | 
 |     import bsddb | 
 | except ImportError: | 
 |     bsddb = None | 
 | try: | 
 |     import dbm.ndbm as dbm | 
 | except ImportError: | 
 |     dbm = None | 
 | try: | 
 |     import dbm.gnu as gdbm | 
 | except ImportError: | 
 |     gdbm = None | 
 | try: | 
 |     import dbm.ndbm as anydbm | 
 | except ImportError: | 
 |     anydbm = None | 
 | import sys | 
 | try: | 
 |     import pickle as pickle | 
 | except ImportError: | 
 |     import pickle | 
 |  | 
 | prog = sys.argv[0] | 
 |  | 
 | def usage(): | 
 |     sys.stderr.write(__doc__ % globals()) | 
 |  | 
 | def main(args): | 
 |     try: | 
 |         opts, args = getopt.getopt(args, "hbrdag", | 
 |                                    ["hash", "btree", "recno", "dbm", | 
 |                                     "gdbm", "anydbm"]) | 
 |     except getopt.error: | 
 |         usage() | 
 |         return 1 | 
 |  | 
 |     if len(args) == 0 or len(args) > 2: | 
 |         usage() | 
 |         return 1 | 
 |     elif len(args) == 1: | 
 |         dbfile = args[0] | 
 |         pfile = sys.stdout | 
 |     else: | 
 |         dbfile = args[0] | 
 |         try: | 
 |             pfile = open(args[1], 'wb') | 
 |         except IOError: | 
 |             sys.stderr.write("Unable to open %s\n" % args[1]) | 
 |             return 1 | 
 |  | 
 |     dbopen = None | 
 |     for opt, arg in opts: | 
 |         if opt in ("-h", "--hash"): | 
 |             try: | 
 |                 dbopen = bsddb.hashopen | 
 |             except AttributeError: | 
 |                 sys.stderr.write("bsddb module unavailable.\n") | 
 |                 return 1 | 
 |         elif opt in ("-b", "--btree"): | 
 |             try: | 
 |                 dbopen = bsddb.btopen | 
 |             except AttributeError: | 
 |                 sys.stderr.write("bsddb module unavailable.\n") | 
 |                 return 1 | 
 |         elif opt in ("-r", "--recno"): | 
 |             try: | 
 |                 dbopen = bsddb.rnopen | 
 |             except AttributeError: | 
 |                 sys.stderr.write("bsddb module unavailable.\n") | 
 |                 return 1 | 
 |         elif opt in ("-a", "--anydbm"): | 
 |             try: | 
 |                 dbopen = anydbm.open | 
 |             except AttributeError: | 
 |                 sys.stderr.write("dbm module unavailable.\n") | 
 |                 return 1 | 
 |         elif opt in ("-g", "--gdbm"): | 
 |             try: | 
 |                 dbopen = gdbm.open | 
 |             except AttributeError: | 
 |                 sys.stderr.write("dbm.gnu module unavailable.\n") | 
 |                 return 1 | 
 |         elif opt in ("-d", "--dbm"): | 
 |             try: | 
 |                 dbopen = dbm.open | 
 |             except AttributeError: | 
 |                 sys.stderr.write("dbm.ndbm module unavailable.\n") | 
 |                 return 1 | 
 |     if dbopen is None: | 
 |         if bsddb is None: | 
 |             sys.stderr.write("bsddb module unavailable - ") | 
 |             sys.stderr.write("must specify dbtype.\n") | 
 |             return 1 | 
 |         else: | 
 |             dbopen = bsddb.hashopen | 
 |  | 
 |     try: | 
 |         db = dbopen(dbfile, 'r') | 
 |     except bsddb.error: | 
 |         sys.stderr.write("Unable to open %s.  " % dbfile) | 
 |         sys.stderr.write("Check for format or version mismatch.\n") | 
 |         return 1 | 
 |  | 
 |     for k in db.keys(): | 
 |         pickle.dump((k, db[k]), pfile, 1==1) | 
 |  | 
 |     db.close() | 
 |     pfile.close() | 
 |  | 
 |     return 0 | 
 |  | 
 | if __name__ == "__main__": | 
 |     sys.exit(main(sys.argv[1:])) |