mirror of
				https://github.com/jart/cosmopolitan.git
				synced 2025-10-20 16:39:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			147 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| """
 | |
| 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 dbm (open any supported format)
 | |
|     -b - open as bsddb btree file
 | |
|     -d - open as dbm.ndbm file
 | |
|     -g - open as dbm.gnu 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.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", "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("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, '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 list(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:]))
 |