defmodule Immudb do
use GRPC.Server, service: Immudb.Schema.ImmuService.Service
alias Immudb.Client
alias Immudb.Socket
alias Immudb.KV
alias Immudb.Tx
alias Immudb.Database
alias Immudb.Sql
@spec new(url: String.t()) :: {:ok, Socket.t()} | {:error, String.t()}
@spec new(
host: String.t(),
port: integer(),
username: String.t(),
password: String.t(),
database: String.t()
) :: {:ok, Socket.t()} | {:error, String.t()}
def new(v) do
v |> Client.new()
end
@spec list_users(Socket.t()) ::
{:error, String.t() | atom()} | {:ok, [User.t()]}
def list_users(socket) do
socket |> Client.list_users()
end
@spec create_user(Socket.t(),
user: String.t(),
password: String.t(),
database: String.t(),
permission: atom()
) ::
{:error, String.t() | atom()} | {:ok, nil}
def create_user(socket,
user: user,
password: password,
database: database,
permission: permission
) do
socket
|> Client.create_user(
user: user,
password: password,
database: database,
permission: permission
)
end
@spec change_password(Socket.t(),
user: String.t(),
old_password: String.t(),
new_password: String.t()
) ::
{:error, String.t() | atom()} | {:ok, String.t()}
def change_password(socket,
user: user,
old_password: old_password,
new_password: new_password
) do
socket
|> Client.change_password(
user: user,
old_password: old_password,
new_password: new_password
)
end
# def update_auth_config(%Socket{} = socket, v) do
# socket |> Client.update_auth_config(v)
# end
# def update_mtls_confg(%Socket{} = socket, v) do
# socket |> Client.update_mtls_confg(v)
# end
@spec login(Socket.t(), String.t(), String.t()) ::
{:error, String.t() | atom()} | {:ok, String.t()}
def login(%Socket{channel: %GRPC.Channel{} = channel}, user, password) do
channel |> Client.login(user, password)
end
@spec logout(Socket.t()) ::
{:error, String.t() | atom()} | {:ok, nil}
def logout(socket) do
socket |> Client.logout()
end
@spec set(Socket.t(), binary(), binary()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.TxMetaData.t()}
def set(socket, key, value) do
socket |> KV.set(key, value)
end
@spec verifiable_set(Socket.t(), binary(), binary()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.VerifiableTx.t()}
def verifiable_set(socket, key, value) do
socket |> KV.verifiable_set(key, value)
end
@spec get(Socket.t(), binary()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.Entry.t()}
def get(socket, key) do
socket |> KV.get(key)
end
@spec verifiable_get(Socket.t(), binary()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.VerifiableEntry.t()}
def verifiable_get(socket, key) do
socket |> KV.verifiable_get(key)
end
@spec set_all(Socket.t(), [{binary(), binary()}]) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.TxMetaData.t()}
def set_all(socket, kvs) do
socket |> KV.set_all(kvs)
end
@spec get_all(Socket.t(), [binary()]) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.Entries.t()}
def get_all(socket, keys) do
socket |> KV.get_all(keys)
end
# def exec_all(socket, params) do
# socket.channel
# |> Stub.exec_all(
# Schema.ExecAllRequest.new(
# Operations: Schema.Op.new(nil),
# noWait: params.no_wait
# ),
# metadata: metadata(socket)
# )
# end
@spec scan(Socket.t(),
seek_key: binary(),
prefix: binary(),
desc: binary(),
limit: integer(),
since_tx: binary(),
no_wait: boolean()
) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.Entries.t()}
def scan(socket,
seek_key: seek_key,
prefix: prefix,
desc: desc,
limit: limit,
since_tx: since_tx,
no_wait: no_wait
) do
socket
|> KV.scan(
seek_key: seek_key,
prefix: prefix,
desc: desc,
limit: limit,
since_tx: since_tx,
no_wait: no_wait
)
end
@spec count(Socket.t(), [binary()]) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.EntryCount.t()}
def count(socket, prefix) do
socket |> KV.count(prefix)
end
@spec count_all(Socket.t()) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.EntryCount.t()}
def count_all(socket) do
socket |> KV.count_all()
end
@spec tx_by_id(Socket.t(), binary()) ::
{:error, String.t() | atom()} | {:ok, nil}
def tx_by_id(socket, tx) do
socket |> Tx.tx_by_id(tx)
end
@spec verifiable_tx_by_id(Socket.t(), binary(), binary()) ::
{:error, String.t() | atom()} | {:ok, nil}
def verifiable_tx_by_id(socket, tx, prove_since_tx) do
socket |> Tx.verifiable_tx_by_id(tx, prove_since_tx)
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, initial_tx: initial_tx, limit: limit, desc: desc) do
socket |> KV.tx_scan(initial_tx: initial_tx, limit: limit, desc: desc)
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, key,
offset: offset,
limit: limit,
desc: desc,
since_tx: since_tx
) do
socket
|> KV.history(key,
offset: offset,
limit: limit,
desc: desc,
since_tx: since_tx
)
end
@spec health(Socket.t()) ::
{:error, String.t() | atom()} | {:ok, nil}
def health(socket) do
socket |> Client.health()
end
@spec current_state(Socket.t()) ::
{:error, String.t() | atom()} | {:ok, nil}
def current_state(socket) do
socket |> Client.current_state()
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,
key: key,
referenced_key: referenced_key,
at_tx: at_tx,
bound_ref: bound_ref,
no_wait: no_wait
) do
socket
|> KV.set_reference(
key: key,
referenced_key: referenced_key,
at_tx: at_tx,
bound_ref: bound_ref,
no_wait: no_wait
)
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,
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
socket
|> KV.verifiable_set_reference(
key: key,
referenced_key: referenced_key,
at_tx: at_tx,
bound_ref: bound_ref,
no_wait: no_wait,
prove_since_tx: prove_since_tx
)
end
# def z_add(channel, params) do
# channel
# |> Stub.z_add(
# Schema.ZAddRequest.new(
# set: params.set,
# score: params.score,
# key: params.key,
# atTx: params.at_tx,
# boundRef: params.bound_ref,
# noWait: params.no_wait
# )
# )
# end
# def verifiable_z_add(channel, params) do
# channel
# |> Stub.verifiable_z_add(
# Schema.VerifiableZAddRequest.new(
# zAddRequest:
# Schema.ZAddRequest.new(
# set: params.set,
# score: params.score,
# key: params.key,
# atTx: params.at_tx,
# boundRef: params.bound_ref,
# noWait: params.no_wait
# ),
# proveSinceTx: params.prove_since_tx
# )
# )
# end
# def z_scan(channel, params) do
# channel
# |> Stub.z_scan(
# Schema.ZScanRequest.new(
# set: params.set,
# seekKey: params.seek_key,
# seekScore: params.seek_score,
# seekAtTx: params.seek_at_tx,
# inclusiveSeek: params.inclusive_seek,
# limit: params.limit,
# desc: params.desc,
# minScore: params.min_score,
# maxScore: params.max_score,
# sinceTx: params.since_tx,
# noWait: params.no_wait
# )
# )
# end
@spec create_database(Socket.t(), binary()) ::
{:error, String.t() | atom()} | {:ok, nil}
def create_database(socket, database_name) do
socket |> Database.create_database(database_name)
end
@spec list_databases(Socket.t()) ::
{:error, String.t() | atom()} | {:ok, nil}
def list_databases(socket) do
socket |> Database.list_database()
end
@spec use_database(Socket.t(), database_name: String.t()) ::
{:error, String.t()} | {:ok, String.t()}
def use_database(socket, database_name) do
socket |> Database.use_database(database_name)
end
@spec compact_index(Socket.t()) ::
{:error, String.t()} | {:ok, nil}
def compact_index(socket) do
socket |> Database.compact_index()
end
@spec change_permission(Socket.t(),
action: :GRANT | :REVOKE,
username: String.t(),
database: String.t(),
permission: atom()
) ::
{:error, String.t()} | {:ok, nil}
def change_permission(socket,
action: action,
username: username,
database: database,
permission: permission
) do
socket
|> Database.change_permission(
action: action,
username: username,
database: database,
permission: permission
)
end
@spec set_active_user(Socket.t(),
active: boolean(),
username: String.t()
) ::
{:error, String.t()} | {:ok, nil}
def set_active_user(socket, active: active, username: username) do
socket |> Database.set_active_user(active: active, username: username)
end
@spec stream_get(Socket.t(),
key: String.t(),
at_tx: integer(),
since_tx: integer()
) ::
{:error, String.t() | atom()} | {:ok, nil}
def stream_get(socket,
key: key,
at_tx: at_tx
) do
socket
|> Immudb.Stream.stream_get(
key: key,
at_tx: at_tx
)
end
def stream_get(socket,
key: key,
since_tx: since_tx
) do
socket
|> Immudb.Stream.stream_get(
key: key,
since_tx: since_tx
)
end
# def stream_set(_channel, _params) do
# end
@spec stream_verifiable_get(Socket.t(),
key: String.t(),
at_tx: integer(),
since_tx: integer(),
prove_since_tx: integer()
) ::
{:error, String.t() | atom()} | {:ok, nil}
def stream_verifiable_get(socket,
key: key,
at_tx: at_tx,
since_tx: since_tx,
prove_since_tx: prove_since_tx
) do
socket
|> Immudb.Stream.stream_verifiable_get(
key: key,
at_tx: at_tx,
since_tx: since_tx,
prove_since_tx: prove_since_tx
)
end
# def stream_verifiable_set(_channel, _params) do
# end
@spec stream_scan(Socket.t(),
seek_key: binary(),
prefix: binary(),
desc: binary(),
limit: integer(),
since_tx: binary(),
no_wait: boolean()
) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.Entries.t()}
def stream_scan(socket,
seekKey: seek_key,
prefix: prefix,
desc: desc,
limit: limit,
sinceTx: since_tx,
noWait: no_wait
) do
socket
|> Immudb.Stream.stream_scan(
seekKey: seek_key,
prefix: prefix,
desc: desc,
limit: limit,
sinceTx: since_tx,
noWait: no_wait
)
end
# def stream_z_scan(_channel, _params) do
# end
@spec stream_history(Socket.t(), binary(),
offset: integer(),
limit: integer(),
desc: boolean(),
since_tx: integer()
) ::
{:error, String.t() | atom()} | {:ok, Immudb.Schemas.Entries.t()}
def stream_history(socket, key,
offset: offset,
limit: limit,
desc: desc,
since_tx: since_tx
) do
socket
|> Immudb.Stream.stream_history(key,
offset: offset,
limit: limit,
desc: desc,
since_tx: since_tx
)
end
# def stream_exec_all(_channel, _params) do
# end
@spec use_snapshot(Socket.t(), integer(), integer()) ::
{:error, String.t() | atom()} | {:ok, nil}
def use_snapshot(socket, since_tx, as_before_tx) do
socket |> Tx.use_snapshot(since_tx, as_before_tx)
end
@spec sql_exec(Socket.t(), String.t()) ::
{:error, String.t()} | {:ok, nil}
def sql_exec(%Socket{} = socket, sql) do
socket |> Sql.sql_exec(sql)
end
def sql_exec(_, _) do
{:error, :invalid_params}
end
@spec sql_exec(Socket.t(), String.t(), [{String.t(), String.t()}]) ::
{:error, String.t()} | {:ok, nil}
def sql_exec(%Socket{} = socket, sql, kvs) do
socket |> Sql.sql_exec(sql, kvs)
end
def sql_exec(_, _, _) do
{:error, :invalid_params}
end
@spec sql_query(Socket.t(), String.t(), [{String.t(), String.t()}]) ::
{:error, String.t()} | {:ok, nil}
def sql_query(%Socket{} = socket, sql, kvs) do
socket |> Sql.sql_query(sql, kvs)
end
def sql_query(_, _, _) do
{:error, :invalid_params}
end
@spec list_tables(Socket.t()) ::
{:error, String.t()} | {:ok, nil}
def list_tables(%Socket{} = socket) do
socket |> Sql.list_tables()
end
def list_tables(_) do
{:error, :invalid_params}
end
@spec describe_table(Socket.t(), String.t()) ::
{:error, String.t()} | {:ok, nil}
def describe_table(%Socket{} = socket, table_name) do
socket |> Sql.describe_table(table_name)
end
def describe_table(_, _) do
{:error, :invalid_params}
end
@spec verifiable_sql_get(Socket.t(), map()) ::
{:error, String.t()} | {:ok, nil}
def verifiable_sql_get(%Socket{} = socket, params) do
socket |> Sql.verifiable_sql_get(params)
end
def verifiable_sql_get(_, _) do
{:error, :invalid_params}
end
end