package freenet.store;
import java.io.IOException;
import freenet.node.stats.StoreAccessStats;
import freenet.node.useralerts.UserAlertManager;
import freenet.support.Ticker;
/**
* Datastore interface
*/
public interface FreenetStore<T extends StorableBlock> {
public enum StoreType {
CHK, PUBKEY, SSK
};
/**
* Retrieve a block. Use the StoreCallback to convert it to the appropriate type of block.
* @param routingKey The routing key i.e. the database key under which the block is stored.
* @param dontPromote If true, don't promote the block to the top of the LRU.
* @return A StorableBlock, or null if the key cannot be found.
* @param canReadClientCache Whether we can read the client-cache, for purposes of finding
* the pubkey for an SSK.
* @param canWriteClientCache Whether we can write the client-cache, for purposes of finding
* the pubkey for an SSK.
* @param canWriteDatastore Whether we can write the datastore, for purposes of finding the
* pubkey for an SSK.
* @throws IOException If a disk I/O error occurs.
*/
T fetch(byte[] routingKey, byte[] fullKey, boolean dontPromote, boolean canReadClientCache, boolean canReadSlashdotCache, boolean ignoreOldBlocks, BlockMetadata meta) throws IOException;
/**
* Store a block.
*
* @throws KeyCollisionException
* If the key already exists and <code>callback.collisionPossible()</code> is
* <code>true</code>.
* @param overwrite
* If true, overwrite old content rather than throwing a
* <code>KeyCollisionException</code>.
* @param oldBlock
* If true, the block really shouldn't be in the datastore, but we are storing
* it anyway; it should not have the new block flag, so it should be excluded
* from Bloom filter sharing.
*/
public void put(T block, byte[] data, byte[] header,
boolean overwrite, boolean oldBlock) throws IOException, KeyCollisionException;
/**
* Change the store size.
* @param maxStoreKeys The maximum number of keys to be cached.
* @param shrinkNow If false, don't shrink the store immediately.
* @throws IOException
* @throws DatabaseException
*/
public void setMaxKeys(long maxStoreKeys, boolean shrinkNow) throws IOException;
public long getMaxKeys();
public long hits();
public long misses();
public long writes();
public long keyCount();
public long getBloomFalsePositive();
/**
* Check if a routing key probably
*
* @param routingkey
* @return <code>false</code> <b>only</b> if the key does not exist in store.
*/
public boolean probablyInStore(byte[] routingKey);
public abstract StoreAccessStats getSessionAccessStats();
public abstract StoreAccessStats getTotalAccessStats();
public boolean start(Ticker ticker, boolean longStart) throws IOException;
public void close();
public void setUserAlertManager(UserAlertManager userAlertManager);
public FreenetStore<T> getUnderlyingStore();
}