defmodule Immudb.KV do
use Immudb.Grpc, :schema
alias Immudb.Socket
alias Immudb.Util
@spec set(Socket.t(), binary(), binary()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.TxMetaData.t()}
def set(%Socket{channel: %GRPC.Channel{} = channel, token: token}, key, value)
when key |> is_binary() and value |> is_binary() do
channel
|> Stub.set(
Schema.SetRequest.new(KVs: [Schema.KeyValue.new(key: key, value: value)]),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.TxMetaData.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def set(_, _, _) do
{:error, :invalid_params}
end
@spec verifiable_set(Socket.t(), binary(), binary()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.VerifiableTx.t()}
def verifiable_set(%Socket{channel: %GRPC.Channel{} = channel, token: token}, key, value)
when key |> is_binary() and value |> is_binary() do
channel
|> Stub.verifiable_set(
Schema.VerifiableSetRequest.new(
setRequest: Schema.SetRequest.new(KVs: [Schema.KeyValue.new(key: key, value: value)])
),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.VerifiableTx.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def verifiable_set(_, _, _) do
{:error, :invalid_params}
end
@spec get(Socket.t(), binary()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.Entry.t()}
def get(%Socket{channel: %GRPC.Channel{} = channel, token: token}, key)
when key |> is_binary() do
channel
|> Stub.get(
Schema.KeyRequest.new(key: key),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.Entry.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def get(_, _) do
{:error, :invalid_params}
end
@spec verifiable_get(Socket.t(), binary()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.VerifiableTx.t()}
def verifiable_get(%Socket{channel: %GRPC.Channel{} = channel, token: token}, key)
when key |> is_binary() do
channel
|> Stub.verifiable_get(
Schema.VerifiableGetRequest.new(keyRequest: Schema.KeyRequest.new(key: key)),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.VerifiableEntry.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def verifiable_get(_, _) do
{:error, :invalid_params}
end
@spec set_all(Socket.t(), [{binary(), binary()}]) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.TxMetaData.t()}
def set_all(%Socket{channel: %GRPC.Channel{} = channel, token: token}, kvs) do
kvs =
kvs
|> Enum.map(fn {key, value} ->
Schema.KeyValue.new(key: key, value: value)
end)
channel
|> Stub.set(
Schema.SetRequest.new(KVs: kvs),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.TxMetaData.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def set_all(_, _) do
{:error, :invalid_params}
end
@spec get_all(Socket.t(), [{binary(), binary()}]) ::
{:error, String.t() | atom()} | {:ok, nil}
def get_all(%Socket{channel: %GRPC.Channel{} = channel, token: token}, keys) do
channel
|> Stub.get_all(
Schema.KeyListRequest.new(keys: keys),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.Entries.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def get_all(_, _) do
{:error, :invalid_params}
end
@spec scan(Socket.t(),
seek_key: binary(),
prefix: binary(),
desc: boolean(),
limit: integer(),
since_tx: integer(),
no_wait: boolean()
) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.Entries.t()}
def scan(%Socket{channel: %GRPC.Channel{} = channel, token: token},
seek_key: seek_key,
prefix: prefix,
desc: desc,
limit: limit,
since_tx: since_tx,
no_wait: no_wait
) do
channel
|> Stub.scan(
Schema.ScanRequest.new(
seekKey: seek_key,
prefix: prefix,
desc: desc,
limit: limit,
sinceTx: since_tx,
noWait: no_wait
),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.Entries.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def scan(_, _) do
{:error, :invalid_params}
end
@spec count(Socket.t(), [binary()]) ::
{:error, String.t() | atom()} | {:ok, EntryCount.t()}
def count(%Socket{channel: %GRPC.Channel{} = channel, token: token}, prefix) do
channel
|> Stub.count(Schema.KeyPrefix.new(prefix: prefix), metadata: token |> Util.metadata())
|> case do
{:ok, %{count: count}} ->
{:ok, %Immudb.Schemas.EntryCount{count: count}}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def count(_, _) do
{:error, :invalid_params}
end
@spec count_all(Socket.t()) ::
{:error, String.t() | atom()} | {:ok, EntryCount.t()}
def count_all(%Socket{channel: %GRPC.Channel{} = channel, token: token}) do
channel
|> Stub.count_all(Protobuf.Empty.new(), metadata: token |> Util.metadata())
|> case do
{:ok, %{count: count}} ->
{:ok, %Immudb.Schemas.EntryCount{count: count}}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def count_all(_) do
{:error, :invalid_params}
end
@spec tx_scan(Socket.t(), initial_tx: integer(), limit: integer(), desc: boolean()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.TxList.t()}
def tx_scan(%Socket{channel: %GRPC.Channel{} = channel, token: token},
initial_tx: initial_tx,
limit: limit,
desc: desc
) do
channel
|> Stub.tx_scan(
Schema.TxScanRequest.new(
initialTx: initial_tx,
limit: limit,
desc: desc
),
metadata: token |> Util.metadata()
)
|> case do
{:ok, %{txs: txs}} ->
{:ok, %Immudb.Schemas.TxList{txs: txs}}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def tx_scan(_, _) do
{:error, :invalid_params}
end
@spec history(Socket.t(), binary(),
offset: integer(),
limit: integer(),
desc: boolean(),
since_tx: integer()
) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.Entries.t()}
def history(%Socket{channel: %GRPC.Channel{} = channel, token: token}, key,
offset: offset,
limit: limit,
desc: desc,
since_tx: since_tx
) do
channel
|> Stub.history(
Schema.HistoryRequest.new(
key: key,
offset: offset,
limit: limit,
desc: desc,
sinceTx: since_tx
),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.Entries.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def history(_, _, _) do
{:error, :invalid_params}
end
@spec set_reference(Socket.t(),
key: binary(),
referenced_key: binary(),
at_tx: integer(),
bound_ref: boolean(),
no_wait: boolean()
) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.TxMetaData.t()}
def set_reference(%Socket{channel: %GRPC.Channel{} = channel, token: token},
key: key,
referenced_key: referenced_key,
at_tx: at_tx,
bound_ref: bound_ref,
no_wait: no_wait
) do
channel
|> Stub.set_reference(
Schema.ReferenceRequest.new(
key: key,
referencedKey: referenced_key,
atTx: at_tx,
boundRef: bound_ref,
noWait: no_wait
),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.TxMetaData.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def set_reference(_, _) do
{:error, :invalid_params}
end
@spec set_reference(Socket.t(),
key: binary(),
referenced_key: binary(),
at_tx: integer(),
bound_ref: boolean(),
no_wait: boolean(),
prove_since_tx: integer()
) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.VerifiableTx.t()}
def verifiable_set_reference(%Socket{channel: %GRPC.Channel{} = channel, token: token},
key: key,
referenced_key: referenced_key,
at_tx: at_tx,
bound_ref: bound_ref,
no_wait: no_wait,
prove_since_tx: prove_since_tx
) do
channel
|> Stub.verifiable_set_reference(
Schema.VerifiableReferenceRequest.new(
referenceRequest:
Schema.ReferenceRequest.new(
key: key,
referencedKey: referenced_key,
atTx: at_tx,
boundRef: bound_ref,
noWait: no_wait
),
proveSinceTx: prove_since_tx
),
metadata: token |> Util.metadata()
)
|> case do
{:ok, v} ->
{:ok, v |> Immudb.Schemas.VerifiableTx.convert()}
{:error, %GRPC.RPCError{message: message}} ->
{:error, message}
_ ->
{:error, :unknown}
end
end
def verifiable_set_reference(_, _) do
{:error, :invalid_params}
end
end