Skip to content

Commit 4b432e3

Browse files
committed
Adds exqlite_release
1 parent c4be3d6 commit 4b432e3

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

c_src/sqlite3_nif.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,34 @@ exqlite_deserialize(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
712712
return make_atom(env, "ok");
713713
}
714714

715+
static ERL_NIF_TERM
716+
exqlite_release(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
717+
{
718+
assert(env);
719+
720+
statement_t* statement = NULL;
721+
connection_t* conn = NULL;
722+
723+
if (argc != 2) {
724+
return enif_make_badarg(env);
725+
}
726+
727+
if (!enif_get_resource(env, argv[0], connection_type, (void**)&conn)) {
728+
return make_error_tuple(env, "invalid_connection");
729+
}
730+
731+
if (!enif_get_resource(env, argv[1], statement_type, (void**)&statement)) {
732+
return make_error_tuple(env, "invalid_statement");
733+
}
734+
735+
if (statement->statement) {
736+
sqlite3_finalize(statement->statement);
737+
statement->statement = NULL;
738+
}
739+
740+
return make_atom(env, "ok");
741+
}
742+
715743
static void
716744
connection_type_destructor(ErlNifEnv* env, void* arg)
717745
{
@@ -788,6 +816,7 @@ static ErlNifFunc nif_funcs[] = {
788816
{"transaction_status", 1, exqlite_transaction_status, ERL_NIF_DIRTY_JOB_IO_BOUND},
789817
{"serialize", 2, exqlite_serialize, ERL_NIF_DIRTY_JOB_IO_BOUND},
790818
{"deserialize", 3, exqlite_deserialize, ERL_NIF_DIRTY_JOB_IO_BOUND},
819+
{"release", 2, exqlite_release, ERL_NIF_DIRTY_JOB_IO_BOUND},
791820
};
792821

793822
ERL_NIF_INIT(Elixir.Exqlite.Sqlite3NIF, nif_funcs, on_load, NULL, NULL, NULL)

lib/exqlite/sqlite3.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,15 @@ defmodule Exqlite.Sqlite3 do
166166
Sqlite3NIF.deserialize(conn, String.to_charlist(database), serialized)
167167
end
168168

169+
@doc """
170+
Once finished with the prepared statement, call this to release the underlying
171+
resources.
172+
"""
173+
@spec release(db(), statement()) :: :ok | {:error, reason()}
174+
def release(conn, statement) do
175+
Sqlite3NIF.release(conn, statement)
176+
end
177+
169178
defp convert(%Date{} = val), do: Date.to_iso8601(val)
170179
defp convert(%Time{} = val), do: Time.to_iso8601(val)
171180
defp convert(%NaiveDateTime{} = val), do: NaiveDateTime.to_iso8601(val)

lib/exqlite/sqlite3_nif.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,8 @@ defmodule Exqlite.Sqlite3NIF do
5656
@spec deserialize(db(), String.Chars.t(), binary()) :: :ok | {:error, reason()}
5757
def deserialize(_conn, _database, _serialized), do: :erlang.nif_error(:not_loaded)
5858

59+
@spec release(db(), statement()) :: :ok | {:error, reason()}
60+
def release(_conn, _statement), do: :erlang.nif_error(:not_loaded)
61+
5962
# TODO: add statement inspection tooling https://sqlite.org/c3ref/expanded_sql.html
6063
end

0 commit comments

Comments
 (0)