Example #1
0
 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;
 }
Example #2
0
 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;
 }
Example #3
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);
   }
 }