Infinit Logo Created with Sketch. memo logo
github logo  

Key-Value Store API Reference

A comprehensive reference guide to the complete key-value store API.

Overview

Here is the list of all methods used in the key-value store API.

Insert(InsertRequest) InsertResponse
Update(UpdateRequest) UpdateResponse
Upsert(UpsertRequest) UpsertResponse
Fetch(FetchRequest) FetchResponse
Delete(DeleteRequest) DeleteResponse
List(ListRequest) ListResponse

Generate Stubs

memo exposes a gRPC API, offering a portable and language-agnostic channel of interaction. gRPC relies on Protocol Buffers (protobuf) to serialize the remote procedure calls' (RPC) messages. The protocol format and the list of RPCs is described in a simple .proto file.

As a client, you need to download memo's official memo_kvs.proto file for interacting with the key-value store API. You then have to generate the package/module/header/class (depending on the language or your choice) that will provide you with functions to easily call the RPCs.

NOTE: In C++, you will need to build the gRPC plugin for protoc. A clear procedure is given by the gRPC website.

$ go get -u github.com/golang/protobuf/protoc-gen-go 
$ export KVS_PROTO_OUT=$GOPATH/src/google.golang.org/grpc/memo/kvs 
$ mkdir -p $KVS_PROTO_OUT 
$ protoc --proto_path=$HOME/Downloads --go_out=plugins=grpc:$KVS_PROTO_OUT $HOME/Downloads/memo_kvs.proto 
$ ls $KVS_PROTO_OUT 
memo_kvs.pb.go
$ export KVS_PROTO_OUT=$HOME/projects/memo/src 
$ mkdir -p $KVS_PROTO_OUT 
$ protoc --proto_path=$HOME/Downloads --cpp_out=$KVS_PROTO_OUT --plugin=protoc-gen-grpc=$(whereis grpc_cpp_plugin) --grpc_out=$KVS_PROTO_OUT $HOME/Downloads/memo_kvs.proto 
$ ls -lx $KVS_PROTO_OUT 
memo_kvs.grpc.pb.cc memo_kvs.grpc.pb.h memo_kvs.pb.cc memo_kvs.pb.h
$ python3 -m pip install grpcio grpcio-tools 
$ export KVS_PROTO_OUT=$HOME/projects/memo/src 
$ mkdir -p $KVS_PROTO_OUT 
$ python3 -m grpc_tools.protoc --proto_path=$HOME/Downloads --python_out=$KVS_PROTO_OUT --grpc_python_out=$KVS_PROTO_OUT $HOME/Downloads/memo_kvs.proto 
$ ls -lx $KVS_PROTO_OUT 
memo_kvs_pb2_grpc.py memo_kvs_pb2.py

Deploy memo

To deploy a memo key-value store exposing a gRPC interface, please follow our "getting started with memo" guide.

Methods

Insert

(InsertRequest) InsertResponse

Insert a value for the given key.

If the key is already present, the operation will fail.

def insert(key, value):
  store.Insert(kvs.InsertRequest(key = key, value = value.encode('utf-8')))
func insert(store kvs.KeyValueStoreClient, key string, value string) error {
  _, err := store.Insert(context.Background(), &kvs.InsertRequest{Key: key, Value: []byte(value)})
  return err
}
void
insert(std::string const& key, std::string const& value)
{
  InsertResponse res;
  {
    grpc::ClientContext ctx;
    InsertRequest req;
    req.set_key(key);
    req.set_value(value);
    auto status = store->Insert(&ctx, req, &res);
    if (!status.ok())
      throw std::runtime_error(status.error_message());
  }
}
Arguments
InsertRequest { string key,   bytes value }
string key
bytes value
Return
InsertResponse { }
Exceptions
ALREADY_EXISTS: The key already exists.
INVALID_ARGUMENT: The key or value format is invalid.

Update

(UpdateRequest) UpdateResponse

Update the value for the given key.

If the key is not already present, the operation will fail.

def update(key, value):
  store.Update(kvs.UpdateRequest(key = key, value = value.encode('utf-8')))
func update(store kvs.KeyValueStoreClient, key string, value string) error {
  _, err := store.Update(context.Background(), &kvs.UpdateRequest{Key: key, Value: []byte(value)})
  return err
}
void
update(std::string const& key, std::string const& value)
{
  UpdateResponse res;
  {
    grpc::ClientContext ctx;
    UpdateRequest req;
    req.set_key(key);
    req.set_value(value);
    auto status = store->Update(&ctx, req, &res);
    if (!status.ok())
      throw std::runtime_error(status.error_message());
  }
}
Arguments
UpdateRequest { string key,   bytes value }
string key
bytes value
Return
UpdateResponse { }
Exceptions
NOT_FOUND: The key doesn't exist.
INVALID_ARGUMENT: The key or value format is invalid.

Upsert

(UpsertRequest) UpsertResponse

Update (or insert if not present) a value for the given key.

def upsert(key, value):
  store.Upsert(kvs.UpsertRequest(key = key, value = value.encode('utf-8')))
func upsert(store kvs.KeyValueStoreClient, key string, value string) error {
  _, err := store.Upsert(context.Background(), &kvs.UpsertRequest{Key: key, Value: []byte(value)})
  return err
}
void
upsert(std::string const& key, std::string const& value)
{
  UpsertResponse res;
  {
    grpc::ClientContext ctx;
    UpsertRequest req;
    req.set_key(key);
    req.set_value(value);
    auto status = store->Upsert(&ctx, req, &res);
    if (!status.ok())
      throw std::runtime_error(status.error_message());
  }
}
Arguments
UpsertRequest { string key,   bytes value }
string key
bytes value
Return
UpsertResponse { }
Exceptions
INVALID_ARGUMENT: The key or value format is invalid.

Fetch

(FetchRequest) FetchResponse

Retrieve the value for the given key.

If the key doesn't exist, the operation will fail.

def fetch(key):
  return store.Fetch(kvs.FetchRequest(key = key)).value.decode('utf-8')
func fetch(store kvs.KeyValueStoreClient, key string) (string, error) {
  res, err := store.Fetch(context.Background(), &kvs.FetchRequest{Key: key})
  if err != nil {
    return "", err
  }
  return string(res.Value), nil
}
std::string
fetch(std::string const& key)
{
  FetchResponse res;
  {
    grpc::ClientContext ctx;
    FetchRequest req;
    req.set_key(key);
    auto status = store->Fetch(&ctx, req, &res);
    check_status(status);
  }
  return res.value();
}
Arguments
FetchRequest { string key }
string key
Return
FetchResponse { bytes value }
bytes value
Exceptions
NOT_FOUND: The key doesn't exist.
INVALID_ARGUMENT: The key format is invalid.

Delete

(DeleteRequest) DeleteResponse

Delete the value for the given key.

If the key doesn't exist, the operation will fail.

def delete(key):
  store.Delete(kvs.DeleteRequest(key = key))
func delete_(store kvs.KeyValueStoreClient, key string) error {
  _, err := store.Delete(context.Background(), &kvs.DeleteRequest{Key: key})
  return err
}
void
delete_(std::string const& key)
{
  DeleteResponse res;
  {
    grpc::ClientContext ctx;
    DeleteRequest req;
    req.set_key(key);
    auto status = store->Delete(&ctx, req, &res);
    if (!status.ok())
      throw std::runtime_error(status.error_message());
  }
}
Arguments
DeleteRequest { string key }
string key
Return
DeleteResponse { }
Exceptions
NOT_FOUND: The key doesn't exist.
INVALID_ARGUMENT: The key format is invalid.

List

(ListRequest) ListResponse

Return the list of keys.

def list_():
  return list(map(lambda i: i.key, store.List(kvs.ListRequest()).items))
func list(store kvs.KeyValueStoreClient) ([]string, error) {
  res, err := store.List(context.Background(), &kvs.ListRequest{})
  if err != nil {
    return nil, err
  }
  result := []string{}
  for _, i := range res.Items {
    result = append(result, i.Key)
  }
  return result, nil
}
std::vector
list()
{
  ListResponse res;
  {
    grpc::ClientContext ctx;
    ListRequest req;
    auto status = store->List(&ctx, req, &res);
  }
  std::vector list;
  for (int i = 0; i < res.items_size(); i++)
    list.push_back(res.items(i).key());
  return list;
}
Arguments
ListRequest { string prefix,   string marker,   string delimiter,   uint64 maxKeys }
string prefix
string marker
string delimiter
uint64 maxKeys
Return
ListResponse { ListItem items,   string prefixes,   bool truncated }
repeated ListItem items
repeated string prefixes
bool truncated
Exceptions
INVALID_ARGUMENT: One of the paramaters format is not valid.

Messages

InsertRequest

index name type abstract
1 key string The key
2 value bytes The value

InsertResponse

index name type abstract

UpdateRequest

index name type abstract
1 key string The key
2 value bytes The new value

UpdateResponse

index name type abstract

UpsertRequest

index name type abstract
1 key string The key
2 value bytes The new value

UpsertResponse

index name type abstract

FetchRequest

index name type abstract
1 key string The key of the value to fetch

FetchResponse

index name type abstract
1 value bytes The value

DeleteRequest

index name type abstract
1 key string The key of the value to delete

DeleteResponse

index name type abstract

ListRequest

index name type abstract
1 prefix string Limits the response to keys that begin with the specified prefix
2 marker string Specifies the key to start with when listing keys
3 delimiter string A delimiter is a character you use to group keys
4 maxKeys uint64 The maximum number of entries

ListItem

index name type abstract
1 key string A key

ListResponse

index name type abstract
1 items repeated ListItem The list of keys
2 prefixes repeated string List of prefix for the given delimiter
3 truncated bool If the list is truncated