| """TestCases for using the DB.join and DBCursor.join_item methods. |
| """ |
| |
| import sys, os, string |
| import tempfile |
| import time |
| from pprint import pprint |
| |
| try: |
| from threading import Thread, currentThread |
| have_threads = 1 |
| except ImportError: |
| have_threads = 0 |
| |
| import unittest |
| from .test_all import verbose |
| |
| try: |
| # For Pythons w/distutils pybsddb |
| from bsddb3 import db, dbshelve |
| except ImportError: |
| # For Python 2.3 |
| from bsddb import db, dbshelve |
| |
| |
| #---------------------------------------------------------------------- |
| |
| ProductIndex = [ |
| ('apple', "Convenience Store"), |
| ('blueberry', "Farmer's Market"), |
| ('shotgun', "S-Mart"), # Aisle 12 |
| ('pear', "Farmer's Market"), |
| ('chainsaw', "S-Mart"), # "Shop smart. Shop S-Mart!" |
| ('strawberry', "Farmer's Market"), |
| ] |
| |
| ColorIndex = [ |
| ('blue', "blueberry"), |
| ('red', "apple"), |
| ('red', "chainsaw"), |
| ('red', "strawberry"), |
| ('yellow', "peach"), |
| ('yellow', "pear"), |
| ('black', "shotgun"), |
| ] |
| |
| class JoinTestCase(unittest.TestCase): |
| keytype = '' |
| |
| def setUp(self): |
| self.filename = self.__class__.__name__ + '.db' |
| homeDir = os.path.join(os.path.dirname(sys.argv[0]), 'db_home') |
| self.homeDir = homeDir |
| try: os.mkdir(homeDir) |
| except os.error: pass |
| self.env = db.DBEnv() |
| self.env.open(homeDir, db.DB_CREATE | db.DB_INIT_MPOOL | db.DB_INIT_LOCK ) |
| |
| def tearDown(self): |
| self.env.close() |
| import glob |
| files = glob.glob(os.path.join(self.homeDir, '*')) |
| for file in files: |
| os.remove(file) |
| |
| def test01_join(self): |
| if verbose: |
| print '\n', '-=' * 30 |
| print "Running %s.test01_join..." % \ |
| self.__class__.__name__ |
| |
| # create and populate primary index |
| priDB = db.DB(self.env) |
| priDB.open(self.filename, "primary", db.DB_BTREE, db.DB_CREATE) |
| map(lambda t, priDB=priDB: priDB.put(*t), ProductIndex) |
| |
| # create and populate secondary index |
| secDB = db.DB(self.env) |
| secDB.set_flags(db.DB_DUP | db.DB_DUPSORT) |
| secDB.open(self.filename, "secondary", db.DB_BTREE, db.DB_CREATE) |
| map(lambda t, secDB=secDB: secDB.put(*t), ColorIndex) |
| |
| sCursor = None |
| jCursor = None |
| try: |
| # lets look up all of the red Products |
| sCursor = secDB.cursor() |
| # Don't do the .set() in an assert, or you can get a bogus failure |
| # when running python -O |
| tmp = sCursor.set('red') |
| assert tmp |
| |
| # FIXME: jCursor doesn't properly hold a reference to its |
| # cursors, if they are closed before jcursor is used it |
| # can cause a crash. |
| jCursor = priDB.join([sCursor]) |
| |
| if jCursor.get(0) != ('apple', "Convenience Store"): |
| self.fail("join cursor positioned wrong") |
| if jCursor.join_item() != 'chainsaw': |
| self.fail("DBCursor.join_item returned wrong item") |
| if jCursor.get(0)[0] != 'strawberry': |
| self.fail("join cursor returned wrong thing") |
| if jCursor.get(0): # there were only three red items to return |
| self.fail("join cursor returned too many items") |
| finally: |
| if jCursor: |
| jCursor.close() |
| if sCursor: |
| sCursor.close() |
| priDB.close() |
| secDB.close() |
| |
| |
| def test_suite(): |
| suite = unittest.TestSuite() |
| |
| suite.addTest(unittest.makeSuite(JoinTestCase)) |
| |
| return suite |