private void free( Location id ) throws IOException { // get the rowid, and write a zero current size into it. BlockIo curBlock = file.get( id.getBlock() ); RecordHeader hdr = new RecordHeader( curBlock, id.getOffset() ); hdr.setCurrentSize( 0 ); file.release( id.getBlock(), true ); // write the rowid to the free list freePageManager.put( id, hdr.getAvailableSize() ); }
public String toString() { return "RH( " + block.getBlockId() + " : " + pos + ", avl = " + getAvailableSize() + ", cur = " + getCurrentSize() + " )"; } }
/** Sets the available size */ static void setAvailableSize(final BlockIo block, final short pos,int value) { // if(value != roundAvailableSize(value)) // throw new IllegalArgumentException("value is not rounded"); int oldCurrSize = getCurrentSize(block,pos); block.writeUnsignedShort(pos + O_AVAILABLESIZE, convert(value)); setCurrentSize(block,pos,oldCurrSize); }
curPage = DataPage.getDataPageView( curBlock ); curPage.setFirst( DataPage.O_DATA ); RecordHeader hdr = new RecordHeader( curBlock, DataPage.O_DATA ); hdr.setAvailableSize( 0 ); hdr.setCurrentSize( 0 ); } else { curBlock = file.get( start ); RecordHeader hdr = new RecordHeader( curBlock, pos ); while ( hdr.getAvailableSize() != 0 && pos < RecordFile.BLOCK_SIZE ) { pos += hdr.getAvailableSize() + RecordHeader.SIZE; if ( pos == RecordFile.BLOCK_SIZE ) { hdr = new RecordHeader( curBlock, pos ); hdr.setAvailableSize( size ); file.release( start, true ); size = freeHere; hdr.setAvailableSize( size ); file.release( start, true );
curPage = DataPage.getDataPageView(curBlock,BLOCK_SIZE); curPage.setFirst(DataPage.O_DATA); RecordHeader.setAvailableSize(curBlock, DataPage.O_DATA, 0); RecordHeader.setCurrentSize(curBlock, DataPage.O_DATA, 0); } else { curBlock = file.get(start); while (RecordHeader.getAvailableSize(curBlock, hdr) != 0 && pos < BLOCK_SIZE) { pos += RecordHeader.getAvailableSize(curBlock, hdr) + RecordHeader.SIZE; if (pos == BLOCK_SIZE) { if ((DATA_PER_PAGE - lastSize) < (RecordHeader.SIZE + 16)) { size += (DATA_PER_PAGE - lastSize); size = RecordHeader.roundAvailableSize(size); RecordHeader.setAvailableSize(curBlock, hdr, size); file.release(start, true); size = freeHere; RecordHeader.setAvailableSize(curBlock, hdr, size); file.release(start, true);
/** * Updates an existing record. Returns the possibly changed * physical rowid. */ Location update( Location rowid, byte[] data, int start, int length ) throws IOException { // fetch the record header BlockIo block = file.get( rowid.getBlock() ); RecordHeader head = new RecordHeader( block, rowid.getOffset() ); if ( length > head.getAvailableSize() ) { // not enough space - we need to copy to a new rowid. file.release( block ); free( rowid ); rowid = alloc( length ); } else { file.release( block ); } // 'nuff space, write it in and return the rowid. write( rowid, data, start, length ); return rowid; }
RecordHeader hdr = new RecordHeader( block, rowid.getOffset() ); hdr.setCurrentSize( length ); if ( length == 0 ) { file.release( curs.getCurrent(), true );
RecordHeader head = new RecordHeader( block, rowid.getOffset() ); byte[] retval = new byte[ head.getCurrentSize() ]; if ( retval.length == 0 ) { file.release( curs.getCurrent(), false );
private void free(long id) throws IOException { // get the rowid, and write a zero current size into it. BlockIo curBlock = file.get(Location.getBlock(id)); DataPage curPage = DataPage.getDataPageView(curBlock,BLOCK_SIZE); RecordHeader.setCurrentSize(curBlock, Location.getOffset(id), 0); file.release(Location.getBlock(id), true); // write the rowid to the free list freeman.put(id, RecordHeader.getAvailableSize(curBlock, Location.getOffset(id))); }
/** Returns the current size */ static int getCurrentSize(final BlockIo block, final short pos) { int s = block.readUnsignedshort(pos + O_CURRENTSIZE); if(s == BlockIo.UNSIGNED_SHORT_MAX) return 0; return getAvailableSize(block, pos) - s; }
BlockIo block = file.get(curs.getCurrent()); short hdr = Location.getOffset(rowid); RecordHeader.setCurrentSize(block, hdr, length); if (length == 0) { file.release(curs.getCurrent(), true);
final int size = RecordHeader.getCurrentSize(block,head); if (size == 0) { file.release(curs.getCurrent(), false);
/** Returns the available size */ static int getAvailableSize(final BlockIo block, final short pos) { int val = block.readUnsignedshort(pos + O_AVAILABLESIZE); return deconvert(val); }
curPage = DataPage.getDataPageView( curBlock ); curPage.setFirst( DataPage.O_DATA ); RecordHeader hdr = new RecordHeader( curBlock, DataPage.O_DATA ); hdr.setAvailableSize( 0 ); hdr.setCurrentSize( 0 ); } else { curBlock = file.get( start ); RecordHeader hdr = new RecordHeader( curBlock, pos ); while ( hdr.getAvailableSize() != 0 && pos < RecordFile.BLOCK_SIZE ) { pos += hdr.getAvailableSize() + RecordHeader.SIZE; if ( pos == RecordFile.BLOCK_SIZE ) { hdr = new RecordHeader( curBlock, pos ); hdr.setAvailableSize( size ); file.release( start, true ); size = freeHere; hdr.setAvailableSize( size ); file.release( start, true );
/** * Updates an existing record. Returns the possibly changed * physical rowid. */ Location update( Location rowid, byte[] data, int start, int length ) throws IOException { // fetch the record header BlockIo block = pageManager.getRecordFile().get( rowid.getBlock() ); RecordHeader head = new RecordHeader( block, rowid.getOffset() ); if ( length > head.getAvailableSize() ) { // not enough space - we need to copy to a new rowid. pageManager.getRecordFile().release( block ); free( rowid ); rowid = alloc( length ); } else { pageManager.getRecordFile().release( block ); } // 'nuff space, write it in and return the rowid. write( rowid, data, start, length ); return rowid; }
RecordHeader hdr = new RecordHeader( block, rowid.getOffset() ); hdr.setCurrentSize( length ); if ( length == 0 ) { file.release( curs.getCurrent(), true );
RecordHeader head = new RecordHeader( block, rowid.getOffset() ); byte[] retval = new byte[ head.getCurrentSize() ]; if ( retval.length == 0 ) { file.release( curs.getCurrent(), false );
/** Sets the current size */ static void setCurrentSize(final BlockIo block, final short pos,int value) { if(value == 0){ block.writeUnsignedShort(pos + O_CURRENTSIZE, BlockIo.UNSIGNED_SHORT_MAX); return; } int availSize = getAvailableSize(block,pos); if(value < (availSize - MAX_SIZE_SPACE) || value>availSize) throw new IllegalArgumentException("currentSize out of bounds, need to realocate "+value+ " - "+availSize); block.writeUnsignedShort(pos + O_CURRENTSIZE, availSize - value); }
curPage = DataPage.getDataPageView( curBlock ); curPage.setFirst( DataPage.O_DATA ); RecordHeader hdr = new RecordHeader( curBlock, DataPage.O_DATA ); hdr.setAvailableSize( 0 ); hdr.setCurrentSize( 0 ); RecordHeader hdr = new RecordHeader( curBlock, pos ); while ( hdr.getAvailableSize() != 0 && pos < RecordFile.BLOCK_SIZE ) pos += hdr.getAvailableSize() + RecordHeader.SIZE; hdr = new RecordHeader( curBlock, pos ); hdr.setAvailableSize( size ); file.release( start, true ); hdr.setAvailableSize( size ); file.release( start, true );