This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Title: Corrupt Berkeley DB using Modify bsddb.dbtables
Type: Stage:
Components: Extension Modules Versions: Python 2.5
Status: closed Resolution: accepted
Dependencies: Superseder:
Assigned To: gregory.p.smith Nosy List: gregory.p.smith, j_ross, jimjjewett, nnorwitz
Priority: normal Keywords: patch

Created on 2006-01-17 22:55 by j_ross, last changed 2022-04-11 14:56 by admin. This issue is now closed.

File name Uploaded Description Edit j_ross, 2006-01-17 22:55 Diff file of fix (not tested thoroughly) j_ross, 2006-01-19 23:07 Simple test case - creates DB, Insert, attempts Modify w/ string - corrupts
Messages (6)
msg49334 - (view) Author: jross (j_ross) Date: 2006-01-17 22:55
OS: Windows 2000/Windows XP/Debian-based Linux 
w/2.6.10 Kernel

When the Modify function from the module 
is called on Berkeley DB it corrupts the file showing 
an error caused by Line 445 of
msg49335 - (view) Author: Neal Norwitz (nnorwitz) * (Python committer) Date: 2006-01-18 06:14
Logged In: YES 

Can you create a test case for this?  What is the trigger? 
Just calling the function/method?  Do you know if this
affects Python 2.4 and HEAD?  What version of Berkeley DB?
msg49336 - (view) Author: jross (j_ross) Date: 2006-01-19 18:11
Logged In: YES 

I'm new to Python so this may be the problem, does the 
dbtables.Modify function require a function in the 
mappings. i.e. tdb.Modify('mytable', conditions=
{'ID':dbtables.ExactCond('1')}, mappings={'ID':FUNCTION}) 
where the function returns the new value? (not mappings=
msg49337 - (view) Author: Jim Jewett (jimjjewett) Date: 2006-01-19 22:35
Logged In: YES 

Correct, the values in the dictionaries should be callables 
(usually a function) which take the old value and return the 

That said, the test case would still be useful, because

(1) calling a string should raise a TypeError
(2) making a mistake should not corrupt the database.  
Perhaps the first except clause (which triggers a rollback) 
needs to be a bare except?  I'm guess the same is true of 
some of the other abort() lines...
msg49338 - (view) Author: jross (j_ross) Date: 2006-01-19 23:07
Logged In: YES 

Very nice .. yes using a bare exception causes the expected 
TypeError exception. I tried this in Python 2.4 and without 
any changes it correctly raises TypeError. 

I checked the differences between the 2.3 dbtables and 2.4 
and there are no significant changes (i.e. the Modify 
catches the same exceptions) so it's got to be somewhere 

I've uploaded a simple test case that creates a database, 
does an Insert and then attempts the Modify with a string 
which corrupts the DB in Python 2.3.
msg49339 - (view) Author: Gregory P. Smith (gregory.p.smith) * (Python committer) Date: 2006-06-08 05:18
Logged In: YES 

fixed in SVN 46736 for python 2.5.

honestly people should just use sqlite3 instead of dbtables.
Date User Action Args
2022-04-11 14:56:15adminsetgithub: 42803
2006-01-17 22:55:43j_rosscreate