mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			61 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
	
		
			1.3 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:
							 | 
						||
| 
								 | 
							
									try:
							 | 
						||
| 
								 | 
							
									    (magic,) = struct.unpack("i", 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 ""
							 |