|
|
#!/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 picklerepresentation. 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 writeaccess (deleting any existing data). If no pickle file is named, the pickleoutput is written to standard output.
"""
import getopttry: import bsddbexcept ImportError: bsddb = Nonetry: import dbm.ndbm as dbmexcept ImportError: dbm = Nonetry: import dbm.gnu as gdbmexcept ImportError: gdbm = Nonetry: import dbm.ndbm as anydbmexcept ImportError: anydbm = Noneimport systry: import pickle as pickleexcept 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:]))
|