doesn't test the case thoroughly. There seems to be a bug in closing
the db environment first -- the lock is not released, and sometimes it
seg-faults.
Following is the code that shows this bug.
<code>
import os
from bsddb import db
dir,dbname='tes t_dbenv','test_ db'
def getDbEnv(dir):
try:
os.mkdir(dir)
except:
pass
dbenv = db.DBEnv()
dbenv.open(dir, db.DB_INIT_CDB| db.DB_CREATE |db.DB_INIT_MPO OL)
return dbenv
def getDbHandler(db _env,db_name):
d = db.DB(dbenv)
d.open(db_name, db.DB_BTREE, db.DB_CREATE)
return d
dbenv=getDbEnv( dir)
assert dbenv.lock_stat ()['nlocks']==0
d=getDbHandler( dbenv,dbname)
assert dbenv.lock_stat ()['nlocks']==1
try:
dbenv.close()
except db.DBError:
pass
else:
assert 0
del d
import gc
gc.collect()
dbenv=getDbEnv( dir)
assert dbenv.lock_stat ()['nlocks']==0,'number of current locks should
be 0' #this fails
</code>
If you close dbenv before db handler, the lock is not released.
Moreover, try this with dbshelve and it segfaults.
<code>
from bsddb import dbshelve
dbenv2=getDbEnv ('test_dbenv2')
d2=dbshelve.ope n(dbname,dbenv= dbenv2)
try: .... dbenv2.close()
.... except db.DBError:
.... pass
.... else:
.... assert 0
....
Exception bsddb._db.DBErr or: (0, 'DBEnv object has been closed') in
Segmentation fault
</code>