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

Skip to content

Commit 455d46f

Browse files
committed
bsddb 4.1.6:
* Extended DB & DBEnv set_get_returns_none functionality to take a "level" instead of a boolean flag. The boolean 0 and 1 values still have the same effect. A value of 2 extends the "return None instead of raising an exception" behaviour to the DBCursor set methods. This will become the default behaviour in pybsddb 4.2. * Fixed a typo in DBCursor.join_item method that made it crash instead of returning a value. Obviously nobody uses it. Wrote a test case for join and join_item.
1 parent bea57c6 commit 455d46f

6 files changed

Lines changed: 284 additions & 51 deletions

File tree

Lib/bsddb/dbobj.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
# implied.
1616
#
1717

18+
#
19+
# TODO it would be *really nice* to have an automatic shadow class populator
20+
# so that new methods don't need to be added here manually after being
21+
# added to _bsddb.c.
22+
#
23+
1824
import db
1925

2026
try:
@@ -57,6 +63,8 @@ def set_lk_max_objects(self, *args, **kwargs):
5763
return apply(self._cobj.set_lk_max_objects, args, kwargs)
5864
def set_mp_mmapsize(self, *args, **kwargs):
5965
return apply(self._cobj.set_mp_mmapsize, args, kwargs)
66+
def set_timeout(self, *args, **kwargs):
67+
return apply(self._cobj.set_timeout, args, kwargs)
6068
def set_tmp_dir(self, *args, **kwargs):
6169
return apply(self._cobj.set_tmp_dir, args, kwargs)
6270
def txn_begin(self, *args, **kwargs):

Lib/bsddb/dbtables.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@ def __init__(self, filename, dbhome, create=0, truncate=0, mode=0600,
155155
if truncate:
156156
myflags |= DB_TRUNCATE
157157
self.db = DB(self.env)
158+
# this code relies on DBCursor.set* methods to raise exceptions
159+
# rather than returning None
160+
self.db.set_get_returns_none(1)
158161
# allow duplicate entries [warning: be careful w/ metadata]
159162
self.db.set_flags(DB_DUP)
160163
self.db.open(filename, DB_BTREE, dbflags | myflags, mode)

Lib/bsddb/test/test_associate.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
TestCases for multi-threaded access to a DB.
2+
TestCases for DB.associate.
33
"""
44

55
import sys, os, string

Lib/bsddb/test/test_basics.py

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -282,11 +282,11 @@ def test02_DictionaryMethods(self):
282282

283283
#----------------------------------------
284284

285-
def test03_SimpleCursorStuff(self):
285+
def test03_SimpleCursorStuff(self, get_raises_error=0, set_raises_error=1):
286286
if verbose:
287287
print '\n', '-=' * 30
288-
print "Running %s.test03_SimpleCursorStuff..." % \
289-
self.__class__.__name__
288+
print "Running %s.test03_SimpleCursorStuff (get_error %s, set_error %s)..." % \
289+
(self.__class__.__name__, get_raises_error, set_raises_error)
290290

291291
if self.env and self.dbopenflags & db.DB_AUTO_COMMIT:
292292
txn = self.env.txn_begin()
@@ -300,7 +300,15 @@ def test03_SimpleCursorStuff(self):
300300
count = count + 1
301301
if verbose and count % 100 == 0:
302302
print rec
303-
rec = c.next()
303+
try:
304+
rec = c.next()
305+
except db.DBNotFoundError, val:
306+
if get_raises_error:
307+
assert val[0] == db.DB_NOTFOUND
308+
if verbose: print val
309+
rec = None
310+
else:
311+
self.fail("unexpected DBNotFoundError")
304312

305313
assert count == 1000
306314

@@ -311,7 +319,15 @@ def test03_SimpleCursorStuff(self):
311319
count = count + 1
312320
if verbose and count % 100 == 0:
313321
print rec
314-
rec = c.prev()
322+
try:
323+
rec = c.prev()
324+
except db.DBNotFoundError, val:
325+
if get_raises_error:
326+
assert val[0] == db.DB_NOTFOUND
327+
if verbose: print val
328+
rec = None
329+
else:
330+
self.fail("unexpected DBNotFoundError")
315331

316332
assert count == 1000
317333

@@ -322,23 +338,29 @@ def test03_SimpleCursorStuff(self):
322338
assert rec[1] == self.makeData('0505')
323339

324340
try:
325-
c.set('bad key')
341+
n = c.set('bad key')
326342
except db.DBNotFoundError, val:
327343
assert val[0] == db.DB_NOTFOUND
328344
if verbose: print val
329345
else:
330-
self.fail("expected exception")
346+
if set_raises_error:
347+
self.fail("expected exception")
348+
if n != None:
349+
self.fail("expected None: "+`n`)
331350

332351
rec = c.get_both('0404', self.makeData('0404'))
333352
assert rec == ('0404', self.makeData('0404'))
334353

335354
try:
336-
c.get_both('0404', 'bad data')
355+
n = c.get_both('0404', 'bad data')
337356
except db.DBNotFoundError, val:
338357
assert val[0] == db.DB_NOTFOUND
339358
if verbose: print val
340359
else:
341-
self.fail("expected exception")
360+
if get_raises_error:
361+
self.fail("expected exception")
362+
if n != None:
363+
self.fail("expected None: "+`n`)
342364

343365
if self.d.get_type() == db.DB_BTREE:
344366
rec = c.set_range('011')
@@ -414,6 +436,29 @@ def test03_SimpleCursorStuff(self):
414436
# SF pybsddb bug id 667343
415437
del oldcursor
416438

439+
def test03b_SimpleCursorWithoutGetReturnsNone0(self):
440+
# same test but raise exceptions instead of returning None
441+
if verbose:
442+
print '\n', '-=' * 30
443+
print "Running %s.test03b_SimpleCursorStuffWithoutGetReturnsNone..." % \
444+
self.__class__.__name__
445+
446+
old = self.d.set_get_returns_none(0)
447+
assert old == 1
448+
self.test03_SimpleCursorStuff(get_raises_error=1, set_raises_error=1)
449+
450+
def test03c_SimpleCursorGetReturnsNone2(self):
451+
# same test but raise exceptions instead of returning None
452+
if verbose:
453+
print '\n', '-=' * 30
454+
print "Running %s.test03c_SimpleCursorStuffWithoutSetReturnsNone..." % \
455+
self.__class__.__name__
456+
457+
old = self.d.set_get_returns_none(2)
458+
assert old == 1
459+
old = self.d.set_get_returns_none(2)
460+
assert old == 2
461+
self.test03_SimpleCursorStuff(get_raises_error=0, set_raises_error=0)
417462

418463
#----------------------------------------
419464

Lib/bsddb/test/test_join.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,117 @@
11
"""TestCases for using the DB.join and DBCursor.join_item methods.
22
"""
33

4+
import sys, os, string
5+
import tempfile
6+
import time
7+
from pprint import pprint
8+
9+
try:
10+
from threading import Thread, currentThread
11+
have_threads = 1
12+
except ImportError:
13+
have_threads = 0
14+
415
import unittest
16+
from test_all import verbose
17+
18+
try:
19+
# For Python 2.3
20+
from bsddb import db, dbshelve
21+
except ImportError:
22+
# For earlier Pythons w/distutils pybsddb
23+
from bsddb3 import db, dbshelve
24+
25+
26+
#----------------------------------------------------------------------
27+
28+
ProductIndex = [
29+
('apple', "Convenience Store"),
30+
('blueberry', "Farmer's Market"),
31+
('shotgun', "S-Mart"), # Aisle 12
32+
('pear', "Farmer's Market"),
33+
('chainsaw', "S-Mart"), # "Shop smart. Shop S-Mart!"
34+
('strawberry', "Farmer's Market"),
35+
]
36+
37+
ColorIndex = [
38+
('blue', "blueberry"),
39+
('red', "apple"),
40+
('red', "chainsaw"),
41+
('red', "strawberry"),
42+
('yellow', "peach"),
43+
('yellow', "pear"),
44+
('black', "shotgun"),
45+
]
46+
47+
class JoinTestCase(unittest.TestCase):
48+
keytype = ''
49+
50+
def setUp(self):
51+
self.filename = self.__class__.__name__ + '.db'
52+
homeDir = os.path.join(os.path.dirname(sys.argv[0]), 'db_home')
53+
self.homeDir = homeDir
54+
try: os.mkdir(homeDir)
55+
except os.error: pass
56+
self.env = db.DBEnv()
57+
self.env.open(homeDir, db.DB_CREATE | db.DB_INIT_MPOOL | db.DB_INIT_LOCK )
58+
59+
def tearDown(self):
60+
self.env.close()
61+
import glob
62+
files = glob.glob(os.path.join(self.homeDir, '*'))
63+
for file in files:
64+
os.remove(file)
65+
66+
def test01_join(self):
67+
if verbose:
68+
print '\n', '-=' * 30
69+
print "Running %s.test01_join..." % \
70+
self.__class__.__name__
71+
72+
# create and populate primary index
73+
priDB = db.DB(self.env)
74+
priDB.open(self.filename, "primary", db.DB_BTREE, db.DB_CREATE)
75+
map(lambda t: apply(priDB.put, t), ProductIndex)
76+
77+
# create and populate secondary index
78+
secDB = db.DB(self.env)
79+
secDB.set_flags(db.DB_DUP | db.DB_DUPSORT)
80+
secDB.open(self.filename, "secondary", db.DB_BTREE, db.DB_CREATE)
81+
map(lambda t: apply(secDB.put, t), ColorIndex)
82+
83+
sCursor = None
84+
jCursor = None
85+
try:
86+
# lets look up all of the red Products
87+
sCursor = secDB.cursor()
88+
assert sCursor.set('red')
89+
90+
# FIXME: jCursor doesn't properly hold a reference to its
91+
# cursors, if they are closed before jcursor is used it
92+
# can cause a crash.
93+
jCursor = priDB.join([sCursor])
94+
95+
if jCursor.get(0) != ('apple', "Convenience Store"):
96+
self.fail("join cursor positioned wrong")
97+
if jCursor.join_item() != 'chainsaw':
98+
self.fail("DBCursor.join_item returned wrong item")
99+
if jCursor.get(0)[0] != 'strawberry':
100+
self.fail("join cursor returned wrong thing")
101+
if jCursor.get(0): # there were only three red items to return
102+
self.fail("join cursor returned too many items")
103+
finally:
104+
if jCursor:
105+
jCursor.close()
106+
if sCursor:
107+
sCursor.close()
108+
priDB.close()
109+
secDB.close()
5110

6111

7112
def test_suite():
8113
suite = unittest.TestSuite()
114+
115+
suite.addTest(unittest.makeSuite(JoinTestCase))
116+
9117
return suite

0 commit comments

Comments
 (0)