/**
*
*/
package smartkv.client;
import java.util.Collection;
import smartkv.client.util.Serializer;
import smartkv.client.util.UnsafeJavaSerializer;
import smartkv.server.DataStoreVersion;
import smartkv.server.RequestType;
import com.google.common.collect.Lists;
/**
* @author fabiim
*
*/
public class KeyValueProxy extends AbstractDatastoreProxy implements KeyValueDatastoreProxy{
//FIXME set version of the data store.
private Serializer<Collection<byte[]>> serializer = UnsafeJavaSerializer.getInstance();
public KeyValueProxy(int cid){
super(cid);
}
/*
* @see bonafide.datastore.DatastoreProxy#get(java.lang.String, byte[])
*/
@Override
public DatastoreValue get(String tableName, byte[] key) {
RequestType type = RequestType.GET_VALUE_IN_TABLE;
byte[] request = concatArrays(
type.byteArrayOrdinal,
getBytes(tableName),
getBytes(key.length),
key);
return invokeRequest(type, request);
}
@Override
public DatastoreValue getByReference(String tableName, byte[] key) {
RequestType type = RequestType.GET_VALUE_IN_TABLE_BY_REFERENCE;
byte[] request = concatArrays(
type.byteArrayOrdinal,
getBytes(tableName),
getBytes(key.length),
key);
return invokeRequest(type, request);
}
/*
* @see bonafide.datastore.DatastoreProxy#put(java.lang.String, byte[], byte[])
*/
@Override
public DatastoreValue put(String tableName, byte[] key, byte[] value) {
RequestType type = RequestType.PUT_VALUE_IN_TABLE;
byte[] request = concatArrays(
type.byteArrayOrdinal,
getBytes(tableName),
getBytes(key.length),
key,
value);
return invokeRequest(type, request);
}
/*
* @see bonafide.datastore.DatastoreProxy#insert(java.lang.String, byte[], byte[])
*/
@Override
public boolean insert(String tableName, byte[] key, byte[] value) {
RequestType type = RequestType.INSERT_VALUE_IN_TABLE;
byte[] request = concatArrays(
type.byteArrayOrdinal,
getBytes(tableName),
getBytes(key.length),
key,
value);
byte[] result = invokeRequestWithRawReturn(type, request);
return result != null;
}
/*
* @see bonafide.datastore.DatastoreProxy#remove(java.lang.String, byte[])
*/
@Override
public DatastoreValue remove(String tableName, byte[] key) {
RequestType type = RequestType.REMOVE_VALUE_FROM_TABLE;
byte[] request = concatArrays(
type.byteArrayOrdinal,
getBytes(tableName),
getBytes(key.length),
key);
DatastoreValue result = invokeRequest(type, request);
return result;
}
/*
* @see bonafide.datastore.DatastoreProxy#replace(java.lang.String, byte[], byte[], byte[])
*/
@Override
public boolean replace(String tableName, byte[] key, byte[] oldValue,
byte[] newValue) {
RequestType type = RequestType.ATOMIC_REPLACE_VALUE_IN_TABLE;
byte[] request = concatArrays(
type.byteArrayOrdinal,
getBytes(tableName),
getBytes(key.length),
key,
getBytes(oldValue.length),
oldValue,
newValue);
byte[] result = invokeRequestWithRawReturn(type, request);
return result != null;
}
@Override
public boolean remove(String tableName, byte[] key, byte[] expectedValue) {
RequestType type = RequestType.ATOMIC_REMOVE_IF_VALUE;
byte[] request = concatArrays(
type.byteArrayOrdinal,
getBytes(tableName),
getBytes(key.length),
key,
expectedValue
);
byte[] result = invokeRequestWithRawReturn(type, request);
return result != null;
}
/*
* @see bonafide.datastore.DatastoreProxy#putIfAbsent(java.lang.String, byte[], byte[])
*/
@Override
public DatastoreValue putIfAbsent(String tableName, byte[] key, byte[] value) {
RequestType type = RequestType.ATOMIC_PUT_IF_ABSENT;
byte[] request = concatArrays(
type.byteArrayOrdinal,
getBytes(tableName),
getBytes(key.length),
key,
value
);
DatastoreValue result = invokeRequest(type, request);
return result;
}
/* (non-Javadoc)
* @see bonafide.datastore.AbstractDatastoreProxy#version()
*/
@Override
protected DataStoreVersion version() {
return DataStoreVersion.KEY_VALUE;
}
/* (non-Javadoc)
* @see bonafide.datastore.KeyValueDatastoreProxy#values()
*/
@Override
//FIXME
public Collection<DatastoreValue> values(String tableName) {
RequestType type = RequestType.VALUES;
byte[] request = concatArrays(type.byteArrayOrdinal, getBytes(tableName));
byte[] result = invokeRequestWithRawReturn(type, request);
Collection<byte[]> vals = result != null ? serializer.deserialize(result) : null;
if (vals == null) return null;
Collection<DatastoreValue> finalValues = Lists.newArrayList();
for (byte[] v : vals){
finalValues.add(new DatastoreValue(v));
}
return finalValues;
}
}