private void writeRecordHeaderToChannel(RecordHeader header) throws IOException { ByteBuffer buffer = ByteBuffer.allocate(header.getSize()); buffer.putInt(header.getDataSize()); buffer.put(header.getFragmented()); if (header.isFragmented()) { buffer.putInt(header.getNextPos()); } buffer.flip(); dataChannel.position(header.getPosition()); dataChannel.write(buffer); }
/* (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); } }
private void writeRecordDataToMappedBuffer(RecordHeader header, byte[] data) { mappedDataBuffer.position(header.getPosition() + header.getSize()); mappedDataBuffer.put(data); }
private void writeRecordDataToChannel(RecordHeader header, byte[] data) throws IOException { ByteBuffer buffer = ByteBuffer.wrap(data); dataChannel.position(header.getPosition() + header.getSize()); dataChannel.write(buffer); dataChannel.force(false); }
private byte[] readRecordDataFromMappedBuffer(RecordHeader header) { byte[] data = new byte[header.getDataSize()]; mappedDataBuffer.position(header.getPosition() + header.getSize()); mappedDataBuffer.get(data); return data; }
private byte[] readRecordDataFromChannel(RecordHeader header) throws IOException { ByteBuffer buffer = ByteBuffer.allocate(header.getDataSize()); dataChannel.position(header.getPosition() + header.getSize()); dataChannel.read(buffer); return buffer.array(); }
private boolean isMapped(RecordHeader header) { return dataMappedMemorySize > (header.getPosition() + header.getSize() + header.getDataSize()); }
protected int getRecordSize(int blockSize, RecordHeader header) { return ((header.getSize() + header.getDataSize() + blockSize - 1) / blockSize) * blockSize; }