From: Guido van Rossum Date: Tue, 30 Jul 1996 16:30:15 +0000 (+0000) Subject: Function to guess which db package created a database. X-Git-Tag: v1.4b2~143 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8d12a1bcbcee483671bfe7d566a3412f57fa8b58;p=python Function to guess which db package created a database. --- diff --git a/Lib/whichdb.py b/Lib/whichdb.py new file mode 100644 index 0000000000..3722e41b96 --- /dev/null +++ b/Lib/whichdb.py @@ -0,0 +1,60 @@ +"""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 ""