New trick to get 0 terminated strings from an iolist

This commit is contained in:
Maas-Maarten Zeeman
2013-02-22 08:37:20 +01:00
parent fc523c30a9
commit cfe06ddfd9
2 changed files with 8 additions and 6 deletions

View File

@@ -265,8 +265,10 @@ do_exec(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
{ {
ErlNifBinary bin; ErlNifBinary bin;
int rc; int rc;
ERL_NIF_TERM eos = enif_make_int(env, 0);
enif_inspect_iolist_as_binary(env, arg, &bin); enif_inspect_iolist_as_binary(env,
enif_make_list2(env, arg, eos), &bin);
rc = sqlite3_exec(conn->db, (char *) bin.data, NULL, NULL, NULL); rc = sqlite3_exec(conn->db, (char *) bin.data, NULL, NULL, NULL);
if(rc != SQLITE_OK) if(rc != SQLITE_OK)
@@ -285,8 +287,10 @@ do_prepare(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
ERL_NIF_TERM esqlite_stmt; ERL_NIF_TERM esqlite_stmt;
const char *tail; const char *tail;
int rc; int rc;
ERL_NIF_TERM eos = enif_make_int(env, 0);
enif_inspect_iolist_as_binary(env, arg, &bin); enif_inspect_iolist_as_binary(env,
enif_make_list2(env, arg, eos), &bin);
stmt = enif_alloc_resource(esqlite_statement_type, sizeof(esqlite_statement)); stmt = enif_alloc_resource(esqlite_statement_type, sizeof(esqlite_statement));
if(!stmt) if(!stmt)

View File

@@ -196,7 +196,7 @@ exec(Sql, Connection) ->
%% @spec exec(iolist(), connection(), timeout()) -> integer() | {error, error_message()} %% @spec exec(iolist(), connection(), timeout()) -> integer() | {error, error_message()}
exec(Sql, {connection, _Ref, Connection}, Timeout) -> exec(Sql, {connection, _Ref, Connection}, Timeout) ->
Ref = make_ref(), Ref = make_ref(),
ok = esqlite3_nif:exec(Connection, Ref, self(), add_eos(Sql)), ok = esqlite3_nif:exec(Connection, Ref, self(), Sql),
receive_answer(Ref, Timeout). receive_answer(Ref, Timeout).
%% @doc Prepare a statement %% @doc Prepare a statement
@@ -210,7 +210,7 @@ prepare(Sql, Connection) ->
%% @spec(iolist(), connection(), timeout()) -> {ok, prepared_statement()} | {error, error_message()} %% @spec(iolist(), connection(), timeout()) -> {ok, prepared_statement()} | {error, error_message()}
prepare(Sql, {connection, _Ref, Connection}, Timeout) -> prepare(Sql, {connection, _Ref, Connection}, Timeout) ->
Ref = make_ref(), Ref = make_ref(),
ok = esqlite3_nif:prepare(Connection, Ref, self(), add_eos(Sql)), ok = esqlite3_nif:prepare(Connection, Ref, self(), Sql),
receive_answer(Ref, Timeout). receive_answer(Ref, Timeout).
%% @doc Step %% @doc Step
@@ -270,8 +270,6 @@ close({connection, _Ref, Connection}, Timeout) ->
receive_answer(Ref, Timeout). receive_answer(Ref, Timeout).
%% Internal functions %% Internal functions
add_eos(IoList) ->
[IoList, 0].
receive_answer(Ref, Timeout) -> receive_answer(Ref, Timeout) ->
receive receive