cinap_lenrekadd hg and python4bb9e2215 years agoHistory
147 lines · 3.8 KB · Python
RawDownload
#!/usr/bin/env python """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 newdatabase.  If the database already exists, any contents are deleted.  Theoptional 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 readaccess.  If no pickle file is named, the pickle input is read from standardinput. Note that recno databases can only contain integer keys, so you can't dump ahash or btree database using db2pickle.py and reconstitute it to a recnodatabase with %(prog)s unless your keys are integers. """ import getopttry:    import bsddbexcept ImportError:    bsddb = Nonetry:    import dbmexcept ImportError:    dbm = Nonetry:    import gdbmexcept ImportError:    gdbm = Nonetry:    import anydbmexcept ImportError:    anydbm = Noneimport systry:    import cPickle as pickleexcept 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:]))