Barry Warsaw | 74859f3 | 2002-12-30 20:44:16 +0000 | [diff] [blame] | 1 | """TestCases for using the DB.join and DBCursor.join_item methods. |
Martin v. Löwis | 1c6b1a2 | 2002-11-19 17:47:07 +0000 | [diff] [blame] | 2 | """ |
| 3 | |
Gregory P. Smith | 455d46f | 2003-07-09 04:45:59 +0000 | [diff] [blame^] | 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 | |
Martin v. Löwis | 1c6b1a2 | 2002-11-19 17:47:07 +0000 | [diff] [blame] | 15 | import unittest |
Gregory P. Smith | 455d46f | 2003-07-09 04:45:59 +0000 | [diff] [blame^] | 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() |
Martin v. Löwis | 1c6b1a2 | 2002-11-19 17:47:07 +0000 | [diff] [blame] | 110 | |
Martin v. Löwis | 1c6b1a2 | 2002-11-19 17:47:07 +0000 | [diff] [blame] | 111 | |
Barry Warsaw | 74859f3 | 2002-12-30 20:44:16 +0000 | [diff] [blame] | 112 | def test_suite(): |
| 113 | suite = unittest.TestSuite() |
Gregory P. Smith | 455d46f | 2003-07-09 04:45:59 +0000 | [diff] [blame^] | 114 | |
| 115 | suite.addTest(unittest.makeSuite(JoinTestCase)) |
| 116 | |
Barry Warsaw | 74859f3 | 2002-12-30 20:44:16 +0000 | [diff] [blame] | 117 | return suite |