135 lines
3.7 KiB
Python
135 lines
3.7 KiB
Python
#!/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 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.
|
|
|
|
"""
|
|
|
|
import getopt
|
|
try:
|
|
import bsddb
|
|
except ImportError:
|
|
bsddb = None
|
|
try:
|
|
import dbm.ndbm as dbm
|
|
except ImportError:
|
|
dbm = None
|
|
try:
|
|
import dbm.gnu as gdbm
|
|
except ImportError:
|
|
gdbm = None
|
|
try:
|
|
import dbm.ndbm as anydbm
|
|
except ImportError:
|
|
anydbm = None
|
|
import sys
|
|
try:
|
|
import pickle 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",
|
|
"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:]))
|