@Override public void persistBlock(LeaveBlock block) throws JasDBStorageException { if(block instanceof LeaveBlockImpl && block.isModified()) { LOG.debug("Persisting block at position: {}", block.getPosition()); LeaveBlockImpl leaveBlock = (LeaveBlockImpl) block; List<Key> writeKeys = leaveBlock.getValues(); int nrKeys = writeKeys.size(); DataBlock dataBlock = block.getDataBlock(); dataBlock.reset(); dataBlock.getHeader().putLong(PREVIOUS_LEAVE_INDEX, leaveBlock.getProperties().getPreviousBlock()); dataBlock.getHeader().putLong(NEXT_LEAVE_INDEX, leaveBlock.getProperties().getNextBlock()); dataBlock.getHeader().putLong(PARENT_BLOCK_INDEX, leaveBlock.getParentPointer()); dataBlock.getHeader().putInt(AMOUNT_KEY_INDEX, nrKeys); LOG.debug("Writing amount of keys: {}", nrKeys); for(Key key : writeKeys) { dataBlock = keyInfo.writeKey(key, dataBlock); } } else if(block.isModified()) { throw new JasDBStorageException("Unable to store block, unexpected type"); } }
@Override public LeaveBlock loadBlock(DataBlock dataBlock) throws JasDBStorageException { LOG.debug("Loading block: {}", dataBlock); LeaveBlockImpl leaveBlock = createBlock(-1, dataBlock); LeaveBlockProperties properties = leaveBlock.getProperties(); properties.setModified(false); int amountOfKeys = dataBlock.getHeader().getInt(AMOUNT_KEY_INDEX); long nextBlock = dataBlock.getHeader().getLong(NEXT_LEAVE_INDEX); long previousBlock = dataBlock.getHeader().getLong(PREVIOUS_LEAVE_INDEX); long parent = dataBlock.getHeader().getLong(PARENT_BLOCK_INDEX); int offset = 0; DataBlock currentBlock = dataBlock; for(int i=0; i<amountOfKeys; i++) { KeyLoadResult loadedKeyResult = keyInfo.loadKey(offset, currentBlock); leaveBlock.addKey(loadedKeyResult.getLoadedKey()); currentBlock = loadedKeyResult.getEndBlock(); offset = loadedKeyResult.getNextOffset(); } properties.setNextBlock(nextBlock); properties.setPreviousBlock(previousBlock); properties.setModified(false); properties.setParentBlock(parent); return leaveBlock; }