private void writeRecordHeaderToMappedBuffer(RecordHeader header) { mappedDataBuffer.position(header.getPosition()); mappedDataBuffer.putInt(header.getDataSize()); mappedDataBuffer.put(header.getFragmented()); if (header.isFragmented()) { mappedDataBuffer.putInt(header.getNextPos()); } }
/* (non-Javadoc) * @see com.ongraphdb.store.DiskSore1#writeData(byte[], int) */ public int writeData(byte[] data, int blockSize) throws IOException { RecordHeader header = new RecordHeader().setDataSize(data.length).setFragmented(false); int recordSize = getRecordSize(blockSize, header); header.setPosition(getNextPosition(recordSize)); try { writeRecordHeader(header); writeRecordData(header, data); } catch (IOException e) { // write to hole throw e; } return header.getPosition(); }
/* (non-Javadoc) * @see com.ongraphdb.store.DiskSore1#readData(int) */ public byte[] readData(int pos) throws IOException { RecordHeader header = readRecordHeader(pos); byte[] data = readRecordData(header); if (header.isFragmented()) { byte[] result, tailData; tailData = readData(header.getNextPos()); result = new byte[data.length + tailData.length]; System.arraycopy(data, 0, result, 0, data.length); System.arraycopy(tailData, 0, result, data.length, tailData.length); return result; } return data; }
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); }
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; }
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; }
/* (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); } }