mirror of https://github.com/python/cpython
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.
This commit is contained in:
parent
ab6a08a4b6
commit
cf09a3924f
|
@ -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 ""
|
||||
|
|
Loading…
Reference in New Issue