Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 32ca442

Browse files
committed
Fix test_bsddb3.
1 parent 2cde0eb commit 32ca442

3 files changed

Lines changed: 64 additions & 62 deletions

File tree

Lib/bsddb/dbtables.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,10 @@
2727
from bsddb.db import *
2828

2929
# All table names, row names etc. must be ASCII strings
30+
# However, rowids, when represented as strings, are latin-1 encoded
3031
def _E(s):
3132
return s.encode("ascii")
3233

33-
# Yet, rowid are arbitrary bytes; if there is a need to hash
34-
# them, convert them to Latin-1 first
35-
def _D(s):
36-
return s.decode("latin-1")
37-
3834
# XXX(nnorwitz): is this correct? DBIncompleteError is conditional in _bsddb.c
3935
try:
4036
DBIncompleteError
@@ -55,22 +51,22 @@ def __call__(self, s):
5551

5652
class ExactCond(Cond):
5753
"""Acts as an exact match condition function"""
58-
def __init__(self, strtomatch):
59-
self.strtomatch = strtomatch
54+
def __init__(self, strtomatch, encoding="utf-8"):
55+
self.strtomatch = strtomatch.encode(encoding)
6056
def __call__(self, s):
6157
return s == self.strtomatch
6258

6359
class PrefixCond(Cond):
6460
"""Acts as a condition function for matching a string prefix"""
65-
def __init__(self, prefix):
66-
self.prefix = prefix
61+
def __init__(self, prefix, encoding="utf-8"):
62+
self.prefix = prefix.encode(encoding)
6763
def __call__(self, s):
6864
return s[:len(self.prefix)] == self.prefix
6965

7066
class PostfixCond(Cond):
7167
"""Acts as a condition function for matching a string postfix"""
72-
def __init__(self, postfix):
73-
self.postfix = postfix
68+
def __init__(self, postfix, encoding="utf-8"):
69+
self.postfix = postfix.encode(encoding)
7470
def __call__(self, s):
7571
return s[-len(self.postfix):] == self.postfix
7672

@@ -80,16 +76,17 @@ class LikeCond(Cond):
8076
string. Case insensitive and % signs are wild cards.
8177
This isn't perfect but it should work for the simple common cases.
8278
"""
83-
def __init__(self, likestr, re_flags=re.IGNORECASE):
79+
def __init__(self, likestr, re_flags=re.IGNORECASE, encoding="utf-8"):
8480
# escape python re characters
8581
chars_to_escape = '.*+()[]?'
8682
for char in chars_to_escape :
8783
likestr = likestr.replace(char, '\\'+char)
8884
# convert %s to wildcards
8985
self.likestr = likestr.replace('%', '.*')
9086
self.re = re.compile('^'+self.likestr+'$', re_flags)
87+
self.encoding = encoding
9188
def __call__(self, s):
92-
return self.re.match(s)
89+
return self.re.match(s.decode(self.encoding))
9390

9491
#
9592
# keys used to store database metadata
@@ -264,10 +261,11 @@ def CreateTable(self, table, columns):
264261
txn.commit()
265262
txn = None
266263
except DBError as dberror:
264+
raise TableDBError, dberror.args[1]
265+
finally:
267266
if txn:
268267
txn.abort()
269-
raise TableDBError, dberror.args[1]
270-
268+
txn = None
271269

272270
def ListTableColumns(self, table):
273271
"""Return a list of columns in the given table.
@@ -342,9 +340,10 @@ def CreateOrExtendTable(self, table, columns):
342340

343341
self.__load_column_info(table)
344342
except DBError as dberror:
343+
raise TableDBError, dberror.args[1]
344+
finally:
345345
if txn:
346346
txn.abort()
347-
raise TableDBError, dberror.args[1]
348347

349348

350349
def __load_column_info(self, table) :
@@ -419,7 +418,11 @@ def Insert(self, table, rowdict) :
419418
if txn:
420419
txn.abort()
421420
self.db.delete(_rowid_key(table, rowid))
421+
txn = None
422422
raise TableDBError, dberror.args[1], info[2]
423+
finally:
424+
if txn:
425+
txn.abort()
423426

424427

425428
def Modify(self, table, conditions={}, mappings={}):
@@ -465,10 +468,9 @@ def Modify(self, table, conditions={}, mappings={}):
465468
txn = None
466469

467470
# catch all exceptions here since we call unknown callables
468-
except:
471+
finally:
469472
if txn:
470473
txn.abort()
471-
raise
472474

473475
except DBError as dberror:
474476
raise TableDBError, dberror.args[1]
@@ -493,23 +495,23 @@ def Delete(self, table, conditions={}):
493495
for column in columns:
494496
# delete the data key
495497
try:
496-
self.db.delete(_data_key(table, column, rowid),
498+
self.db.delete(_data_key(table, column,
499+
rowid.encode("latin-1")),
497500
txn)
498501
except DBNotFoundError:
499502
# XXXXXXX column may not exist, assume no error
500503
pass
501504

502505
try:
503-
self.db.delete(_rowid_key(table, rowid), txn)
506+
self.db.delete(_rowid_key(table, rowid.encode("latin-1")), txn)
504507
except DBNotFoundError:
505508
# XXXXXXX row key somehow didn't exist, assume no error
506509
pass
507510
txn.commit()
508511
txn = None
509-
except DBError as dberror:
512+
finally:
510513
if txn:
511514
txn.abort()
512-
raise
513515
except DBError as dberror:
514516
raise TableDBError, dberror.args[1]
515517

@@ -603,7 +605,7 @@ def cmp_conditions(atuple, btuple):
603605
key, data = cur.set_range(searchkey)
604606
while key[:len(searchkey)] == searchkey:
605607
# extract the rowid from the key
606-
rowid = _D(key[-_rowid_str_len:])
608+
rowid = key[-_rowid_str_len:].decode("latin-1")
607609

608610
if rowid not in rejected_rowids:
609611
# if no condition was specified or the condition
@@ -706,6 +708,7 @@ def Drop(self, table):
706708
del self.__tablecolumns[table]
707709

708710
except DBError as dberror:
711+
raise TableDBError, dberror.args[1]
712+
finally:
709713
if txn:
710714
txn.abort()
711-
raise TableDBError, dberror.args[1]

Lib/bsddb/test/test_dbtables.py

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def test01(self):
7979
values = list(values)
8080

8181
colval = pickle.loads(values[0][colname])
82-
assert(colval > 3.141 and colval < 3.142)
82+
self.assertTrue(colval > 3.141 and colval < 3.142)
8383

8484

8585
def test02(self):
@@ -105,11 +105,11 @@ def test02(self):
105105
conditions={col0: lambda x: pickle.loads(x) >= 8})
106106
values = list(values)
107107

108-
assert len(values) == 2
109-
if values[0]['Species'] == 'Penguin' :
110-
assert values[1]['Species'] == 'SR-71A Blackbird'
111-
elif values[0]['Species'] == 'SR-71A Blackbird' :
112-
assert values[1]['Species'] == 'Penguin'
108+
self.assertEquals(len(values), 2)
109+
if values[0]['Species'] == b'Penguin' :
110+
self.assertEquals(values[1]['Species'], b'SR-71A Blackbird')
111+
elif values[0]['Species'] == b'SR-71A Blackbird' :
112+
self.assertEquals(values[1]['Species'], b'Penguin')
113113
else :
114114
if verbose:
115115
print("values= %r" % (values,))
@@ -139,13 +139,13 @@ def test03(self):
139139
{'a': "",
140140
'e': pickle.dumps([{4:5, 6:7}, 'foo'], 1),
141141
'f': "Zero"})
142-
assert 0
142+
self.fail("exception not raised")
143143
except dbtables.TableDBError:
144144
pass
145145

146146
try:
147147
self.tdb.Select(tabname, [], conditions={'foo': '123'})
148-
assert 0
148+
self.fail("exception not raised")
149149
except dbtables.TableDBError:
150150
pass
151151

@@ -174,22 +174,22 @@ def test03(self):
174174
values = self.tdb.Select(tabname, ['b', 'a', 'd'],
175175
conditions={'e': re.compile('wuzzy').search,
176176
'a': re.compile('^[0-9]+$').match})
177-
assert len(values) == 2
177+
self.assertEquals(len(values), 2)
178178

179179
# now lets delete one of them and try again
180180
self.tdb.Delete(tabname, conditions={'b': dbtables.ExactCond('good')})
181181
values = self.tdb.Select(
182182
tabname, ['a', 'd', 'b'],
183183
conditions={'e': dbtables.PrefixCond('Fuzzy')})
184184
values = list(values)
185-
assert len(values) == 1
186-
assert values[0]['d'] == None
185+
self.assertEquals(len(values), 1)
186+
self.assertEquals(values[0]['d'], None)
187187

188188
values = self.tdb.Select(tabname, ['b'],
189-
conditions={'c': lambda c: c == 'meep'})
189+
conditions={'c': lambda c: c.decode("ascii") == 'meep'})
190190
values = list(values)
191-
assert len(values) == 1
192-
assert values[0]['b'] == "bad"
191+
self.assertEquals(len(values), 1)
192+
self.assertEquals(values[0]['b'], b"bad")
193193

194194

195195
def test04_MultiCondSelect(self):
@@ -205,7 +205,7 @@ def test04_MultiCondSelect(self):
205205
{'a': "",
206206
'e': pickle.dumps([{4:5, 6:7}, 'foo'], 1),
207207
'f': "Zero"})
208-
assert 0
208+
self.fail("exception not raised")
209209
except dbtables.TableDBError:
210210
pass
211211

@@ -229,7 +229,7 @@ def test04_MultiCondSelect(self):
229229
'a': dbtables.ExactCond('A'),
230230
'd': dbtables.PrefixCond('-')
231231
} )
232-
assert len(values) == 0, values
232+
self.assertEquals(len(values), 0, values)
233233

234234

235235
def test_CreateOrExtend(self):
@@ -242,7 +242,7 @@ def test_CreateOrExtend(self):
242242
{'taste': 'crap',
243243
'filling': 'no',
244244
'is it Guinness?': 'no'})
245-
assert 0, "Insert should've failed due to bad column name"
245+
self.fail("Insert should've failed due to bad column name")
246246
except:
247247
pass
248248
self.tdb.CreateOrExtendTable(tabname,
@@ -277,17 +277,17 @@ def test_CondObjs(self):
277277
tabname, ['p', 'e'],
278278
conditions={'e': dbtables.PrefixCond('the l')})
279279
values = list(values)
280-
assert len(values) == 2, values
281-
assert values[0]['e'] == values[1]['e'], values
282-
assert values[0]['p'] != values[1]['p'], values
280+
self.assertEquals(len(values), 2)
281+
self.assertEquals(values[0]['e'], values[1]['e'])
282+
self.assertNotEquals(values[0]['p'], values[1]['p'])
283283

284284
values = self.tdb.Select(
285285
tabname, ['d', 'a'],
286286
conditions={'a': dbtables.LikeCond('%aardvark%')})
287287
values = list(values)
288-
assert len(values) == 1, values
289-
assert values[0]['d'] == "is for dog", values
290-
assert values[0]['a'] == "is for aardvark", values
288+
self.assertEquals(len(values), 1)
289+
self.assertEquals(values[0]['d'], b"is for dog")
290+
self.assertEquals(values[0]['a'], b"is for aardvark")
291291

292292
values = self.tdb.Select(tabname, None,
293293
{'b': dbtables.Cond(),
@@ -297,9 +297,9 @@ def test_CondObjs(self):
297297
'c':dbtables.PrefixCond('is for'),
298298
'p':lambda s: not s})
299299
values = list(values)
300-
assert len(values) == 1, values
301-
assert values[0]['d'] == "is for dog", values
302-
assert values[0]['a'] == "is for aardvark", values
300+
self.assertEquals(len(values), 1)
301+
self.assertEquals(values[0]['d'], b"is for dog")
302+
self.assertEquals(values[0]['a'], b"is for aardvark")
303303

304304
def test_Delete(self):
305305
tabname = "test_Delete"
@@ -315,7 +315,7 @@ def test_Delete(self):
315315
self.tdb.Delete(tabname, conditions={'x': dbtables.PrefixCond('X')})
316316
values = self.tdb.Select(tabname, ['y'],
317317
conditions={'x': dbtables.PrefixCond('X')})
318-
assert len(values) == 0
318+
self.assertEquals(len(values), 0)
319319

320320
def test_Modify(self):
321321
tabname = "test_Modify"
@@ -362,26 +362,26 @@ def remove_value(value):
362362
tabname, None,
363363
conditions={'Type': dbtables.ExactCond('Unknown')})
364364
values = list(values)
365-
assert len(values) == 1, values
366-
assert values[0]['Name'] == None, values
367-
assert values[0]['Access'] == None, values
365+
self.assertEquals(len(values), 1)
366+
self.assertEquals(values[0]['Name'], None)
367+
self.assertEquals(values[0]['Access'], None)
368368

369369
# Modify value by select conditions
370370
values = self.tdb.Select(
371371
tabname, None,
372372
conditions={'Name': dbtables.ExactCond('Nifty.MP3')})
373373
values = list(values)
374-
assert len(values) == 1, values
375-
assert values[0]['Type'] == "MP3", values
376-
assert values[0]['Access'] == "2", values
374+
self.assertEquals(len(values), 1)
375+
self.assertEquals(values[0]['Type'], b"MP3")
376+
self.assertEquals(values[0]['Access'], b"2")
377377

378378
# Make sure change applied only to select conditions
379379
values = self.tdb.Select(
380380
tabname, None, conditions={'Name': dbtables.LikeCond('%doc%')})
381381
values = list(values)
382-
assert len(values) == 1, values
383-
assert values[0]['Type'] == "Word", values
384-
assert values[0]['Access'] == "9", values
382+
self.assertEquals(len(values), 1)
383+
self.assertEquals(values[0]['Type'], b"Word")
384+
self.assertEquals(values[0]['Access'], b"9")
385385

386386

387387
def test_suite():

Lib/test/test_bsddb3.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@
2424
def suite():
2525
try:
2626
# this is special, it used to segfault the interpreter
27-
#import bsddb.test.test_1413192
28-
pass
27+
import bsddb.test.test_1413192
2928
except:
3029
for f in ['__db.001', '__db.002', '__db.003', 'log.0000000001']:
3130
unlink(f)

0 commit comments

Comments
 (0)