|
|
#!/usr/bin/env python3
"""
Synopsis: %(prog)s [-h|-b|-g|-r|-a|-d] [ picklefile ] dbfile
Read the given picklefile as a series of key/value pairs and write to a newdatabase. If the database already exists, any contents are deleted. Theoptional flags indicate the type of the output database:
-a - open using dbm (open any supported format) -b - open as bsddb btree file -d - open as dbm.ndbm file -g - open as dbm.gnu 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 readaccess. If no pickle file is named, the pickle input is read from standardinput.
Note that recno databases can only contain integer keys, so you can't dump ahash or btree database using db2pickle.py and reconstitute it to a recnodatabase with %(prog)s unless your keys are integers.
"""
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", "anydbm", "gdbm"]) except getopt.error: usage() return 1
if len(args) == 0 or len(args) > 2: usage() return 1 elif len(args) == 1: pfile = sys.stdin dbfile = args[0] else: try: pfile = open(args[0], 'rb') except IOError: sys.stderr.write("Unable to open %s\n" % args[0]) return 1 dbfile = args[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, 'c') except bsddb.error: sys.stderr.write("Unable to open %s. " % dbfile) sys.stderr.write("Check for format or version mismatch.\n") return 1 else: for k in list(db.keys()): del db[k]
while 1: try: (key, val) = pickle.load(pfile) except EOFError: break db[key] = val
db.close() pfile.close()
return 0
if __name__ == "__main__": sys.exit(main(sys.argv[1:]))
|