package org.onosproject.store.service;

import java.util.Map;

/**
 * Service interface for a strongly consistent and durable
 * key value data store.
 */
public interface DatabaseService {

    /**
     * Reads the specified key.
     * @param tableName name of the table associated with this operation.
     * @param key key to read.
     * @return value (and version) associated with this key. This calls returns null if the key does not exist.
     */
    VersionedValue get(String tableName, String key);

    /**
     * Reads the whole table.
     *
     * @param tableName name of the table associated with this operation.
     * @return the whole table
     */
    Map<String, VersionedValue> getAll(String tableName);

    /**
     * Associate the key with a value.
     * @param tableName table name in which this key/value resides.
     * @param key key with which the specified value is to be associated
     * @param value value to be associated with the specified key
     * @return the previous value associated with the specified key, or null if there was no mapping for the key.
     */
    VersionedValue put(String tableName, String key, byte[] value);

    /**
     * If the specified key is not already associated with a value, associate it with the given value.
     * @param tableName table name in which this key/value resides.
     * @param key key with which the specified value is to be associated
     * @param value value to be associated with the specified key
     * @return true if put was successful, false if there is already a value associated with this key
     */
    boolean putIfAbsent(String tableName, String key, byte[] value);

    /**
     * Sets the key to the specified value if the version in the database (for that key)
     * matches the specified version.
     * @param tableName name of table associated with this operation.
     * @param key key
     * @param value value
     * @param version version that should present in the database for the put to be successful.
     * @return true if put was successful, false if there version in database is different from what is specified.
     */
    boolean putIfVersionMatches(String tableName, String key, byte[] value, long version);

    /**
     * Replaces the entry for a key only if currently mapped to a given value.
     * @param tableName name of table associated with this operation.
     * @param key with which the specified value is associated
     * @param oldValue value expected to be associated with the specified key
     * @param newValue value to be associated with the specified key
     * @return true if put was successful, false if there version in database is different from what is specified.
     */
    boolean putIfValueMatches(String tableName, String key, byte[] oldValue, byte[] newValue);

    /**
     * Removes the key (and associated value).
     * @param tableName name of table associated with this operation.
     * @param key key to remove
     * @return value previously associated with the key. This call returns null if the key does not exist.
     */
    VersionedValue remove(String tableName, String key);

    /**
     * Removes the key (and associated value) if the version in the database matches specified version.
     * @param tableName name of table associated with this operation.
     * @param key key to remove
     * @param version version that should present in the database for the remove to be successful.
     * @return true if remove was successful, false if there version in database is different from what is specified.
     */
    boolean removeIfVersionMatches(String tableName, String key, long version);

    /**
     * Removes the key (and associated value) if the value in the database matches specified value.
     * @param tableName name of table associated with this operation.
     * @param key key to remove
     * @param value value that should present in the database for the remove to be successful.
     * @return true if remove was successful, false if there value in database is different from what is specified.
     */
    boolean removeIfValueMatches(String tableName, String key, byte[] value);

    /**
     * Performs a batch read operation and returns the results.
     * @param batchRequest batch request.
     * @return result of the batch operation.
     */
    BatchReadResult batchRead(BatchReadRequest batchRequest);

    /**
     * Performs a batch write operation and returns the results.
     * This method provides transactional semantics. Either all writes succeed or none do.
     * Even a single write failure would cause the entire batch to be aborted.
     * In the case of unsuccessful operation, the batch result can be inspected to determine
     * which operation(s) caused the batch to fail.
     * @param batchRequest batch request.
     * @return result of the batch operation.
     */
    BatchWriteResult batchWrite(BatchWriteRequest batchRequest);
}
