summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1999-06-08 13:13:16 +0000
committerGuido van Rossum <guido@python.org>1999-06-08 13:13:16 +0000
commitb635f7e9fb080ccc4589f50b202cbddbc76fdafc (patch)
tree117b6d42b87d0b043418a3a78c291e58b171d40f
parentd0cf4f2c93c8c48527812fd2fee3b9218572c8da (diff)
downloadcpython-b635f7e9fb080ccc4589f50b202cbddbc76fdafc.tar.gz
Skip Montanaro:
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.
-rw-r--r--Lib/whichdb.py15
1 files changed, 13 insertions, 2 deletions
diff --git a/Lib/whichdb.py b/Lib/whichdb.py
index c072e5bdbe..aa1761cc58 100644
--- a/Lib/whichdb.py
+++ b/Lib/whichdb.py
@@ -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 ""