home *** CD-ROM | disk | FTP | other *** search
- """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 Python 2.3
- from bsddb import db, dbshelve
- except ImportError:
- # For earlier Pythons w/distutils pybsddb
- from bsddb3 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: apply(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: apply(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
-