package freenet.store;
import java.io.IOException;
import freenet.crypt.DSAPublicKey;
import freenet.keys.CHKBlock;
import freenet.keys.CHKVerifyException;
import freenet.keys.KeyVerifyException;
import freenet.keys.NodeCHK;
import freenet.support.Logger;
public class CHKStore extends StoreCallback<CHKBlock> {
@Override
public boolean collisionPossible() {
return false;
}
@Override
public CHKBlock construct(byte[] data, byte[] headers,
byte[] routingKey, byte[] fullKey, boolean canReadClientCache, boolean canReadSlashdotCache, BlockMetadata meta, DSAPublicKey ignored) throws KeyVerifyException {
if(data == null || headers == null) throw new CHKVerifyException("Need either data and headers");
return CHKBlock.construct(data, headers, NodeCHK.cryptoAlgorithmFromFullKey(fullKey));
}
public CHKBlock fetch(NodeCHK chk, boolean dontPromote, boolean ignoreOldBlocks, BlockMetadata meta) throws IOException {
// FIXME optimize: change API so we can just pass in the crypto algorithm rather than having to construct the full key???
return store.fetch(chk.getRoutingKey(), chk.getFullKey(), dontPromote, false, false, ignoreOldBlocks, meta);
}
public void put(CHKBlock b, boolean isOldBlock) throws IOException {
try {
store.put(b, b.getRawData(), b.getRawHeaders(), false, isOldBlock);
} catch (KeyCollisionException e) {
Logger.error(this, "Impossible for CHKStore: "+e, e);
}
}
@Override
public int dataLength() {
return CHKBlock.DATA_LENGTH;
}
@Override
public int fullKeyLength() {
return NodeCHK.FULL_KEY_LENGTH;
}
@Override
public int headerLength() {
return CHKBlock.TOTAL_HEADERS_LENGTH;
}
@Override
public int routingKeyLength() {
return NodeCHK.KEY_LENGTH;
}
@Override
public boolean storeFullKeys() {
// Worth the extra two file descriptors, because if we have the keys we can do lazy
// reconstruction i.e. don't construct each block, just transcode from the .keys file
// straight into the database.
return true;
}
@Override
public boolean constructNeedsKey() {
return false;
}
@Override
public byte[] routingKeyFromFullKey(byte[] keyBuf) {
return NodeCHK.routingKeyFromFullKey(keyBuf);
}
}