]> granicus.if.org Git - python/commitdiff
Skip Montanaro:
authorGuido van Rossum <guido@python.org>
Tue, 8 Jun 1999 13:13:16 +0000 (13:13 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 8 Jun 1999 13:13:16 +0000 (13:13 +0000)
I guess in 1.5.2 a new module, whichdb, was added that attempts to
divine the nature of a database file.  This module doesn't know anything
about Berkeley DB v2 files.  In v2, Sleepycat added a 12-byte null pad
in front of the old magic numbers (at least for hash and btree files).
I've been using v2 for awhile and upgrading to 1.5.2 broke all my
anydbm.open calls. I believe the following patch corrects the problem.

Lib/whichdb.py

index c072e5bdbe8696cefe1bf0c610d28dc3a84a6e2d..aa1761cc58a30e31eaa8cad371262d00ade92b45 100644 (file)
@@ -31,9 +31,10 @@ def whichdb(filename):
     except IOError:
         return None
 
-    # Read the first 4 bytes of the file -- the magic number
-    s = f.read(4)
+    # Read the start of the file -- the magic number
+    s16 = f.read(16)
     f.close()
+    s = s16[0:4]
 
     # Return "" if not at least 4 bytes
     if len(s) != 4:
@@ -53,5 +54,15 @@ def whichdb(filename):
     if magic in (0x00061561, 0x61150600):
         return "dbhash"
 
+    # BSD hash v2 has a 12-byte NULL pad in front of the file type
+    try:
+       (magic,) = struct.unpack("=l", s16[-4:])
+    except struct.error:
+        return ""
+
+    # Check for BSD hash
+    if magic in (0x00061561, 0x61150600):
+        return "dbhash"
+
     # Unknown
     return ""