mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Fixes SF bug # 778421
* Fixed a bug in the compatibility interface set_location() method where it would not properly search to the next nearest key when used on BTree databases. [SF bug id 788421] * Fixed a bug in the compatibility interface set_location() method where it could crash when looking up keys in a hash or recno format database due to an incorrect free().
This commit is contained in:
parent
904de5b734
commit
a7befda8d8
4 changed files with 39 additions and 6 deletions
|
@ -244,7 +244,7 @@ class _DBWithCursor(_iter_mixin):
|
|||
def set_location(self, key):
|
||||
self._checkOpen()
|
||||
self._checkCursor()
|
||||
return self.dbc.set(key)
|
||||
return self.dbc.set_range(key)
|
||||
|
||||
def next(self):
|
||||
self._checkOpen()
|
||||
|
|
|
@ -385,7 +385,12 @@ class BasicTestCase(unittest.TestCase):
|
|||
rec = c.set_range('011',dlen=0,doff=0)
|
||||
if verbose:
|
||||
print "searched (partial) for '011', found: ", rec
|
||||
if rec[1] != '': set.fail('expected empty data portion')
|
||||
if rec[1] != '': self.fail('expected empty data portion')
|
||||
|
||||
ev = c.set_range('empty value')
|
||||
if verbose:
|
||||
print "search for 'empty value' returned", ev
|
||||
if ev[1] != '': self.fail('empty value lookup failed')
|
||||
|
||||
c.set('0499')
|
||||
c.delete()
|
||||
|
|
|
@ -49,6 +49,10 @@ class CompatibilityTestCase(unittest.TestCase):
|
|||
|
||||
assert getTest[1] == 'quick', 'data mismatch!'
|
||||
|
||||
rv = f.set_location(3)
|
||||
if rv != (3, 'brown'):
|
||||
self.fail('recno database set_location failed: '+repr(rv))
|
||||
|
||||
f[25] = 'twenty-five'
|
||||
f.close()
|
||||
del f
|
||||
|
@ -83,7 +87,6 @@ class CompatibilityTestCase(unittest.TestCase):
|
|||
f.close()
|
||||
|
||||
|
||||
|
||||
def do_bthash_test(self, factory, what):
|
||||
if verbose:
|
||||
print '\nTesting: ', what
|
||||
|
@ -103,13 +106,16 @@ class CompatibilityTestCase(unittest.TestCase):
|
|||
f['b'] = 'van'
|
||||
f['c'] = 'Rossum'
|
||||
f['d'] = 'invented'
|
||||
# 'e' intentionally left out
|
||||
f['f'] = 'Python'
|
||||
if verbose:
|
||||
print '%s %s %s' % (f['a'], f['b'], f['c'])
|
||||
|
||||
if verbose:
|
||||
print 'key ordering...'
|
||||
f.set_location(f.first()[0])
|
||||
start = f.set_location(f.first()[0])
|
||||
if start != ('0', ''):
|
||||
self.fail("incorrect first() result: "+repr(start))
|
||||
while 1:
|
||||
try:
|
||||
rec = f.next()
|
||||
|
@ -122,6 +128,20 @@ class CompatibilityTestCase(unittest.TestCase):
|
|||
|
||||
assert f.has_key('f'), 'Error, missing key!'
|
||||
|
||||
# test that set_location() returns the next nearest key, value
|
||||
# on btree databases and raises KeyError on others.
|
||||
if factory == btopen:
|
||||
e = f.set_location('e')
|
||||
if e != ('f', 'Python'):
|
||||
self.fail('wrong key,value returned: '+repr(e))
|
||||
else:
|
||||
try:
|
||||
e = f.set_location('e')
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
self.fail("set_location on non-existant key did not raise KeyError")
|
||||
|
||||
f.sync()
|
||||
f.close()
|
||||
# truth test
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue