| 
									
										
										
										
											2002-12-30 20:44:16 +00:00
										 |  |  | """TestCases for using the DB.join and DBCursor.join_item methods.
 | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-28 08:05:56 +00:00
										 |  |  | import shutil | 
					
						
							| 
									
										
										
										
											2007-04-17 08:48:32 +00:00
										 |  |  | import sys, os | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | import tempfile | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | from pprint import pprint | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from threading import Thread, currentThread | 
					
						
							|  |  |  |     have_threads = 1 | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     have_threads = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2007-08-28 08:05:56 +00:00
										 |  |  | from bsddb.test.test_all import verbose | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-08 22:08:30 +00:00
										 |  |  | from bsddb import db, dbshelve, StringKeys | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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"), | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-08 22:08:30 +00:00
										 |  |  | def ASCII(s): | 
					
						
							|  |  |  |     return s.encode("ascii") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | class JoinTestCase(unittest.TestCase): | 
					
						
							|  |  |  |     keytype = '' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.filename = self.__class__.__name__ + '.db' | 
					
						
							| 
									
										
										
										
											2007-08-28 08:05:56 +00:00
										 |  |  |         self.homeDir = tempfile.mkdtemp() | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  |         self.env = db.DBEnv() | 
					
						
							| 
									
										
										
										
											2007-08-28 08:05:56 +00:00
										 |  |  |         self.env.open(self.homeDir, db.DB_CREATE | db.DB_INIT_MPOOL | db.DB_INIT_LOCK ) | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         self.env.close() | 
					
						
							| 
									
										
										
										
											2007-08-28 08:05:56 +00:00
										 |  |  |         shutil.rmtree(self.homeDir) | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test01_join(self): | 
					
						
							|  |  |  |         if verbose: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print('\n', '-=' * 30) | 
					
						
							|  |  |  |             print("Running %s.test01_join..." % \ | 
					
						
							|  |  |  |                   self.__class__.__name__) | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # create and populate primary index | 
					
						
							|  |  |  |         priDB = db.DB(self.env) | 
					
						
							|  |  |  |         priDB.open(self.filename, "primary", db.DB_BTREE, db.DB_CREATE) | 
					
						
							| 
									
										
										
										
											2007-08-08 22:08:30 +00:00
										 |  |  |         [priDB.put(ASCII(k),ASCII(v)) for k,v in ProductIndex] | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # 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) | 
					
						
							| 
									
										
										
										
											2007-08-08 22:08:30 +00:00
										 |  |  |         [secDB.put(ASCII(k),ASCII(v)) for k,v in ColorIndex] | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         sCursor = None | 
					
						
							|  |  |  |         jCursor = None | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             # lets look up all of the red Products | 
					
						
							|  |  |  |             sCursor = secDB.cursor() | 
					
						
							| 
									
										
										
										
											2003-07-21 18:43:33 +00:00
										 |  |  |             # Don't do the .set() in an assert, or you can get a bogus failure | 
					
						
							|  |  |  |             # when running python -O | 
					
						
							| 
									
										
										
										
											2007-08-08 22:08:30 +00:00
										 |  |  |             tmp = sCursor.set(b'red') | 
					
						
							| 
									
										
										
										
											2003-07-21 18:43:33 +00:00
										 |  |  |             assert tmp | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # 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]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-08 22:08:30 +00:00
										 |  |  |             if jCursor.get(0) != (b'apple', b"Convenience Store"): | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  |                 self.fail("join cursor positioned wrong") | 
					
						
							| 
									
										
										
										
											2007-08-08 22:08:30 +00:00
										 |  |  |             if jCursor.join_item() != b'chainsaw': | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  |                 self.fail("DBCursor.join_item returned wrong item") | 
					
						
							| 
									
										
										
										
											2007-08-08 22:08:30 +00:00
										 |  |  |             if jCursor.get(0)[0] != b'strawberry': | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  |                 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() | 
					
						
							| 
									
										
										
										
											2002-11-19 17:47:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 20:44:16 +00:00
										 |  |  | def test_suite(): | 
					
						
							|  |  |  |     suite = unittest.TestSuite() | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     suite.addTest(unittest.makeSuite(JoinTestCase)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-30 20:44:16 +00:00
										 |  |  |     return suite |