diff --git a/c_src/esqlite3_nif.c b/c_src/esqlite3_nif.c index 029fd98..56556a4 100644 --- a/c_src/esqlite3_nif.c +++ b/c_src/esqlite3_nif.c @@ -312,8 +312,6 @@ update_callback(void *arg, int sqlite_operation_type, char const *sqlite_databas static ERL_NIF_TERM do_set_update_hook(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg) { - int rc; - if(!enif_get_local_pid(env, arg, &conn->notification_pid)) { return make_error_tuple(env, "invalid_pid"); } @@ -382,15 +380,24 @@ do_insert(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg) return make_ok_tuple(env, last_rowid_term); } +/* + * Return the last inserted rowid + */ static ERL_NIF_TERM do_last_insert_rowid(ErlNifEnv *env, esqlite_connection *conn) { + if(!conn->db) { + return make_error_tuple(env, "closed"); + } + sqlite3_int64 last_rowid = sqlite3_last_insert_rowid(conn->db); ERL_NIF_TERM last_rowid_term = enif_make_int64(env, last_rowid); + return make_ok_tuple(env, last_rowid_term); } /* + * Compile a sql statement */ static ERL_NIF_TERM do_prepare(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg) @@ -750,6 +757,8 @@ evaluate_command(esqlite_command *cmd, esqlite_connection *conn) return do_column_types(cmd->env, stmt->statement); case cmd_close: return do_close(cmd->env, conn, cmd->arg); + case cmd_last_insert_rowid: + return do_last_insert_rowid(cmd->env, conn); case cmd_insert: return do_insert(cmd->env, conn, cmd->arg); case cmd_get_autocommit: diff --git a/src/esqlite3.erl b/src/esqlite3.erl index 52b2db3..f28e7d5 100644 --- a/src/esqlite3.erl +++ b/src/esqlite3.erl @@ -402,11 +402,11 @@ last_insert_rowid(Connection) -> %% @doc Get the last insert rowid. %% --spec last_insert_rowid(connection(), timeout()) -> {ok, integer()} | {error, _}. -last_insert_rowid({connection, _Ref, Connection}, Timeout) -> +-spec last_insert_rowid(connection(), timeout()) -> {ok, rowid()} | {error, _}. +last_insert_rowid(#connection{raw_connection=RawConnection}, Timeout) -> Ref = make_ref(), - ok = esqlite3_nif:last_insert_rowid(Connection, Ref, self()), - receive_answer(Connection, Ref, Timeout). + ok = esqlite3_nif:last_insert_rowid(RawConnection, Ref, self()), + receive_answer(RawConnection, Ref, Timeout). %% @doc Get autocommit %% @doc Check if the connection is in auto-commit mode. diff --git a/src/esqlite3_nif.erl b/src/esqlite3_nif.erl index ea8ea86..5276da9 100644 --- a/src/esqlite3_nif.erl +++ b/src/esqlite3_nif.erl @@ -155,7 +155,7 @@ insert(_Db, _Ref, _Dest, _Sql) -> %% @doc Get the last insert rowid. %% -%% @spec insert(connection(), Ref::reference(), Dest::pid()) -> {ok, integer()} | {error, message()} +-spec last_insert_rowid(raw_connection(), reference(), pid()) -> ok | {error, _}. last_insert_rowid(_Db, _Ref, _Dest) -> erlang:nif_error(nif_library_not_loaded). diff --git a/test/esqlite_test.erl b/test/esqlite_test.erl index f288588..5addee7 100644 --- a/test/esqlite_test.erl +++ b/test/esqlite_test.erl @@ -11,12 +11,15 @@ open_single_database_test() -> ok. close_test() -> + %% Open and close the database immediately {ok, C} = esqlite3:open(":memory:"), ok = esqlite3:close(C), + %% Check if functions still return sensible values. {error, closed} = esqlite3:set_update_hook(self(), C), {error, closed} = esqlite3:changes(C), {error, closed} = esqlite3:get_autocommit(C), + {error, closed} = esqlite3:last_insert_rowid(C), {error, _} = esqlite3:exec("create table test(one, two, three)", C),