db2pickle.py 3.54 KB
Newer Older
1
#!/usr/bin/env python3
2 3

"""
4
Synopsis: %(prog)s [-h|-g|-b|-r|-a] dbfile [ picklefile ]
5

Skip Montanaro's avatar
Skip Montanaro committed
6
Convert the database file given on the command line to a pickle
7 8
representation.  The optional flags indicate the type of the database:

9
    -a - open using dbm (any supported format)
10 11 12 13 14 15 16 17 18
    -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.
19 20 21 22 23 24 25 26 27

"""

import getopt
try:
    import bsddb
except ImportError:
    bsddb = None
try:
28
    import dbm.ndbm as dbm
29 30
except ImportError:
    dbm = None
31
try:
32
    import dbm.gnu as gdbm
33 34
except ImportError:
    gdbm = None
35
try:
Benjamin Peterson's avatar
Benjamin Peterson committed
36
    import dbm.ndbm as anydbm
37 38 39 40
except ImportError:
    anydbm = None
import sys
try:
Benjamin Peterson's avatar
Benjamin Peterson committed
41
    import pickle as pickle
42 43 44 45 46 47
except ImportError:
    import pickle

prog = sys.argv[0]

def usage():
48
    sys.stderr.write(__doc__ % globals())
49 50 51

def main(args):
    try:
52 53 54
        opts, args = getopt.getopt(args, "hbrdag",
                                   ["hash", "btree", "recno", "dbm",
                                    "gdbm", "anydbm"])
55 56 57 58 59 60 61 62 63 64 65 66 67
    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:
68
            pfile = open(args[1], 'wb')
69
        except IOError:
70
            sys.stderr.write("Unable to open %s\n" % args[1])
71 72 73 74 75 76 77 78
            return 1

    dbopen = None
    for opt, arg in opts:
        if opt in ("-h", "--hash"):
            try:
                dbopen = bsddb.hashopen
            except AttributeError:
79
                sys.stderr.write("bsddb module unavailable.\n")
80 81 82 83 84
                return 1
        elif opt in ("-b", "--btree"):
            try:
                dbopen = bsddb.btopen
            except AttributeError:
85
                sys.stderr.write("bsddb module unavailable.\n")
86 87 88 89 90
                return 1
        elif opt in ("-r", "--recno"):
            try:
                dbopen = bsddb.rnopen
            except AttributeError:
91
                sys.stderr.write("bsddb module unavailable.\n")
92 93 94 95 96
                return 1
        elif opt in ("-a", "--anydbm"):
            try:
                dbopen = anydbm.open
            except AttributeError:
97
                sys.stderr.write("dbm module unavailable.\n")
98
                return 1
99 100 101 102
        elif opt in ("-g", "--gdbm"):
            try:
                dbopen = gdbm.open
            except AttributeError:
103
                sys.stderr.write("dbm.gnu module unavailable.\n")
104
                return 1
105 106 107 108
        elif opt in ("-d", "--dbm"):
            try:
                dbopen = dbm.open
            except AttributeError:
109
                sys.stderr.write("dbm.ndbm module unavailable.\n")
110 111 112
                return 1
    if dbopen is None:
        if bsddb is None:
113 114
            sys.stderr.write("bsddb module unavailable - ")
            sys.stderr.write("must specify dbtype.\n")
115 116 117 118 119 120 121
            return 1
        else:
            dbopen = bsddb.hashopen

    try:
        db = dbopen(dbfile, 'r')
    except bsddb.error:
122 123
        sys.stderr.write("Unable to open %s.  " % dbfile)
        sys.stderr.write("Check for format or version mismatch.\n")
124
        return 1
Tim Peters's avatar
Tim Peters committed
125

126 127 128 129 130 131 132 133 134 135
    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:]))