package it.cavallium.strangedb.database.blocks; import it.cavallium.strangedb.database.DatabaseFileIO; import it.cavallium.strangedb.database.IBlocksIO; import it.cavallium.strangedb.database.IBlocksMetadata; import java.io.IOException; import java.nio.ByteBuffer; import java.util.concurrent.CompletionException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import static it.cavallium.strangedb.database.IBlocksMetadata.EMPTY_BLOCK_ID; public class DatabaseBlocksIO implements IBlocksIO { private final DatabaseFileIO fileIO; private final IBlocksMetadata blocksMetadata; public DatabaseBlocksIO(DatabaseFileIO fileIO, IBlocksMetadata blocksMetadata) { this.fileIO = fileIO; this.blocksMetadata = blocksMetadata; } @Override public long newBlock(int size, ByteBuffer data) throws IOException { if (size == 0) { return EMPTY_BLOCK_ID; } long index = fileIO.writeAtEnd(size, data); return blocksMetadata.newBlock(index, size); } @Override public ByteBuffer readBlock(long blockId) throws IOException { if (blockId == EMPTY_BLOCK_ID) { return ByteBuffer.wrap(new byte[0]); } BlockInfo blockInfo = blocksMetadata.getBlockInfo(blockId); return fileIO.readAt(blockInfo.getIndex(), blockInfo.getSize()); } @Override public void close() { } }