Пример #1
0
 private void writeRecordHeaderToMappedBuffer(RecordHeader header) {
   mappedDataBuffer.position(header.getPosition());
   mappedDataBuffer.putInt(header.getDataSize());
   mappedDataBuffer.put(header.getFragmented());
   if (header.isFragmented()) {
     mappedDataBuffer.putInt(header.getNextPos());
   }
 }
Пример #2
0
 /* (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);
   }
 }
Пример #3
0
 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);
 }
Пример #4
0
 /* (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();
 }
Пример #5
0
 private void writeRecordDataToMappedBuffer(RecordHeader header, byte[] data) {
   mappedDataBuffer.position(header.getPosition() + header.getSize());
   mappedDataBuffer.put(data);
 }
Пример #6
0
 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);
 }
Пример #7
0
 private byte[] readRecordDataFromMappedBuffer(RecordHeader header) {
   byte[] data = new byte[header.getDataSize()];
   mappedDataBuffer.position(header.getPosition() + header.getSize());
   mappedDataBuffer.get(data);
   return data;
 }
Пример #8
0
 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();
 }
Пример #9
0
 private boolean isMapped(RecordHeader header) {
   return dataMappedMemorySize > (header.getPosition() + header.getSize() + header.getDataSize());
 }