w3c.tools.dbm.jdbm for large data

Toshiki Murata writes:
 > I used w3c.tools.dbm.jdbm for very large data(size > 7000).
 > Then w3c.tools.dbm.jdbm#lookup(key) cause
 > 
 >     java.lang.ArrayIndexOutOfBoundsException: 362
 > 	    at w3c.tools.dbm.jdbm.lookupBucket(jdbm.java:687)
 > 	    at w3c.tools.dbm.jdbm.lookup(jdbm.java:738)
 >
 > jdbm#splitBucket(jdbm.java:296)
 > 		dir_size <<= 1 ;
 > 		dir_adr    = allocateSpace(dir_size*4) ;
 > 		int      ndiridx[] = new int[dir_size] ;
 > 		for (int i = 0 ; i < (dir_size/2) ; i++) {
 > 		    ndiridx[2*i]   = diridx[i] ;
 > 		    ndiridx[2*i+1] = diridx[i] ;
 > 		}
 > 		diridx      = ndiridx ;
 > 		dir_bits    = newbits ;
 > 		dir_changed = true ;
 > So diridx[] is increased here.
 > 
 > jdbm#saveDirectory(jdbm.java:452)
 > 	for (int i = 0 ; i < diridx.length ; i++)
 > 	    out.writeInt(diridx[i]) ;
 > And increased diridx[] is written to jdbm file.
 > 
 > But I think jdbm#saveBucket(jdbm.java:439) perhaps over-writes
 > bucket data in diridx[] area.
 > ( because (jdbm.java:556) fileptr is not changed. )
 > 
 > I tried to fix this problem,
 > but it is difficult for me.

That's a difficult bug to track, I haven't tried storing such big
objects within that database. You may want to turn traces on (set
debug = true, in jdbm.java).

I think a related bug has been fixed (some times ago, check comments)
in jdbm::write(jdbmBucket, key, value) a long time ago.

Also you have to make sure to shtdown the database properly between to
runs of your application (otherwise you may have the files in a
inconsistent state), but I guess you did it ?

Anselm.

Received on Friday, 28 February 1997 04:59:33 UTC