diff options
Diffstat (limited to 'lib/python2.7/Tools/scripts/pickle2db.py')
-rw-r--r-- | lib/python2.7/Tools/scripts/pickle2db.py | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/lib/python2.7/Tools/scripts/pickle2db.py b/lib/python2.7/Tools/scripts/pickle2db.py new file mode 100644 index 0000000..2913ea8 --- /dev/null +++ b/lib/python2.7/Tools/scripts/pickle2db.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python2 + +""" +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 new +database. If the database already exists, any contents are deleted. The +optional flags indicate the type of the output database: + + -a - open using anydbm + -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 read +access. If no pickle file is named, the pickle input is read from standard +input. + +Note that recno databases can only contain integer keys, so you can't dump a +hash or btree database using db2pickle.py and reconstitute it to a recno +database with %(prog)s unless your keys are integers. + +""" + +import getopt +try: + import bsddb +except ImportError: + bsddb = None +try: + import dbm +except ImportError: + dbm = None +try: + import gdbm +except ImportError: + gdbm = None +try: + import anydbm +except ImportError: + anydbm = None +import sys +try: + import cPickle 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", "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("anydbm module unavailable.\n") + return 1 + elif opt in ("-g", "--gdbm"): + try: + dbopen = gdbm.open + except AttributeError: + sys.stderr.write("gdbm module unavailable.\n") + return 1 + elif opt in ("-d", "--dbm"): + try: + dbopen = dbm.open + except AttributeError: + sys.stderr.write("dbm 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 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:])) |