cpython/Tools/scripts/db2pickle.py

136 lines
3.5 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
2003-02-03 23:09:03 +08:00
"""
2003-10-29 00:17:54 +08:00
Synopsis: %(prog)s [-h|-g|-b|-r|-a] dbfile [ picklefile ]
2003-02-03 23:09:03 +08:00
2003-06-20 09:00:20 +08:00
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.
2003-02-03 23:09:03 +08:00
"""
import getopt
try:
import bsddb
except ImportError:
bsddb = None
try:
import dbm.ndbm as dbm
2003-02-03 23:09:03 +08:00
except ImportError:
dbm = None
2003-10-29 00:17:54 +08:00
try:
import dbm.gnu as gdbm
2003-10-29 00:17:54 +08:00
except ImportError:
gdbm = None
2003-02-03 23:09:03 +08:00
try:
2009-11-09 08:42:58 +08:00
import dbm.ndbm as anydbm
2003-02-03 23:09:03 +08:00
except ImportError:
anydbm = None
import sys
try:
2009-11-09 08:42:58 +08:00
import pickle as pickle
2003-02-03 23:09:03 +08:00
except ImportError:
import pickle
prog = sys.argv[0]
def usage():
sys.stderr.write(__doc__ % globals())
2003-02-03 23:09:03 +08:00
def main(args):
try:
2003-10-29 00:17:54 +08:00
opts, args = getopt.getopt(args, "hbrdag",
["hash", "btree", "recno", "dbm",
"gdbm", "anydbm"])
2003-02-03 23:09:03 +08:00
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')
2003-02-03 23:09:03 +08:00
except IOError:
sys.stderr.write("Unable to open %s\n" % args[1])
2003-02-03 23:09:03 +08:00
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")
2003-02-03 23:09:03 +08:00
return 1
elif opt in ("-b", "--btree"):
try:
dbopen = bsddb.btopen
except AttributeError:
sys.stderr.write("bsddb module unavailable.\n")
2003-02-03 23:09:03 +08:00
return 1
elif opt in ("-r", "--recno"):
try:
dbopen = bsddb.rnopen
except AttributeError:
sys.stderr.write("bsddb module unavailable.\n")
2003-02-03 23:09:03 +08:00
return 1
elif opt in ("-a", "--anydbm"):
try:
dbopen = anydbm.open
except AttributeError:
sys.stderr.write("dbm module unavailable.\n")
2003-02-03 23:09:03 +08:00
return 1
2003-10-29 00:17:54 +08:00
elif opt in ("-g", "--gdbm"):
try:
dbopen = gdbm.open
except AttributeError:
sys.stderr.write("dbm.gnu module unavailable.\n")
2003-10-29 00:17:54 +08:00
return 1
2003-02-03 23:09:03 +08:00
elif opt in ("-d", "--dbm"):
try:
dbopen = dbm.open
except AttributeError:
sys.stderr.write("dbm.ndbm module unavailable.\n")
2003-02-03 23:09:03 +08:00
return 1
if dbopen is None:
if bsddb is None:
sys.stderr.write("bsddb module unavailable - ")
sys.stderr.write("must specify dbtype.\n")
2003-02-03 23:09:03 +08:00
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")
2003-02-03 23:09:03 +08:00
return 1
2003-04-25 00:02:54 +08:00
2003-02-03 23:09:03 +08:00
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:]))