"""Guess which db package to use to open a db file."""
# just some sort of valid exception which might be raised in the
"""Guess which db package to use to open a db file.
- 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
f
= open(filename
+ os
.extsep
+ "pag", "rb")
# dbm linked with gdbm on OS/2 doesn't have .dir file
if not (dbm
.library
== "GNU gdbm" and sys
.platform
== "os2emx"):
f
= open(filename
+ os
.extsep
+ "dir", "rb")
# some dbm emulations based on Berkeley DB generate a .db file
# some do not, but they should be caught by the dbhash checks
f
= open(filename
+ os
.extsep
+ "db", "rb")
# guarantee we can actually open the file using dbm
# kind of overkill, but since we are dealing with emulations
# it seems like a prudent step
except (IOError, _dbmerror
):
# Check for dumbdbm next -- this has a .dir and a .dat file
# First check for presence of files
os
.stat(filename
+ os
.extsep
+ "dat")
size
= os
.stat(filename
+ os
.extsep
+ "dir").st_size
# dumbdbm files with no keys are empty
f
= open(filename
+ os
.extsep
+ "dir", "rb")
if f
.read(1) in ["'", '"']:
except (OSError, IOError):
# See if the file exists, return None if not
# Read the start of the file -- the magic number
# Return "" if not at least 4 bytes
# Convert to 4-byte int in native byte order -- return "" if impossible
(magic
,) = struct
.unpack("=l", s
)
# Check for old Berkeley db hash file format v2
if magic
in (0x00061561, 0x61150600):
# Later versions of Berkeley db hash file have a 12-byte pad in
(magic
,) = struct
.unpack("=l", s16
[-4:])
if magic
in (0x00061561, 0x61150600):
if __name__
== "__main__":
for filename
in sys
.argv
[1:]:
print whichdb(filename
) or "UNKNOWN", filename