summaryrefslogtreecommitdiff
path: root/lib/python2.7/Tools/scripts/pickle2db.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/Tools/scripts/pickle2db.py')
-rw-r--r--lib/python2.7/Tools/scripts/pickle2db.py147
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:]))