diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2003-06-14 08:16:34 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2003-06-14 08:16:34 (GMT) |
commit | 17fb50790dfb662c05b073fdc44861ca0a735533 (patch) | |
tree | f17cf6763ead317e9263c2142799ff829f32e481 /Lib | |
parent | 8316feb155c3db0114259eab86a7a19cf345cd2e (diff) | |
download | cpython-17fb50790dfb662c05b073fdc44861ca0a735533.zip cpython-17fb50790dfb662c05b073fdc44861ca0a735533.tar.gz cpython-17fb50790dfb662c05b073fdc44861ca0a735533.tar.bz2 |
Treat empty dat/dir pairs as dumbdbm. Fixes #744687.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_whichdb.py | 5 | ||||
-rw-r--r-- | Lib/whichdb.py | 10 |
2 files changed, 12 insertions, 3 deletions
diff --git a/Lib/test/test_whichdb.py b/Lib/test/test_whichdb.py index 000c999..f2652c1 100644 --- a/Lib/test/test_whichdb.py +++ b/Lib/test/test_whichdb.py @@ -45,7 +45,12 @@ for name in anydbm._names: def test_whichdb_name(self, name=name, mod=mod): # Check whether whichdb correctly guesses module name # for databases opened with module mod. + # Try with empty files first f = mod.open(_fname, 'c') + f.close() + self.assertEqual(name, whichdb.whichdb(_fname)) + # Now add a key + f = mod.open(_fname, 'w') f["1"] = "1" f.close() self.assertEqual(name, whichdb.whichdb(_fname)) diff --git a/Lib/whichdb.py b/Lib/whichdb.py index fed58e9..9299636 100644 --- a/Lib/whichdb.py +++ b/Lib/whichdb.py @@ -50,15 +50,19 @@ def whichdb(filename): # Check for dumbdbm next -- this has a .dir and and a .dat file try: - f = open(filename + os.extsep + "dat", "rb") - f.close() + # First check for presence of files + sizes = os.stat(filename + os.extsep + "dat").st_size, \ + os.stat(filename + os.extsep + "dir").st_size + # dumbdbm files with no keys are empty + if sizes == (0, 0): + return "dumbdbm" f = open(filename + os.extsep + "dir", "rb") try: if f.read(1) in ["'", '"']: return "dumbdbm" finally: f.close() - except IOError: + except (OSError, IOError): pass # See if the file exists, return None if not |