| 
									
										
										
										
											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: | 
					
						
							| 
									
										
										
										
											2008-06-13 02:00:47 +00:00
										 |  |  |     from threading import Thread, current_thread | 
					
						
							| 
									
										
										
										
											2003-07-09 04:45:59 +00:00
										 |  |  |     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
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 61143-61144,61146-61147,61150-61151,61157,61165-61168,61170-61173,61176-61177,61183 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r61143 | barry.warsaw | 2008-03-01 03:23:38 +0100 (Sat, 01 Mar 2008) | 2 lines
  Bump to version 2.6a1
........
  r61144 | barry.warsaw | 2008-03-01 03:26:42 +0100 (Sat, 01 Mar 2008) | 1 line
  bump idle version number
........
  r61146 | fred.drake | 2008-03-01 03:45:07 +0100 (Sat, 01 Mar 2008) | 2 lines
  fix typo
........
  r61147 | barry.warsaw | 2008-03-01 03:53:36 +0100 (Sat, 01 Mar 2008) | 1 line
  Add date to NEWS
........
  r61150 | barry.warsaw | 2008-03-01 04:00:52 +0100 (Sat, 01 Mar 2008) | 1 line
  Give IDLE a release date
........
  r61151 | barry.warsaw | 2008-03-01 04:15:20 +0100 (Sat, 01 Mar 2008) | 1 line
  More copyright year and version number bumps
........
  r61157 | barry.warsaw | 2008-03-01 18:11:41 +0100 (Sat, 01 Mar 2008) | 2 lines
  Set things up for 2.6a2.
........
  r61165 | georg.brandl | 2008-03-02 07:28:16 +0100 (Sun, 02 Mar 2008) | 2 lines
  It's 2.6 now.
........
  r61166 | georg.brandl | 2008-03-02 07:32:32 +0100 (Sun, 02 Mar 2008) | 2 lines
  Update year.
........
  r61167 | georg.brandl | 2008-03-02 07:44:08 +0100 (Sun, 02 Mar 2008) | 2 lines
  Make patchlevel print out the release if called as a script.
........
  r61168 | georg.brandl | 2008-03-02 07:45:40 +0100 (Sun, 02 Mar 2008) | 2 lines
  New default basename for HTML help files.
........
  r61170 | raymond.hettinger | 2008-03-02 11:59:31 +0100 (Sun, 02 Mar 2008) | 1 line
  Finish-up docs for combinations() and permutations() in itertools.
........
  r61171 | raymond.hettinger | 2008-03-02 12:17:51 +0100 (Sun, 02 Mar 2008) | 1 line
  Tighten example code.
........
  r61172 | raymond.hettinger | 2008-03-02 12:57:16 +0100 (Sun, 02 Mar 2008) | 1 line
  Simplify code for itertools.product().
........
  r61173 | raymond.hettinger | 2008-03-02 13:02:19 +0100 (Sun, 02 Mar 2008) | 1 line
  Handle 0-tuples which can be singletons.
........
  r61176 | georg.brandl | 2008-03-02 14:41:39 +0100 (Sun, 02 Mar 2008) | 2 lines
  Make clear that the constants are strings.
........
  r61177 | georg.brandl | 2008-03-02 15:15:04 +0100 (Sun, 02 Mar 2008) | 2 lines
  Fix factual error.
........
  r61183 | gregory.p.smith | 2008-03-02 21:00:53 +0100 (Sun, 02 Mar 2008) | 4 lines
  Modify import of test_support so that the code can also be used with a
  stand alone distribution of bsddb that includes its own small copy of
  test_support for the needed functionality on older pythons.
........
											
										 
											2008-03-02 22:46:37 +00:00
										 |  |  | try: | 
					
						
							|  |  |  |     from bsddb3 import test_support | 
					
						
							|  |  |  | except ImportError: | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  |     from test import support as test_support | 
					
						
							| 
									
										
										
										
											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' | 
					
						
							| 
									
										
										
										
											2008-02-25 12:39:23 +00:00
										 |  |  |         homeDir = os.path.join(tempfile.gettempdir(), 'db_home%d'%os.getpid()) | 
					
						
							|  |  |  |         self.homeDir = homeDir | 
					
						
							|  |  |  |         try: os.mkdir(homeDir) | 
					
						
							|  |  |  |         except os.error: pass | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							| 
									
										
										
										
											2008-02-25 12:39:23 +00:00
										 |  |  |         test_support.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 |