mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			57 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Guess which db package to use to open a db file."""
 | 
						|
 | 
						|
import struct
 | 
						|
 | 
						|
def whichdb(filename):
 | 
						|
    """Guess which db package to use to open a db file.
 | 
						|
 | 
						|
    Return values:
 | 
						|
 | 
						|
    - None if the database file can't be read;
 | 
						|
    - empty string if the file can be read but can't be recognized
 | 
						|
    - the module name (e.g. "dbm" or "gdbm") if recognized.
 | 
						|
 | 
						|
    Importing the given module may still fail, and opening the
 | 
						|
    database using that module may still fail.
 | 
						|
    """
 | 
						|
 | 
						|
    # Check for dbm first -- this has a .pag and a .dir file
 | 
						|
    try:
 | 
						|
	f = open(filename + ".pag", "rb")
 | 
						|
	f.close()
 | 
						|
	f = open(filename + ".dir", "rb")
 | 
						|
	f.close()
 | 
						|
	return "dbm"
 | 
						|
    except IOError:
 | 
						|
	pass
 | 
						|
 | 
						|
    # See if the file exists, return None if not
 | 
						|
    try:
 | 
						|
	f = open(filename, "rb")
 | 
						|
    except IOError:
 | 
						|
	return None
 | 
						|
 | 
						|
    # Read the first 4 bytes of the file -- the magic number
 | 
						|
    s = f.read(4)
 | 
						|
    f.close()
 | 
						|
 | 
						|
    # Return "" if not at least 4 bytes
 | 
						|
    if len(s) != 4:
 | 
						|
	return ""
 | 
						|
 | 
						|
    # Convert to 4-byte int in native byte order -- return "" if impossible
 | 
						|
    try:
 | 
						|
	(magic,) = struct.unpack("=l", s)
 | 
						|
    except struct.error:
 | 
						|
	return ""
 | 
						|
 | 
						|
    # Check for GNU dbm
 | 
						|
    if magic == 0x13579ace:
 | 
						|
	return "gdbm"
 | 
						|
 | 
						|
    # Check for BSD hash
 | 
						|
    if magic == 0x061561:
 | 
						|
	return "dbhash"
 | 
						|
 | 
						|
    # Unknown
 | 
						|
    return ""
 |