[Python-checkins] python/dist/src/Lib whichdb.py,1.12,1.13

montanaro@users.sourceforge.net montanaro@users.sourceforge.net
Fri, 02 Aug 2002 10:12:18 -0700


Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv12999

Modified Files:
	whichdb.py 
Log Message:
catch the situation where Berkeley DB is used to emulate dbm(3) library
functions.  In this case, calling dbm.open("foo", "c") actually creates a
file named "foo.db".


Index: whichdb.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/whichdb.py,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** whichdb.py	24 Oct 2001 20:33:34 -0000	1.12
--- whichdb.py	2 Aug 2002 17:12:15 -0000	1.13
***************
*** 2,5 ****
--- 2,15 ----
  
  import os
+ import struct
+ 
+ try:
+     import dbm
+     _dbmerror = dbm.error
+ except ImportError:
+     dbm = None
+     # just some sort of valid exception which might be raised in the
+     # dbm test
+     _dbmerror = IOError
  
  def whichdb(filename):
***************
*** 16,21 ****
      """
  
-     import struct
- 
      # Check for dbm first -- this has a .pag and a .dir file
      try:
--- 26,29 ----
***************
*** 26,30 ****
          return "dbm"
      except IOError:
!         pass
  
      # Check for dumbdbm next -- this has a .dir and and a .dat file
--- 34,51 ----
          return "dbm"
      except IOError:
!         # some dbm emulations based on Berkeley DB generate a .db file
!         # some do not, but they should be caught by the dbhash checks
!         try:
!             f = open(filename + os.extsep + "db", "rb")
!             f.close()
!             # guarantee we can actually open the file using dbm
!             # kind of overkill, but since we are dealing with emulations
!             # it seems like a prudent step
!             if dbm is not None:
!                 d = dbm.open(filename)
!                 d.close()
!                 return "dbm"
!         except (IOError, _dbmerror):
!             pass
  
      # Check for dumbdbm next -- this has a .dir and and a .dat file