From: Mark P. <mpr...@co...> - 2008-07-09 15:54:38
|
I've made this into some reusable code with unit tests. Provides two static help methods, one returns the id's as a List, the other returns the id's with values as a Map. The later could probably become a concrete Map implementation to lazy retrieve the data direct from the recman, rather than loading all the data - but it's a quick hack for now. Mark Mark Proctor wrote: > I've implemented something, based on the dumputility, that will iterate > over recid's putthem them into a list. My feedback on issues for this are: > BaseRecordManager is final, so can't be extended > Had to use reflection, and setting accessible, to access _pageman and _file > PageCursor is package protected so all of my code has to live in the > jdbm.recman namespace. > > Anyway here is the code, hope others find it useful. It generates a > number of strings and inserts them into a db, and then iterates it > retrieving all entries, it then asserts that all the information is correct: > > public static void test1() { > RecordManager recman; > > File fileDb = new File( DATABASE + ".db" ); > if ( fileDb.exists() ) { > fileDb.delete(); > } > File fileLg = new File( DATABASE + ".lg" ); > if ( fileLg.exists() ) { > fileLg.delete(); > } > > fileDb = new File( DATABASE + ".db" ); > fileLg = new File( DATABASE + ".lg" ); > assertTrue( !fileDb.exists() ); > assertTrue( !fileLg.exists() ); > > Properties props; > props = new Properties(); > > List<Long> ids = new ArrayList<Long>(); > > try { > // open database and setup an object cache > > recman = new BaseRecordManager( DATABASE ); > for ( int i = 0; i < 1000; i++ ) { > String str = StringGenerator.getUniqueID(); > //System.out.println( "Insert: " + str ); > ids.add( recman.insert( str ) ); > } > > Field pageManagerField = recman.getClass().getDeclaredField( > "_pageman" ); > Field fileField = recman.getClass().getDeclaredField( "_file" ); > > PageManager pageManager = null; > RecordFile file = null; > try { > pageManagerField.setAccessible( true ); > pageManager = (PageManager) pageManagerField.get( recman ); > > fileField.setAccessible( true ); > file = (RecordFile) fileField.get( recman ); > } catch ( Exception e ) { > e.printStackTrace(); > } > > //System.out.println( ids ); > > // #of translation pages scanned. > long npages = 0L; > > > List<Long> list = new ArrayList<Long>(); > PageCursor cursor = new PageCursor( pageManager, > Magic.TRANSLATION_PAGE ); > for ( long blockId = cursor.next(); blockId != 0; blockId = > cursor.next() ) { > BlockIo block = file.get( blockId ); > //System.out.println( "usedblock : " + block ); > > TranslationPage xlatPage = > TranslationPage.getTranslationPageView( block ); > > for ( int i = 0; i < TranslationPage.ELEMS_PER_PAGE; i++ ) { > short offset = (short) ( TranslationPage.O_TRANS + ( > i * PhysicalRowId.SIZE ) ); > Location physid = new Location( xlatPage.get( offset > ) ); > if( physid.getBlock() == 0 ) { > // Skip empty slot. > continue; > } > long recid = new Location( blockId, offset ).toLong(); > list.add ( recid > ); > } > file.release( block ); > } > > // check the assigned list size is the same as the search > list sized > //System.out.println( "now print data" ); > assertEquals( ids.size(), list.size() ); > for ( long id : list ) { > // check all searched ids match > //System.out.println( "id : " + id + " : " + > recman.fetch( id ) ); > assertTrue( ids.contains( id ) ); > } > > } catch ( Exception except ) { > except.printStackTrace(); > } > } > > public static class StringGenerator { > private static final int NUM_CHARS = 500; > > private static String chars = > "abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; > > private static Random r = new Random(); > > public static String getUniqueID() { > char[] buf = new char[NUM_CHARS]; > for (int i = 0; i < buf.length; i++) { > buf[i] = chars.charAt(r.nextInt(chars.length())); > } > return new String(buf); > } > } > > > > ------------------------------------------------------------------------- > Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW! > Studies have shown that voting for your favorite open source project, > along with a healthy diet, reduces your potential for chronic lameness > and boredom. Vote Now at http://www.sourceforge.net/community/cca08 > _______________________________________________ > Jdbm-general mailing list > Jdb...@li... > https://lists.sourceforge.net/lists/listinfo/jdbm-general > > |