]> granicus.if.org Git - python/commitdiff
Function to guess which db package created a database.
authorGuido van Rossum <guido@python.org>
Tue, 30 Jul 1996 16:30:15 +0000 (16:30 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 30 Jul 1996 16:30:15 +0000 (16:30 +0000)
Lib/whichdb.py [new file with mode: 0644]

diff --git a/Lib/whichdb.py b/Lib/whichdb.py
new file mode 100644 (file)
index 0000000..3722e41
--- /dev/null
@@ -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 ""