bsddb.btopen()

Gregory P. Smith gsmith-mysterymeat at mysterymeat-transmeta.com
Wed Aug 13 19:23:34 EDT 2003


Anthony McDonald wrote:
> PythonWin 2.3 (#46, Jul 29 2003, 18:54:32) [MSC v.1200 32 bit (Intel)] on
> win32.
> Portions Copyright 1994-2001 Mark Hammond (mhammond at skippinet.com.au) - see
> 'Help/About PythonWin' for further copyright information.
> 
>>>>import os
>>>>import bsddb
>>>>os.chdir("c:/test")
>>>>my_data = bsddb.btopen("testing", 'c')
>>>>for i in range(10):
> 
> ...  if i == 5:
> ...   pass
> ...  else:
> ...   my_data['%d'%i] = '%d'% (i*i)
> ...
> 
>>>>my_data.keys()
> 
> ['0', '1', '2', '3', '4', '6', '7', '8', '9']
> 
>>>>my_data.sync()
> 
> 
> Now heres where my problem is.
> 
> The documentation explicitly states that a btopen database when asked to
> locate a key that doesn't exist in the dataset, will return the next sorted
> key from the dataset.
> 
> So my_data.set_location('5') should return as if I'd called
> my_data.set_location('6')
> 
>>>>my_data.set_location('5')
> 
> Traceback (most recent call last):
>   File "<interactive input>", line 1, in ?
>   File "C:\Python23\lib\bsddb\__init__.py", line 117, in set_location
>     return self.dbc.set(key)
> DBNotFoundError: (-30991, 'DB_NOTFOUND: No matching key/data pair found')
> 
> Okay maybe it has positioned the cursor, but is just raising the exception
> to politely tell me that I'm not pointing at the key I asked for. So
> my_data.previous() will return the key/data pair for key "4".
> 
>>>>my_data.previous()
> 
> ('9', '81')
> 
> Okay its pointing at the end of the database. Erm thats not as advertised.
> 
> Okay whats broken? Is the documentation wrong? Is my version of Python
> wrong?, or do I need to drink some more coffee?

This looks like a break in compatibility between Python <=2.2.x bsddb 
and the new bsddb (pybsddb/bsddb3) included in Python 2.3.  I've filed a 
bugreport on sourceforge to track fixing this.

http://sourceforge.net/tracker/?func=detail&aid=788421&group_id=5470&atid=105470

I don't see an immediately obvious work around while using the old 
simplistic bsddb interface.

-- 
Gregory P. Smith   [remove mystery meat from my address when replying]





More information about the Python-list mailing list