blob: 11bc2ce8e6283520d60bbd5391a1f8f890071297 [file]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
defmodule Fluss.Admin do
@moduledoc """
Admin client for DDL operations (create/drop databases and tables).
## Examples
admin = Fluss.Admin.new!(conn)
:ok = Fluss.Admin.create_database(admin, "my_db")
database_descriptor =
Fluss.DatabaseDescriptor.new()
|> Fluss.DatabaseDescriptor.comment("App data")
:ok = Fluss.Admin.create_database(admin, "another_db", database_descriptor)
schema = Fluss.Schema.new() |> Fluss.Schema.column("ts", :bigint)
descriptor = Fluss.TableDescriptor.new!(schema)
:ok = Fluss.Admin.create_table(admin, "my_db", "events", descriptor)
"""
alias Fluss.Native
@type t :: reference()
@spec new(Fluss.Connection.t()) :: {:ok, t()} | {:error, Fluss.Error.t()}
def new(conn) do
case Native.admin_new(conn) do
{:error, _} = err -> err
admin -> {:ok, admin}
end
end
@spec new!(Fluss.Connection.t()) :: t()
def new!(conn) do
case new(conn) do
{:ok, admin} -> admin
{:error, %Fluss.Error{} = err} -> raise err
end
end
@spec get_server_nodes(t()) :: {:ok, [Fluss.ServerNode.t()]} | {:error, Fluss.Error.t()}
def get_server_nodes(admin) do
admin
|> Native.admin_get_server_nodes()
|> Native.await_nif()
end
@spec get_server_nodes!(t()) :: [Fluss.ServerNode.t()]
def get_server_nodes!(admin) do
case get_server_nodes(admin) do
{:ok, nodes} -> nodes
{:error, %Fluss.Error{} = err} -> raise err
end
end
@spec create_database(t(), String.t(), Fluss.DatabaseDescriptor.t() | nil, boolean()) ::
:ok | {:error, Fluss.Error.t()}
def create_database(admin, name, descriptor \\ nil, ignore_if_exists \\ true) do
admin
|> Native.admin_create_database(name, descriptor, ignore_if_exists)
|> Native.await_nif()
end
@spec get_database_info(t(), String.t()) ::
{:ok, Fluss.DatabaseInfo.t()} | {:error, Fluss.Error.t()}
def get_database_info(admin, database_name) do
admin
|> Native.admin_get_database_info(database_name)
|> Native.await_nif()
end
@spec get_database_info!(t(), String.t()) :: Fluss.DatabaseInfo.t()
def get_database_info!(admin, database_name) do
case get_database_info(admin, database_name) do
{:ok, info} -> info
{:error, %Fluss.Error{} = err} -> raise err
end
end
@spec drop_database(t(), String.t(), boolean()) :: :ok | {:error, Fluss.Error.t()}
def drop_database(admin, name, ignore_if_not_exists \\ true) do
admin
|> Native.admin_drop_database(name, ignore_if_not_exists)
|> Native.await_nif()
end
@spec list_databases(t()) :: {:ok, [String.t()]} | {:error, Fluss.Error.t()}
def list_databases(admin) do
admin
|> Native.admin_list_databases()
|> Native.await_nif()
end
@spec list_databases!(t()) :: [String.t()]
def list_databases!(admin) do
case list_databases(admin) do
{:ok, dbs} -> dbs
{:error, %Fluss.Error{} = err} -> raise err
end
end
@spec database_exists(t(), String.t()) :: {:ok, boolean()} | {:error, Fluss.Error.t()}
def database_exists(admin, database_name) do
admin
|> Native.admin_database_exists(database_name)
|> Native.await_nif()
end
@spec database_exists!(t(), String.t()) :: boolean()
def database_exists!(admin, database_name) do
case database_exists(admin, database_name) do
{:ok, exists} -> exists
{:error, %Fluss.Error{} = err} -> raise err
end
end
@spec create_table(t(), String.t(), String.t(), Fluss.TableDescriptor.t(), boolean()) ::
:ok | {:error, Fluss.Error.t()}
def create_table(admin, database, table, descriptor, ignore_if_exists \\ true) do
admin
|> Native.admin_create_table(database, table, descriptor, ignore_if_exists)
|> Native.await_nif()
end
@spec drop_table(t(), String.t(), String.t(), boolean()) :: :ok | {:error, Fluss.Error.t()}
def drop_table(admin, database, table, ignore_if_not_exists \\ true) do
admin
|> Native.admin_drop_table(database, table, ignore_if_not_exists)
|> Native.await_nif()
end
@spec list_tables(t(), String.t()) :: {:ok, [String.t()]} | {:error, Fluss.Error.t()}
def list_tables(admin, database) do
admin
|> Native.admin_list_tables(database)
|> Native.await_nif()
end
@spec list_tables!(t(), String.t()) :: [String.t()]
def list_tables!(admin, database) do
case list_tables(admin, database) do
{:ok, tables} -> tables
{:error, %Fluss.Error{} = err} -> raise err
end
end
@spec table_exists(t(), String.t(), String.t()) :: {:ok, boolean()} | {:error, Fluss.Error.t()}
def table_exists(admin, database_name, table_name) do
admin
|> Native.admin_table_exists(database_name, table_name)
|> Native.await_nif()
end
@spec table_exists!(t(), String.t(), String.t()) :: boolean()
def table_exists!(admin, database_name, table_name) do
case table_exists(admin, database_name, table_name) do
{:ok, exists} -> exists
{:error, %Fluss.Error{} = err} -> raise err
end
end
@spec get_table_info(t(), String.t(), String.t()) ::
{:ok, Fluss.TableInfo.t()} | {:error, Fluss.Error.t()}
def get_table_info(admin, database_name, table_name) do
admin
|> Native.admin_get_table_info(database_name, table_name)
|> Native.await_nif()
end
@spec get_table_info!(t(), String.t(), String.t()) :: Fluss.TableInfo.t()
def get_table_info!(admin, database_name, table_name) do
case get_table_info(admin, database_name, table_name) do
{:ok, table_info} -> table_info
{:error, %Fluss.Error{} = err} -> raise err
end
end
@spec get_table_schema(t(), String.t(), String.t(), integer() | nil) ::
{:ok, Fluss.SchemaInfo.t()} | {:error, Fluss.Error.t()}
def get_table_schema(admin, database_name, table_name, schema_id \\ nil) do
admin
|> Native.admin_get_table_schema(database_name, table_name, schema_id)
|> Native.await_nif()
end
@spec get_table_schema!(t(), String.t(), String.t(), integer() | nil) :: Fluss.SchemaInfo.t()
def get_table_schema!(admin, database_name, table_name, schema_id \\ nil) do
case get_table_schema(admin, database_name, table_name, schema_id) do
{:ok, schema_info} -> schema_info
{:error, %Fluss.Error{} = err} -> raise err
end
end
end