Skip to content

Commit

Permalink
Adding appender/3 with conn, schema_name, table_name
Browse files Browse the repository at this point in the history
  • Loading branch information
tautQD committed Oct 10, 2024
1 parent e0462d6 commit 0ea8066
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 8 deletions.
46 changes: 38 additions & 8 deletions c_src/nif.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -346,21 +346,50 @@ fetch_all(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {

static ERL_NIF_TERM
appender(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
if (argc < 2 || argc > 3) {
return enif_make_badarg(env);
}

erlang_resource<duckdb::Connection>* connres = nullptr;
if(!enif_get_resource(env, argv[0], connection_nif_type, (void**)&connres))
if (!enif_get_resource(env, argv[0], connection_nif_type, (void**)&connres)) {
return enif_make_badarg(env);
}

ErlNifBinary binary_table_name;
if (!enif_inspect_binary(env, argv[1], &binary_table_name))
return enif_make_badarg(env);
if (argc == 2) {
// Only table name is provided
if (!enif_inspect_binary(env, argv[1], &binary_table_name)) {
return enif_make_badarg(env);
}

std::string table_name((const char*)binary_table_name.data, binary_table_name.size);
std::string table_name((const char*)binary_table_name.data, binary_table_name.size);

if (!connres->data->TableInfo(table_name))
return nif::make_error_tuple(env, "Table '" + table_name + "' could not be found");
if (!connres->data->TableInfo(table_name))
return nif::make_error_tuple(env, "Table '" + table_name + "' could not be found");

ErlangResourceBuilder<duckdb::Appender> resource_builder(appender_nif_type, *connres->data, table_name);
return nif::make_ok_tuple(env, resource_builder.make_and_release_resource(env));
ErlangResourceBuilder<duckdb::Appender> resource_builder(appender_nif_type, *connres->data, table_name);
return nif::make_ok_tuple(env, resource_builder.make_and_release_resource(env));
} else {
ErlNifBinary binary_schema_name;

// Schema name and table name are provided
if (!enif_inspect_binary(env, argv[1], &binary_schema_name)) {
return enif_make_badarg(env);
}
if (!enif_inspect_binary(env, argv[2], &binary_table_name)) {
return enif_make_badarg(env);
}

std::string schema_name((const char*)binary_schema_name.data, binary_schema_name.size);
std::string table_name((const char*)binary_table_name.data, binary_table_name.size);

if (!connres->data->TableInfo(schema_name, table_name)) {
return nif::make_error_tuple(env, "Table '" + schema_name + "." + table_name + "' could not be found");
}

ErlangResourceBuilder<duckdb::Appender> resource_builder(appender_nif_type, *connres->data, schema_name, table_name);
return nif::make_ok_tuple(env, resource_builder.make_and_release_resource(env));
}
}

static ERL_NIF_TERM
Expand Down Expand Up @@ -599,6 +628,7 @@ static ErlNifFunc nif_funcs[] = {
{"fetch_chunk", 1, fetch_chunk, ERL_NIF_DIRTY_JOB_IO_BOUND},
{"fetch_all", 1, fetch_all, ERL_NIF_DIRTY_JOB_IO_BOUND},
{"appender", 2, appender, ERL_NIF_DIRTY_JOB_IO_BOUND},
{"appender", 3, appender, ERL_NIF_DIRTY_JOB_IO_BOUND},
{"appender_add_row", 2, appender_add_row, ERL_NIF_DIRTY_JOB_IO_BOUND},
{"appender_add_rows", 2, appender_add_rows, ERL_NIF_DIRTY_JOB_IO_BOUND},
{"appender_flush", 1, appender_flush, ERL_NIF_DIRTY_JOB_IO_BOUND},
Expand Down
3 changes: 3 additions & 0 deletions lib/nif.ex
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ defmodule Duckdbex.NIF do
@spec appender(connection(), binary()) :: {:ok, appender()} | {:error, reason()}
def appender(_connection, _table_name), do: :erlang.nif_error(:not_loaded)

@spec appender(connection(), binary(), binary()) :: {:ok, appender()} | {:error, reason()}
def appender(_connection, _schema_name, _table_name), do: :erlang.nif_error(:not_loaded)

@spec appender_add_row(appender(), list()) :: :ok | {:error, reason()}
def appender_add_row(_appender, _row), do: :erlang.nif_error(:not_loaded)

Expand Down
28 changes: 28 additions & 0 deletions test/nif/appender_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -380,4 +380,32 @@ defmodule Duckdbex.Nif.AppenderTest do

assert ^result = Duckdbex.NIF.fetch_all(r)
end

test "appender schema table", %{conn: conn} do
{:ok, _} =
Duckdbex.NIF.query(conn, """
create schema schema_1;
""")

{:ok, _} =
Duckdbex.NIF.query(conn, """
CREATE TABLE schema_1.appender_test_1(
bigint BIGINT,
);
""")

assert {:ok, appender} = Duckdbex.NIF.appender(conn, "schema_1", "appender_test_1")

assert :ok =
Duckdbex.NIF.appender_add_row(appender, [
123,
])

assert :ok = Duckdbex.NIF.appender_flush(appender)

{:ok, r} = Duckdbex.NIF.query(conn, "SELECT * FROM schema_1.appender_test_1;")

assert [[123]] =
Duckdbex.NIF.fetch_all(r)
end
end

0 comments on commit 0ea8066

Please sign in to comment.