private RecordHeader readRecordHeaderFromMappedBuffer(int pos) { RecordHeader header = new RecordHeader(); mappedDataBuffer.position(pos); header.setPosition(pos); header.setDataSize(mappedDataBuffer.getInt()); header.setFragmented(mappedDataBuffer.get()); if (header.isFragmented()) { header.setNextPos(mappedDataBuffer.getInt()); } return header; }
private RecordHeader readRecordHeaderFromChannel(int pos) throws IOException { RecordHeader header = new RecordHeader(); header.setPosition(pos); ByteBuffer buffer = ByteBuffer.allocate(RecordHeader.HEADER_BYTES); dataChannel.position(pos); dataChannel.read(buffer); buffer.flip(); header.setDataSize(buffer.getInt()); header.setFragmented(buffer.get()); if (header.isFragmented()) { header.setNextPos(buffer.getInt()); } return header; }
/* (non-Javadoc) * @see com.ongraphdb.store.DiskSore1#updateData(int, byte[], int) */ public void updateData(int pos, byte[] data, int blockSize) throws IOException { RecordHeader oldHeader = readRecordHeader(pos); RecordHeader newHeader = new RecordHeader().setPosition(pos).setDataSize(data.length).setFragmented(false); int oldRecordSize = getRecordSize(blockSize, oldHeader); int newRecordSize = getRecordSize(blockSize, newHeader); if (oldRecordSize >= newRecordSize) { if (oldHeader.isFragmented() || (oldRecordSize - newRecordSize > blockSize)) { // write tail to hole // write rest blocks to hole } writeRecordHeader(newHeader); writeRecordData(newHeader, data); } else { newHeader.setFragmented(true); newHeader.setDataSize(oldRecordSize - newHeader.getSize()); byte[] headData = new byte[newHeader.getDataSize()]; byte[] tailData = new byte[data.length - newHeader.getDataSize()]; System.arraycopy(data, 0, headData, 0, newHeader.getDataSize()); System.arraycopy(data, headData.length, tailData, 0, tailData.length); RecordHeader newTailHeader = new RecordHeader().setDataSize(tailData.length).setFragmented(false); int newRecordTailSize = getRecordSize(blockSize, newTailHeader); if (oldHeader.isFragmented()) { RecordHeader oldHeaderTail = readRecordHeader(oldHeader.getNextPos()); int oldRecordTailSize = getRecordSize(blockSize, oldHeaderTail); if (oldRecordTailSize >= newRecordSize) { newTailHeader.setPosition(oldHeaderTail.getPosition()); // write rest blocks to hole } else { // write tail to hole newTailHeader.setPosition(getNextPosition(newRecordTailSize)); } } else { newTailHeader.setPosition(getNextPosition(newRecordTailSize)); } newHeader.setNextPos(newTailHeader.getPosition()); writeRecordHeader(newHeader); writeRecordData(newHeader, headData); writeRecordHeader(newTailHeader); writeRecordData(newTailHeader, tailData); } }