1996-07-30 13:30:15 -03:00
|
|
|
"""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:
|
1998-03-26 17:13:24 -04:00
|
|
|
f = open(filename + ".pag", "rb")
|
|
|
|
f.close()
|
|
|
|
f = open(filename + ".dir", "rb")
|
|
|
|
f.close()
|
|
|
|
return "dbm"
|
1996-07-30 13:30:15 -03:00
|
|
|
except IOError:
|
1998-03-26 17:13:24 -04:00
|
|
|
pass
|
1996-07-30 13:30:15 -03:00
|
|
|
|
|
|
|
# See if the file exists, return None if not
|
|
|
|
try:
|
1998-03-26 17:13:24 -04:00
|
|
|
f = open(filename, "rb")
|
1996-07-30 13:30:15 -03:00
|
|
|
except IOError:
|
1998-03-26 17:13:24 -04:00
|
|
|
return None
|
1996-07-30 13:30:15 -03:00
|
|
|
|
|
|
|
# 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:
|
1998-03-26 17:13:24 -04:00
|
|
|
return ""
|
1996-07-30 13:30:15 -03:00
|
|
|
|
|
|
|
# Convert to 4-byte int in native byte order -- return "" if impossible
|
|
|
|
try:
|
1998-03-26 17:13:24 -04:00
|
|
|
(magic,) = struct.unpack("=l", s)
|
1996-07-30 13:30:15 -03:00
|
|
|
except struct.error:
|
1998-03-26 17:13:24 -04:00
|
|
|
return ""
|
1996-07-30 13:30:15 -03:00
|
|
|
|
|
|
|
# Check for GNU dbm
|
|
|
|
if magic == 0x13579ace:
|
1998-03-26 17:13:24 -04:00
|
|
|
return "gdbm"
|
1996-07-30 13:30:15 -03:00
|
|
|
|
|
|
|
# Check for BSD hash
|
|
|
|
if magic == 0x061561:
|
1998-03-26 17:13:24 -04:00
|
|
|
return "dbhash"
|
1996-07-30 13:30:15 -03:00
|
|
|
|
|
|
|
# Unknown
|
|
|
|
return ""
|